一次编写,随处运行

本文详细阐述了计算机代码的平台无关性概念,通过实例说明了代码与平台相关与无关的区别。重点介绍了Java语言如何通过JVM实现跨平台运行,以及JDK、JRE的角色,揭示了字节码在这一过程中的关键作用。同时,对比了编译型和解释型语言的特点,指出Java编译与解释共存的特性。
摘要由CSDN通过智能技术生成

什么是平台无关性?

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

举个栗子,你在这个世界各个国家买东西,要用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是编译与解释共存的。

  • 21
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值