一次编写,随处运行-程序员宅基地

技术标签: jvm  java  

什么是平台无关性?

靓仔靓女们,相信大家从名字就可以大概知道平台无关性是什么意思了吧,也就是与平台没有关系,那么在计算机代码的角度就是说,我可以不用看平台的脸色就可以直接运行了。那取这个名字,肯定是在这之前代码是与平台相关的,要经过平台的允许或者说平台它认识你才可以运行。

举个栗子,你在这个世界各个国家买东西,要用money吧,但是你拿津巴布韦币去中国买烤肠,那中国的老板肯定不认识阿,肯定是催你拿人民币才可以阿,这就是平台相关。好了,这个时候,为了贸易方便,各个国家都是承认美元的,因此你可以拿着美元去欧洲买白人饭,这个时候的老板是会很热情地迎接你的,这个就是平台无关性了。当然说不定不久后软妹币也是可以平台无关的买东西的。

那在计算机的世界里,计算机都认识0与1,由于0与1是太基础了,就出现了低级语言,即机器语言和汇编语言,与平台相不相关是因为每一个机器处理器(cpu)能理解的指令集不一样,即可能A机器它运行某个汇编语言指令是有上万次的,如果将它移植到B机器,但是B机器不认识这个指令,也就是B机器的cpu的指令集是没有这个指令,这样移植过去就会导致上万个错误,都要改成B机器的,这样就会导致大量的工作,这个就是平台的相关性,也就是我们经常说的指令不兼容。

后来大佬们发现了这个问题就要解决,这个问题就是因为系统平台的指令集各不一样问题导致的代码移植成本高,就是你这个代码只能自己用不能发展到全世界去,因此为了统一计算机世界,大佬们想到了虚拟机机制,就是在后面发展的高级语言中如C++、java和机器语言中间加一个中间层即虚拟机。

比如java,java的源代码通过javac编译器编译了以后,生成了一种叫bytecode的字节码,这样的代码也是一种二进制代码,人是看不容易看明白的。但是这样的代码也不是机器代码,不能直接运行。java体系中的中间层java虚拟机才能看明白这样的代码,然后java虚拟机再负责将bytecode转换为机器可执行代码。其实和我们的美元是一样的,比如俄罗斯与非洲国家合作交易,但是两个国家之间都不承认各自的货币,这个时候,来了一个中间层即美元,大家都是承认美元的,因此俄罗斯可以先把卢布换成美元,再把美元交易,非洲国家就可以拿着美元变成自己的货币。这个过程中,我们可以为高级语言如Java设定一个统一的标准,让卢布变美元,至于中间层虚拟机如何转变成机器理解的机器语言的,那就是硬件平台开发商与虚拟机开发商商量的了,即美元变非洲国家货币。

为什么要平台无关性?

其实这个在上面说过了,随着计算机世界的发展,大家肯定是想着发展到全世界去阿。而由于前期计算机的发展,每个计算机硬件开发商发明的机器处理器不一样,每种处理器都有自己的一套指令集,这就导致你用某一种处理器发明的东西,其它处理器的使用者的用不了的,如A机器的处理器的某个指令集出现了上万次,而B机器是不支持这个指令的,就导致移植性很差,B用不了A的,这个就是平台相关性,或者是指令的不兼容。

那为了A机器发明的东西B机器可以用得上,我们就增加了一个虚拟机中间层,这样就可以不用管A机器与B机器的指令集一不一样了,就可以使得代码的移植性高,互相运行代码了,这就是平台的无关性。

Java是怎么实现平台无关性的?

我们从上面知道,要实现平台无关,需要中间有一个中间人,即虚拟机——

JVM

JVM就是Java的虚拟机,主要运行Java字节码,即JVM会将高级语言都转变成.class字节码文件,这个是JVM对高级语言的规范,然后针对于不同的系统如Windows、Linux、MacOs等,JVM就会根据.class字节码变成各个系统的指令语言,这样就可以在不同的系统上运行了,也就是说字节码是每个系统的共识,如果有JVM就可以实现“一次编译,到处运行”。

借图:

看这个图就可以知道不管你什么程序代码,有JVM中间层虚拟机在,对于高级语言统一认识.class字节码,而对于不同的系统JVM也是可以统一的。

当然,JVM不是说只有一种,只要你符合规范,你也是可以开发一个的,就是要兼容认识.class字节码,还有与各系统的规范。

当然高级语言变成.class这个过程不是由JVM做的,JVM只是一个单纯的中间人,只是简单的拉你们互相认识。

JDK与JRE

