JVM是否将字节码解释为汇编语言?

5

我对JVM感到困惑。
JVM的确切作用是将字节码解释为本地代码吗?本地代码是汇编语言吗?请注意,JVM不会将字节码转换为可执行文件。


当你解释代码时,只是按照它们出现的操作执行。当你将代码翻译成机器码时,它就不再被解释了。 - Peter Lawrey
1
我不太清楚。JVM是解释器还是曾经是解释器?因为现代的JVM从.class文件中读取字节码,通过JIT将其编译成机器码。JVM是解释器还是?@PeterLawrey - M.T
2
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Peter Lawrey
感谢@PeterLawrey。 - M.T
3个回答

11

本地代码是汇编语言吗?

汇编语言是一种编写代码的方式,它将被汇编器“汇编”成机器代码,这就是写入可执行文件等内容的内容。也就是说,汇编代码是人类可读的源代码,但是在很低的层次上;机器代码是运行汇编器时的结果。(这类似于当您使用像C++这样的高级语言进行编写并通过编译器将其编译为机器码。)

JVM 将 byte code 解释成本地代码是如何实现的?

JVM可以被编写成只解释字节码的形式,但是现代JVM不会那么做;它们有内置的即时编译器 (JIT),可以将字节码即时转换为机器代码。事实上,Sun的JVM 有一个两阶段 JIT:第一阶段运行速度非常快(因此应用程序和类在运行时可以快速转换为机器代码,以避免启动延迟),另一阶段会启动,该阶段会对代码进行激进优化,并在代码中识别到"热点" (经常运行的代码) 时使用。

因此,现代JVM从.class文件中读取字节码,通过JIT编译成机器码,然后让计算机运行该机器码。在此过程中,优秀的JVM会监控“热点”进行激进优化,并创建更有效的新替代机器代码。


我来晚了五年。我在想此时此刻是不是更有益于“积极优化”(无论这意味着什么)整个代码库,而不是分两步进行? - Jason
简而言之,激进的优化可能是忽略一个加法指令,因为某个值似乎“总是”为0。这种做法是“激进”的,因为这个值在某个时刻可能会改变,即时编译器必须意识到这一点,并重新插入加法指令。 - claj

8

本地代码(或机器码)是汇编语言编译后的结果。宏被展开,然后助记符 操作码 被翻译成二进制机器码。JIT不使用宏,它直接生成机器码(无需汇编器)。


1
JVM就像汇编语言一样? - M.T
5
字节码有点像汇编语言。JIT 生成的机器码也是这样(也像汇编语言)。但它们都不是汇编器或汇编语言。 - Elliott Frisch
3
JVM输入 = 字节码(与平台无关) ,JVM输出 = 面向目标架构的二进制代码。 - Karim

0
  • JVM并不是平台无关的,而是提供了平台无关的特性给Java代码(字节码)。
  • 当编译你所写的代码后生成字节码时,由于JVM(特定于操作系统)将字节码转换为机器语言,因此可以将其带到任何操作系统上运行。
  • 因此,是的,JVM通过解释字节码将字节码(.class文件)转换为机器语言(本地代码)。

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