我正在阅读wiki中的instruction set
,我看到了这一段:
支持字节码作为其ISA的一些虚拟机,如 Smalltalk,Java虚拟机和Microsoft的公共语言 运行时,通过translatin常用的字节码来实现 代码路径到本机机器代码。另外,这些虚拟 机器通过解释执行不常用的代码路径 (参见:即时编译)。 Transmeta实施了x86 以这种方式在VLIW处理器上面设置指令集。
这到底是什么意思?
是bytecodes
ISA
JVM
JVM
和ISA
支持{{1}}处理器。
答案 0 :(得分:10)
是的,就像你猜到的那样。 JVM / JRE使用Java字节码作为其指令集,并且每个JVM需要在本机/本地硬件(以及本地指令集)上编译并可运行。维基百科的这个图表很好地说明了这一点:
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编译器必须支持编译到设备的指令集。