Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/apache-flex/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 字节码是否被视为JVM的指令集?_Java_Jvm_Bytecode_Processor_Instruction Set - Fatal编程技术网

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

Java 字节码是否被视为JVM的指令集?,java,jvm,bytecode,processor,instruction-set,Java,Jvm,Bytecode,Processor,Instruction Set,我在中阅读了有关指令集的内容,发现了以下段落: 一些支持字节码作为ISA的虚拟机,如 Smalltalk、Java虚拟机和Microsoft的公共语言 运行时,通过翻译常用的字节码来实现这一点 将代码路径转换为本机代码。此外,这些虚拟 机器通过解释执行不太常用的代码路径 (参见:即时编译)。Transmeta实现了x86 以这种方式在VLIW处理器上的指令集 这到底是什么意思? 是字节码是ISA用于JVM和JVM反过来支持处理器的ISA。是的,正如您所猜测的。JVM/JRE使用Java字节码作为

我在中阅读了有关
指令集的内容,发现了以下段落:

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

这到底是什么意思?
字节码
ISA
用于
JVM
JVM
反过来支持处理器的
ISA

是的,正如您所猜测的。JVM/JRE使用Java字节码作为其指令集,每个JVM都需要在本机/本地硬件(以及本地指令集)上编译并可运行。维基百科的这张图表很好地说明了这一点,我认为:

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

字节码是JVM的ISA

字节码是JVMs指令

JVM反过来支持处理器的ISA


但是真正的处理器做真正的工作,所以JVM将这些转换为本机指令。首先,它执行interperated,这很简单,但执行速度较慢。一旦代码得到优化(这很昂贵),代码就会像原始本机指令一样快速运行。

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 framework中使用


每个操作系统都有自己的JVM实现,这也可能因设备的ISA而异。例如,您可能有一个为Linux Arm、Linux-x86或Windows-x86编写的JVM。JVM本身可以用一种与平台无关的语言(不管怎样)编写,比如C语言,但是它的JIT编译器必须支持对设备指令集的编译。

那么说JVM在本机指令和字节码之间提供了一个抽象层是正确的吗?我想为新处理器编写JVM是很困难的,一方面与ISA达成处理器协议,另一方面与字节码达成协议@用户1988876:嗯。。。是的,你可以这么说:)也许有一个经验丰富的开发团队,情况不会那么糟。设计语言本身是很难的。@user1988876:为字节码实现解释器或JIT编译器并不难,因为您只需要翻译大约200条指令。但让它真正工作意味着实现对象模型、内存管理、线程和同步、低级I/O部分等等。这将是很多东西,当看到字节码部分是多么简单时,消耗掉最初产生的热情。对不起,事实上是不正确的。JVM在任何意义上都不会“模拟CPU”,字节码也不是模拟处理器的指令。我已经否决了这个问题,但是你应该考虑删除你的答案,因为它的立场,它是不正确的。我不会把java API放在JVM组件之下,因为大多数java API是用java实现的,并且与应用程序代码的链接是相同的。