Java字节码解释器

3
我知道Java程序首先被编译并生成字节码,这种字节码是平台无关的。但是我的问题是为什么在下一阶段解释这种字节码而不是编译,即使在一般情况下编译比解释更快?

你可以考虑为某个未知处理器编写bytecode汇编程序。然后通过解释和(大量)针对底层硬件生成的优化代码来模拟处理器。这样就可以运行在bytecode上的程序了。 - bestsss
@isha - 你可能会对Cliff Click在A JVM Does That中关于JIT编译的部分感兴趣。 - McDowell
@McDowell,我认为这是一款不错的观看材料,尽管对于普通公众来说可能有点过于高级。 - bestsss
5个回答

3

你回答了自己的问题。字节码是与平台无关的。如果编译后的代码被执行,它将不能在每个操作系统上工作。这就是C语言所做的,这也是为什么您必须为每个操作系统拥有一个版本的原因。

正如其他人建议的那样,JVM实际上使用JIT编译代码。只是没有保存在任何地方。以下是一个简洁的引用来总结:

在一个字节码编译系统中,源代码被翻译成一个称为字节码的中间表示形式。字节码不是任何特定计算机的机器代码,并且可以在计算机体系结构之间移植。然后,这些字节码可以由虚拟机解释或运行。JIT编译器会分多个部分(或者很少完全)读取字节码,并将其交互式编译成机器语言,以便程序可以更快速地运行。


实际上,一些JVM确实会编译字节码以供执行;只是这些编译结果不会被存储在任何地方:JIT(即时编译)。 - SJuan76
好观点!我原本以为JIT只编译那些被频繁执行的代码行。也许它编译的范围更广。 - Amir Raminfar
据我所知,这取决于虚拟机的实现。例如,Sun的VM在“服务器”模式下同时结合了解释和JIT。不知道其他JVM的工作方式,但是我只想指出,即使Java坚持采用字节码和VM的优势,编译代码的想法也并没有被忽视。 - SJuan76
谢谢大家!!讨论让我清楚了编译过程和JIT。 - isha

2
Java字节码通常通过即时编译(JIT)编译进行编译。
因此,你最终会得到完全编译的本地代码被执行,唯一的区别是这个本地代码是由JVM在运行时生成的,而不是在源代码编译时静态生成的(就像C/C++会发生的情况一样)。
这给Java带来了两个重要的优势:
  • 延迟编译直到运行时,字节码保持在平台之间的完全可移植性
  • 在某些情况下,JIT编译器实际上可以生成更优化的本机代码,因为它能够利用在运行时检查代码执行路径时收集的统计数据。
当然,缺点是JIT编译器需要在应用程序启动时进行工作,这就解释了为什么JVM应用程序启动时间相对于本地编译的应用程序略长。

1

你问题的基本前提是不正确的。大多数现代Java虚拟机会将代码中频繁执行的部分编译成本地机器代码。

这被称为即时编译,或简称JIT。

有关Sun(现在是Oracle)相关技术的相当不错的介绍可以在这里找到。


0

0

字节码是平台无关的。一旦编译成字节码,它就可以在任何系统上运行。

正如维基百科所说,

即时编译(JIT),也被称为动态翻译,是一种提高计算机程序运行时性能的方法。

我建议您阅读这篇文章。它为Java虚拟机提供了JIT编译器的基本工作原理

JIT编译器通过直接将Java字节码编译成本地平台代码来稍微改变VM的角色,从而使得VM无需手动调用底层本地系统服务。然而,JIT编译器的目的并不是让VM放松。通过将字节码编译为本机代码,执行速度可以大大提高,因为本机代码可以直接在底层平台上执行。
当安装了JIT编译器后,VM不再调用底层本地操作系统,而是调用JIT编译器。 JIT编译器反过来生成本机代码,可以传递给本地操作系统进行执行。这种安排的主要好处是JIT编译器对除VM以外的所有内容完全透明。

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