JVM将字节码视为指令集吗?

3
我正在阅读维基百科中的有关指令集的内容,我遇到了这段话:

一些支持字节码作为它们的ISA的虚拟机,例如Smalltalk、Java虚拟机和微软的公共语言运行时,通过将常用代码路径的字节码转换为本地机器代码来实现此目的。此外,这些虚拟机通过解释执行不太常用的代码路径(参见:即时编译)。Transmeta以这种方式在VLIW处理器上实现了x86指令集。

这到底是什么意思?bytecodesJVMISA,而JVM反过来支持处理器的ISA吗?
3个回答

11

是的,就像你猜测的那样。JVM/JRE使用Java字节码作为其指令集,并且每个JVM都需要在本地硬件上编译并可运行(因此需要本地指令集)。我认为维基百科上的这个图解说明得很好:

图片描述

JRE/JVM需要针对特定的硬件进行编译,尽管Java字节码的定义和JVM本身的解释保持不变。正如你所指出的,Java字节码可以被看作是Java源代码和本地机器/二进制代码之间的一种抽象层。它确实允许典型的Java程序员与需要了解任何特定于机器的内容分离开来,因为几乎所有这些内容都由JVM/JRE处理。


我不会将“Java API”放在JVM组件之下,因为大多数Java API都是用Java实现的,并且通过与应用程序代码相同的链路进行传递。 - Holger

3

字节码是JVM的指令集。

JVM支持处理器的ISA。

但真正的处理器才能执行实际工作,所以JVM将它们转换为本地指令。首先它进行解释执行,这很简单但执行速度较慢,一旦代码被优化(代价高昂),代码就像原始本地指令一样快速运行。


2
JVM 是否提供了在本机指令和字节码之间的一层抽象呢? - brain storm

3
JVM基本上模拟了Java程序的CPU。就像CPU在硬件上原生地执行组合的操作码一样,JVM在软件中严格执行Java操作码。
这到底是什么意思?字节码是JVM的ISA,而JVM反过来又支持处理器的ISA吗?
ISA(指令集架构)规定编写直接在CPU上运行的低级软件所适用的全部规则和技巧。它包括一组操作码,这些操作码是不可分解的CPU直接命令。 JVM识别其自己的一组字节码(即8位操作码),该字节码指示JVM执行解释器基元指令。因此,字节码规范构成了JVM ISA的一部分。
JVM通过遍历操作码列表,逐个执行它们,使用自己的内存来模拟硬件组件(例如堆栈、寄存器、主存储器),并使用基本算术和逻辑操作来模拟ALU。这些模拟的组件也构成了JVM的ISA。这是任何解释器的基本结构,或多或少。然而,为了提高Java应用程序的运行时性能,JVM将“热点”编译为机器特定代码以获得最佳性能。热点是经常运行的代码部分。这被称为“即时编译”,可以在程序执行时完成。这种技术使Java的性能更接近于编译语言。JIT也用于.NET框架。
每个操作系统都有自己的JVM实现,该实现也可能因设备的ISA而异。例如,您可以拥有适用于Linux-Arm、Linux-x86或Windows-x86的JVM。 JVM本身可能是用像C这样的平台无关(基本上是)语言编写的,但其JIT编译器必须支持编译到设备的指令集。

我猜编写适用于新处理器的JVM会很困难,因为需要同时处理处理器的ISA和字节码! - brain storm
@user1988876:嗯...你可以这么说 :) 或许有一支精良的开发团队,情况就不会那么糟糕了。设计语言本身才是最难的部分。 - blackcompe
1
@user1988876:实现字节码的解释器或JIT编译器并不难,因为你只需要翻译大约200条指令。但是,使其真正起作用意味着要实现对象模型、内存管理、线程和同步、低级I/O部分以及其他一些内容。这将会变成很多东西,消耗最初看到字节码部分如此简单时所产生的热情。 - Holger
抱歉,事实不正确。JVM在任何意义上都不是“模拟CPU”,字节码也不是虚构处理器的指令。我已经给你的回答投了反对票,但你应该考虑删除它,因为就目前而言,它根本不正确。 - kittylyst

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接