字节码被视为JVM的指令集?

时间:2014-01-17 20:33:39

标签: java jvm bytecode processor instruction-set

我正在阅读wiki中的instruction set,我看到了这一段:

  

支持字节码作为其ISA的一些虚拟机,如   Smalltalk,Java虚拟机和Microsoft的公共语言   运行时,通过translatin常用的字节码来实现   代码路径到本机机器代码。另外,这些虚拟   机器通过解释执行不常用的代码路径   (参见:即时编译)。 Transmeta实施了x86   以这种方式在VLIW处理器上面设置指令集。

这到底是什么意思?       是bytecodes ISA JVM JVMISA支持{{1}}处理器。

3 个答案:

答案 0 :(得分:10)

是的,就像你猜到的那样。 JVM / JRE使用Java字节码作为其指令集,并且每个JVM需要在本机/本地硬件(以及本地指令集)上编译并可运行。维基百科的这个图表很好地说明了这一点:

enter image description here

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

答案 1 :(得分:3)

  

字节码是JVM的ISA

字节代码是JVMs指令。

  

和JVM反过来支持处理器的ISA。

但是真正的处理器可以完成真正的工作,因此JVM将这些转换为本机指令。首先,它是相互交错的,这很简单,但执行速度较慢,一旦代码优化(价格昂贵),代码就会作为原始本机指令快速运行。

答案 2 :(得分:2)

JVM基本上模拟了Java程序的CPU。正如CPU在硬件上本地执行已组装的操作码一样,JVM执行Java操作码,但严格地在软件中执行。

  

这到底是什么意思?字节码是JVM和JVM的ISA   反过来支持处理器的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编译器必须支持编译到设备的指令集。