平台无关性和语言无关性的记录

news2025/1/21 18:58:56

目录

背景

平台无关性

语言无关性


背景

        最近在学习Java虚拟机(JVM: Java Virtual Machine),在学习过程中,再一次学习了JVM的平台无关性这一特性,此外也了解到了虚拟机的另外一种中立特性 --- 语言无关性,下面进行简单介绍:

平台无关性

        我们都知道Java语言一直以“一次编写,到处运行(Write Once, Run Anywhere)”著称,那么为什么Java语言可以有这样的特性呢?我们来聊一聊。

        任何语言(包括高级语言和低级语言)想要被计算机执行,都必须被最终转换成计算机可以识别的二进制格式(即:把我们编写的程序编译成二进制本地机器码 Native Code),即计算机只认识的0和1。

        假如没有JVM,我们来看看Java程序如何在计算机上运行起来:

        设想这样一个场景,小明在Windows电脑上使用Java编写了一个程序,然后使用Java语言的编译器直接把Java源代码编译成Windows操作系统和其对应的硬件平台上的二进制本地机器码(Native Code),然后Windows电脑就可以运行我们写的程序了。如下图:

        这时小明又装了一个linux系统,他想把上面编译好的二进制字节码放到Linux系统中运行,如下图:

         那么只能针对Linux系统,再开发一个针对Linux系统上的Java语言编译器,把Java源码编译成Linux硬件平台可以识别并执行的二进制字节码指令,如下图:

        那么问题来了,如果再有另一个操作系统呢,还需要再针对这个操作系统再开发一个编译器?那么我们为什么不这样呢?如下图:

         上图说明了一件事,Java语言是平台无关性的语言,而这个平台无关性是由不同平台对应的Java虚拟机,即JVM来支撑的。换句话说,Java虽然是平台无关的,但是虚拟机(JVM)却是平台相关的,即不同操作系统需要对应不同的JVM。如下图是Oracle官网提供的不同操作系统对应的JDK,JDK里面包含了JVM:

        下面在总结下Java的平台无关性是怎么实现的。

        已经知道在计算机中真正执行的是由0和1组成的二进制文件。而我们通常开发使用的C,C++和Java等都是高级语言,如果要让计算机识别Java代码,就需要把Java开发的源程序“翻译”成二进制机器码,这个"翻译"的过程称为编译。执行编译这一过程的工具叫编译器。在Java中,要把Java代码编译成二进制字节码,需要经过两个步骤:(1)前端编译和后端编译。

        前端编译主要指和源语言有关但和目标机器无关的部分,比如我们熟悉的javac,以及Eclipse,Idea等IDE中内置的前端编译器,都是为了把xxx.java源码编译成.class字节码。

        后端编译就是将中间代码翻译成机器码,在Java中,这一步是通过JVM实现的。所以,虽然Java是平台无关的,但是虚拟机却是平台相关的,不同操心系统需要对应不同的JVM。 

语言无关性

        Java虚拟机除了具有平台无关性的特性外,还有另外一种中立特性:语言无关性。在Java技术发展之初,设计者们就曾经考虑过并实现了让其他语言运行在Java虚拟机之上的可能性,他们在发布规范文档的时候,也刻意把Java的规范拆分成了《Java语言规范》(The Java Language Specification)及《Java虚拟机规范》(The Java Virtual Machine Specification)两部分。如今,商业企业和开源机构已经在Java语言之外发展出一大批运行在Java虚拟机之上的语言,如Kotlin, Clojure, Groovy, JRuby, JPython, Scala等。

        实现语言无关性的基础仍然是虚拟机和字节码存储格式。Java虚拟机不与包括Java语言在内的任何程序语言绑定,它只与“Class 文件” 这种特定的二进制文件格式所关联,Class文件种包含了Java虚拟机指令集、符号表以及若干其它辅助信息。 

        基于安全方面的考虑,《Java虚拟机规范》种要求在Class文件必须应用许多强制性的语法和结构化约束,但图灵完备的字节码格式,保证了任意一门功能性语言都可以表示为一个能被Java虚拟机所接受的有效的Class文件。作为一个通用的、与机器无关的执行平台。任何其它语言的实现者都可以将Java虚拟机作为他们语言的运行基础,以Class文件作为他们产品的交付媒介。例如使用Java编译器可以把Java代码编译为存储字节码的Class文件,使用JRuby等其它语言的编译器一样也可以把他们的源程序代码编译成class文件。虚拟机丝毫不关心Class的来源是什么语言,它与程序之间的关系如下图:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1344406.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

