Java';s编译器和解释器(JVM)

Java';s编译器和解释器(JVM),java,Java,为什么java使用编译器将源代码转换为字节码,使用解释器将字节码转换为机器码,而不是相反?在谷歌上找不到任何相关的答案 编辑:对不起,我是java的初学者。换句话说,我的意思是,为什么java不使用解释器将源代码转换成字节码。谢谢你的回答 Java语言被设计成跨平台的,这意味着单个Java程序二进制应该能够在任何处理器和任何操作系统上运行 机器代码是特定于每个处理器体系结构的,因此为了避免重新编译代码,Java程序永远不会转换为真正的机器代码 相反,Java被编译成字节码,由虚拟机运行。 这个虚

为什么java使用编译器将源代码转换为字节码,使用解释器将字节码转换为机器码,而不是相反?在谷歌上找不到任何相关的答案


编辑:对不起,我是java的初学者。换句话说,我的意思是,为什么java不使用解释器将源代码转换成字节码。谢谢你的回答

Java语言被设计成跨平台的,这意味着单个Java程序二进制应该能够在任何处理器和任何操作系统上运行

机器代码是特定于每个处理器体系结构的,因此为了避免重新编译代码,Java程序永远不会转换为真正的机器代码

相反,Java被编译成字节码,由虚拟机运行。 这个虚拟机是为不同的操作系统和CPU类型创建的,有很多版本,它将最终用户程序与该操作系统和CPU完全隔离

因此,如果您编写一个纯Java程序并生成一个jar文件,它将运行在带有Windows的x86 PC和带有Linux的ARM风格SBC(如Raspberry PI)上,就像您安装了JVM一样


如果您的Java源代码被编译为物理CPU的实际机器代码,那么这将不起作用。

Java字节码被设计为独立于平台,这意味着您可以获取.class文件并在Linux、Windows、Mac或支持Java的任何其他平台上运行它。当Java被构思出来时,它被宣传为一个主要特性,可以消除将软件移植到不同系统的巨大障碍

在运行时,字节码被优化以尽可能快地运行,这是通过“实时编译器”(JIT)完成的。简而言之,虚拟机在代码中找到热点,并用特定于CPU的指令替换它们,以避免解释它们的开销。这完全是自动发生的,用户看不见(速度除外)


之所以如此,很简单,因为Java就是这样设计的。它也可以用不同的方式设计,但这不是Java。

你所谓的“解释器”的正式名称是“Java虚拟机”。这也解释了为什么它不是另一个循环。究竟“另一个循环”是什么?“解释器将字节码转换为机器码”,这是可选的性能提升,可能不会发生,例如,如果您使用
-Djava.compiler=NONE
,即使没有它,也可能不会立即发生,取决于您使用的JVM。纯解释器评估字节码,即它直接执行字节码,而不将其转换为机器码。