高级代码不只是只有Java一种,和系统一样,也是各种各样的,如C、C++、go等,这个就是各个高级语言由各个高级语言的开发商去统一标准了,对于Java就是由JDK去做这个工作的,让我们的Java语言代码可以变成.class字节码文件。

JDK拥有创建和编译Java程序的开发套件,包含了 JRE,同时还包含了编译 java 源码的编译器 javac 以及一些其他工具比如 javadoc(文档注释工具)、jdb(调试器)、jconsole(基于 JMX 的可视化监控⼯具)、javap(反编译工具)等等。JRE(Java Runtime Environment) 是 Java 运行时环境。它是运行已编译 Java 程序所需的所有内容的集合,主要包括 Java 虚拟机(JVM)、Java 基础类库(Class Library)。也就是说JDK是用于开发和调试Java程序的,即Java的编程工作,如果要运行Java程序的话,也是要用到JDK的JRE的。

什么是字节码?

其实从什么对JDK、JRE与JVM的认识就可以知道,字节码就是JVM认识的代码,可以让JVM转变为各个系统的代码,这个字节码是由JDK编译和解释Java程序转变的,并不是JVM做翻译的(JVM只是作高级语言与各系统平台的一个中间人,介绍互相认识),也就是为了做好“交易”,JDK将Java程序打扮成.class字节码,然后JVM就带着.class字节码解释给平台听,让平台认识,即字节码是只面对虚拟机的。

Java 程序从源代码到运行的过程如下图所示:(借图)

当然对于.class字节码文件解释介绍给平台认识的过程中即.class->机器码这一步,本来就是解释清楚就可以了,但是由于.class字节码可能信息比较多,一句一句说时间就比较长,平台当然会内心“万马奔腾”,而且很多信息是重复的(热点数据),一句一句说就显得“啰嗦”,因此后面引进了JIT(Just in Time Compilation) 编译器(编译器是运行效率高),而JIT是运行时编译,当 JIT 编译器完成第一次编译后,其会将字节码对应的机器码保存下来,下次可以直接使用,即将.class字节码的信息总结好,在与系统平台解释的时候就可以不罗嗦。所以,Java是编译与运行共存的。

Java编译与解释共存

编译型:编译型语言open in new window 会通过编译器open in new window将源代码一次性翻译成可被该平台执行的机器码。一般情况下,编译语言的执行速度比较快,开发效率比较低。常见的编译性语言有 C、C++、Go、Rust 等等。

解释型:解释型语言open in new window会通过解释器open in new window一句一句的将代码解释(interpret)为机器代码后再执行。解释型语言开发效率比较快,执行速度比较慢。常见的解释性语言有 Python、JavaScript、PHP 等等。

而在Java程序的编写调试与运行的过程中,是首先将Java程序编译成.class字节码,然后再由JVM解释给系统平台看。因此,Java是编译与解释共存的。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_57473640/article/details/136712796

智能推荐

适合入门的8个趣味机器学习项目-程序员宅基地

文章浏览阅读86次。首发地址:https://yq.aliyun.com/articles/221708谈到机器学习,相信很多除学者都是通过斯坦福大学吴恩达老师的公开课《Machine Learning》开始具体的接触机器学习这个领域,但是学完之后又不知道自己的掌握情况,缺少一些实际的项目操作。对于机器学习的相关竞赛挑战,有些项目的门槛有些高,参加后难以具体的实现,因此造..._scrath五子棋下载

oracle 12c avg,Oracle 12c新特性系列专题-安徽Oracle授权认证中心-程序员宅基地

文章浏览阅读83次。原标题:Oracle 12c新特性系列专题-安徽Oracle授权认证中心 随着Oracle database 12c的普及,数据库管理员 (DBA) 的角色也随之发生了转变。 Oracle 12c数据库对 DBA 而言是下一代数据管理。它让 DBA 可以摆脱单调的日常管理任务,能够专注于如何从数据中获取更多价值。未来我们会推出基于Oracle12c的技术文章,帮助DBA尽快掌握新一代数据库的新特性..._ilm add policy row store compress advanced row after

第七周项目三(负数把正数赶出队列)-程序员宅基地

文章浏览阅读150次。问题及代码:*Copyright(c)2016,烟台大学计算机与控制工程学院 *All right reserved. *文件名称:负数把正数赶出队列.cpp *作者:张冰 *完成日期;2016年10月09日 *版本号;v1.0 * *问题描述: 设从键盘输入一整数序列a1,a2,…an,试编程实现: 当ai>0时,ai进队,当ai<0时,将队首元素出队,当ai

Linux命名空间学习教程(二) IPC-程序员宅基地