挂载与解挂载

一. 挂载 1.什么是挂载 将系统中的文件夹和磁盘做上关联,使用文件夹等于使用磁盘 2.mount 2.1 格式 mount [ -t 类型 ] 存储设备 挂载点目录 mount -o loop ISO镜像文件 挂载点目录 注意:指明要挂载的设备 设备文件:例如:/dev/sda5 卷…

leetcode链表小练(1.反转链表2.链表的中间节点3.合并两个有序链表4.环形链表①5.环形链表②)详解 (୨୧• ᴗ •͈)◞︎ᶫᵒᵛᵉ ♡

目录 一.反转链表 思路一反转指针反向: 思路二头插法: 二.链表的中间节点: 三.合并两个有序数组: 思路一:从头开始,取两个链表中小的那个尾插到新链表。定义指针head,tail指向空,代表新链表的头结点。…

软件开发生命周期的四种模型

1、大爆炸模型 大爆炸模型计划、进度安排和正规开发过程几乎没有,所有精力都花在开发软件和编写代码上。假如产品需求无须很好理解,而且最终发布日期可以随便更改,这样的开发过程当然很理想。此外,还要有聪慧过人的客户&#xff0…

专业PDF编辑和管理软件Acrobat Pro DC mac功能特点

Acrobat Pro DC mac是一款专业级PDF编辑和管理软件。作为PDF行业的标准工具,它提供了广泛的功能和工具,适用于个人用户、企业和专业人士。 Acrobat Pro DC具备丰富的编辑功能,可以对PDF文件进行文本编辑、图像编辑和页面重排等操作。用户可以…

统信UOS及麒麟KYLINOS操作系统上设置GRUB密码

原文链接:给单用户模式上一层保险!!! hello,大家好啊!今天我要给大家介绍的是在统信UOS及麒麟KYLINOS操作系统上设置GRUB密码的方法。GRUB(GRand Unified Bootloader)是Linux系统中的…

【C语言】一篇文章深入解析联合体和枚举且和结构体的区别

文章目录 📝前言🌠 联合体类型的声明🌉联合体的特点 🌠相同成员的结构体和联合体对⽐🌉联合体⼤⼩的计算 🌠联合体应用🌉枚举类型的声明 🌠枚举类型的优点🌉 枚举类型的使…

4.29 构建onnx结构模型-TopK

前言 构建onnx方式通常有两种: 1、通过代码转换成onnx结构,比如pytorch —> onnx 2、通过onnx 自定义结点,图,生成onnx结构 本文主要是简单学习和使用两种不同onnx结构, 下面以 TopK 结点进行分析 方式 方法一&a…

javaWeb学生信息管理系统2

一、学生信息管理系统SIMS 一款基于纯Servlet技术开发的学生信息管理系统(SIMS),在设计中没有采用SpringMVC和Spring Boot等框架。系统完全依赖于Servlet来处理HTTP请求和管理学生信息,实现了信息的有效存储、检索和更新&#xf…

【洛谷学习自留】p7621 超市购物

2023/12/29 解题思路: 简单的计算,难度主要集中在格式化输出和四舍五入的问题上。 1.建立一个计数器,for循环遍历单价和数量的乘积,存入计数器。 2.计算计数器的最终值乘以0.85h后的结果,为了保证四舍五入正确&…

三菱人机交互GT Designer的使用(二,开关,指示灯,数值显示,数值输入)

今天也开始每日一学,内容为开关,指示灯,数值显示,数值输入,以为这篇文章比较长,所有小编决分为3篇内容写完,谢谢大家阅读,不足之处,欢迎指正。 目录 开关 位&#xff0c…

