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

我正在阅读维基中的 instruction set ,我看到了这段话:

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

这究竟意味着什么? bytecodes是用于JVM ISA ,而JVM又支持处理器的ISA

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

在此处输入图像描述

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

字节码是JVM的ISA

字节代码是JVMs指令。

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

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

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编译器必须支持编译到设备的指令集。