文章浏览阅读150次。本文讲的是Linux命名空间学习教程(二) IPC,【编者的话】Docker核心解决的问题是利用LXC来实现类似VM的功能,从而利用更加节省的硬件资源提供给用户更多的计算资源。而 LXC所实现的隔离性主要是来自内核的命名空间, 其中pid、net、ipc、mnt、uts 等命名空间将容器的进程、网络、消息、文件系统和hostname 隔离开。本文是Li..._主机的 ipc 命名空间

adb强制安装apk_adb绕过安装程序强制安装app-程序员宅基地

文章浏览阅读2w次,点赞5次,收藏7次。在设备上强制安装apk。在app已有的情况下使用-r参数在app版本低于现有版本使用-d参数命令adb install -r -d xxx.apk_adb绕过安装程序强制安装app

随便推点

STM32F407 越界问题定位_stm32flash地址越界怎么解决-程序员宅基地

文章浏览阅读290次。如果是越界进入硬件错误中断,MSP 或者 PSP 保存错误地址,跳转前会保存上一次执行的地址,lr 寄存器会保存子函数的地址,所以如果在 HardFault_CallBack 中直接调用 C 语言函数接口会间接修改了 lr,为了解决这个问题,直接绕过 lr 的 C 语言代码,用汇编语言提取 lr 寄存器再决定后面的操作。由于 STM32 加入了 FreeRTOS 操作系统,可能导致无法准确定位,仅供参考(日常编程需要考虑程序的健壮性,特别是对数组的访问,非常容易出现越界的情况)。_stm32flash地址越界怎么解决

利用SQL注入上传木马拿webshell-程序员宅基地

文章浏览阅读1.8k次。学到了一种操作,说实话,我从来没想过还能这样正常情况下,为了管理方便,许多管理员都会开放MySQL数据库的secure_file_priv,这时就可以导入或者导出数据当我如图输入时,就会在D盘创建一个名为123456.php,内容为<?php phpinfo();?>的文件我们可以利用这一点运用到SQL注入中,从拿下数据库到拿下目标的服务器比如我们在使用联合查询注入,正常是这样的语句http://xxx?id=-1 union select 1,'你想知道的字段的内容或查询语句',

Html CSS的三种链接方式_html链接css代码-程序员宅基地

文章浏览阅读2.9w次,点赞12次,收藏63次。感谢原文:https://blog.csdn.net/abc5382334/article/details/24260817感谢原文:https://blog.csdn.net/jiaqingge/article/details/52564348Html CSS的三种链接方式css文本的链接方式有三种:分别是内联定义、链入内部css、和链入外部css1.代码为:<html>..._html链接css代码

玩游戏哪款蓝牙耳机好?2021十大高音质游戏蓝牙耳机排名_适合游戏与运动的高音质蓝牙耳机-程序员宅基地

文章浏览阅读625次。近几年,蓝牙耳机市场发展迅速,越来越多的消费者希望抛弃线缆,更自由地听音乐,对于运动人士来说,蓝牙耳机的便携性显得尤为重要。但目前市面上的大多数蓝牙耳机实际上都是“有线”的,运动过程中产生的听诊器效应会严重影响听歌的感受。而在“真无线”耳机领域,除了苹果的AirPods外,可供选择的产品并不多,而AirPods又不是为运动场景打造的,防水能力非常差。那么对于喜欢运动又想要“自由”的朋友来说,有没有一款产品能够满足他们的需求呢?下面这十款小编专门为大家搜罗的蓝牙耳机或许就能找到适合的!网红击音F1_适合游戏与运动的高音质蓝牙耳机

iOS 17 测试版中 SwiftUI 视图首次显示时状态的改变导致动画“副作用”的解决方法-程序员宅基地

文章浏览阅读1k次,点赞6次,收藏7次。在本篇博文中,我们在 iOS 17 beta 4(SwiftUI 5.0)测试版中发现了 SwiftUI 视图首次显示时状态的改变会导致动画“副作用”的问题,并提出多种解决方案。

Flutter 自定义 轮播图的实现_flutter pageview轮播图 site:csdn.net-程序员宅基地

文章浏览阅读1.9k次。  在 上篇文章–Flutter 实现支持上拉加载和下拉刷新的 ListView 中,我们最终实现的效果是在 listView 上面留下了一段空白,本意是用来加载轮播图的,于是今天就开发了一下,希望能给各位灵感。一 、效果如下说一下大体思路   其实图片展示是用的 PageView ,然后,下面的指示器 是用的 TabPageSelector ,当然整体是用 Stack 包裹起来的。1、..._flutter pageview轮播图 site:csdn.net