Java guava partition方法拆分集合自定义集合拆分方法

日常开发中&#xff0c;经常遇到拆分集合处理的场景&#xff0c;现在记录2中拆分集合的方法。 1. 使用Guava包提供的集合操作工具栏 Lists.partition()方法拆分 首先&#xff0c;引入maven依赖 <dependency><groupId>com.google.guava</groupId><artifa…

【HTML5】第1章 HTML5入门

学习目标 了解网页基本概念&#xff0c;能够说出网页的构成以及网页相关名词的含义 熟悉Web标准&#xff0c;能够归纳Web标准的构成。 了解浏览器&#xff0c;能够说出各主流浏览器的特点。 了解HTML5技术&#xff0c;能够知道HTML5发展历程、优势以及浏览器对HTML5的支持情…

Linux 内存数据 Metrics 指标解读

过去从未仔细了解过使用 free、top 等命令时显式的内存信息&#xff0c;只关注了已用内存 / 可用内存。本文我们详解解读和标注一下各个数据项的含义&#xff0c;同时和 Ganglia 显式的数据做一个映射。开始前介绍一个小知识&#xff0c;很多查看内存的命令行工具都是 cat /pro…

K-means 聚类算法分析

算法简述 K-means 算法原理 我们假定给定数据样本 X &#xff0c;包含了 n 个对象 &#xff0c;其中每一个对象都具有 m 个维度的属性。而 K-means 算法的目标就是将 n 个对象依据对象间的相似性聚集到指定的 k 个类簇中&#xff0c;每个对象属于且仅属于一个其到类簇中心距离…

微信小程序开发系列-03全局配置中的“window”和“tabBar”

微信小程序开发系列目录 《微信小程序开发系列-01创建一个最小的小程序项目》《微信小程序开发系列-02注册小程序》《微信小程序开发系列-03全局配置中的“window”和“tabBar”》《微信小程序开发系列-04获取用户图像和昵称》《微信小程序开发系列-05登录小程序》《微信小程序…

城市分站优化系统源码:提升百度关键排名 附带完整的搭建教程

城市分站优化已成为企业网络营销的重要手段&#xff0c;今天来给大家分享一款城市分站优化系统源码。 以下是部分代码示例&#xff1a; 系统特色功能一览&#xff1a; 1.多城市分站管理&#xff1a;该系统支持多个城市分站的管理&#xff0c;用户可以根据业务需求&#xff0c;…

PM大逃亡

欢迎来到程序小院 PM大逃亡 玩法&#xff1a;点击白色的小鬼&#xff0c;滑动鼠标移动&#xff0c;不要碰到黑色的怪物&#xff0c; 怪物会越来越多&#xff0c;看看你能坚持多久&#xff0c;快去大逃亡吧^^。开始游戏https://www.ormcc.com/play/gameStart/233 html <div…

《分布式事务理论基础:CAP定理 BASE理论》

目录 学习目标 1.分布式事务理论基础 1.1.本地事务 1.2.分布式事务 分布式事务产生的原因&#xff1f; 哪些场景会产生分布式事务&#xff1f; 单体系统会产生分布式事务问题吗&#xff1f; 只有一个库&#xff0c;会产生分布式事务问题吗&#xff1f; 分布式事务举…

文本的剪切和复制有区别吗?有什么区别

在电脑操作中&#xff0c;文本的剪切与复制是我们经常进行的操作。尽管它们看起来都是对文本的“复制”行为&#xff0c;但两者在使用和功能上存在明显的差异。本文将详细介绍剪切与复制的区别&#xff0c;以帮助您更好地理解它们的适用场景和作用&#xff0c;并介绍剪切后如何…

vue3引入百度地图(两种方法)

首先要有百度开放平台并进行注册&#xff0c;不懂看这里 ### 第一种方法 地图引入流程 安装vue-baidu-map-3x插件 参考官网地址&#xff1a;快速上手 | vue-baidu-map-3x npm install vue-baidu-map-3x --save 在public/index.html文件中引入 <!-- 百度地图 --> &…