7

我已经阅读了许多关于“解释”和“编译”的定义和陈述。但我仍然很困惑。

从技术上讲,解释和编译之间的真正区别是什么?让我详细说明(请纠正我可能有的任何错误概念):

在java中,源代码被“编译”成字节码,然后被“解释”和/或“即时编译”成机器码。但是及时编译和解释之间有什么区别?我的意思是,最后,据我猜测,主机的 CPU 将只运行机器代码。因此,在解释中,指令也被转换为 CPU 可以理解的机器代码。那么,我们在哪里划定即时编译和解释之间的界限呢?

PS这是我的想法。这可能是完全错误的。在那种情况下,请原谅我的愚蠢并纠正我。

谢谢。

4

5 回答 5

3

编译代码时,生成的工件可以直接被硬件理解。基本上它是直接发送到 CPU 的机器代码。这也意味着针对给定 CPU 架构编译的工件不会在另一个上运行。优点是立即启动和出色的性能。

解释环境中,要么根本没有编译,要么此步骤的结果是中间代码。该代码是直接发送到处理单元的两个摘要。相反,需要一个单独的层(虚拟机、解释器)来读取此工件并在某些沙盒环境中执行它。这种方法的优点是可移植性——中间代码可以在任何有本地解释器的平台上运行。不幸的是,性能几乎总是更差。

Java 中的 JIT 是一种混合技术。第一个字节码被解释,每个字节码指令由解释器执行。然而,在某个时间点(在某些条件下)字节码会被翻译成机器码并直接发送到 CPU 以提高性能。这种方法带来了两全其美 - 中间代码的可移植性和本机代码的速度。此外,JIT 对代码的运行时行为了解得更多(给定循环平均被调用多少次?这个方法真的是虚拟的吗?),所以机器代码可以比普通编译器生成的更快(! )

于 2012-07-19T17:17:23.917 回答
3

1.坦率地说,java同时具有编译器和解释器的想法是一个神话,它的行为被标记为编译器和解释器。

2. Java 编译器将人类可读的代码编译成字节码。然后在运行时由JIT(即时编译器)将其转换为机器级可执行代码。

3.在运行时 JIT 识别代码的运行时密集部分,然后将其转换为机器级可执行代码,这部分代码被称为Hot-Spot,这就是为什么JIT 被称为 Hot-Spot 编译器

4. JIT uses the Virtual Memory Table ( V-table), which is a pointer to the method in the class. The Hot-Spot code is then converted to its machine level executable code, its address is stored here, and when this part is called again, then its directly fetched by this stored address. This behavior of JIT to keep compiling small amount of code during Run time is assumed to be Interpreted Behavior, And the JIT behaviour of storing this for later use is assumed as Compilation.

5. Virtual Memory Table also has a table which stores the address of the byte code, which can be used if needed.

于 2012-07-19T17:26:56.480 回答
1

没错,最终一切都必须转换为机器代码。基本区别在于,在解释器的情况下,每次代码运行时都会发生这种翻译,而编译器会提前进行这种翻译,之后编译器就不需要运行程序了。

即时编译是两者的结合,运行程序仍需要 JIT 编译器,并且代码在运行时编译。

编译需要时间,但是当同一段代码运行多次时它是有利的,例如。在一个循环中。Java HotSpot VM 进一步采用了这种方法,最初直接解释字节码,然后在一段代码运行一定次数后对其进行 JIT 编译。

于 2012-07-19T17:16:25.320 回答
1

解释器逐行解释代码,并在运行时决定机器码;

编译器按块消费代码,并在编译时决定机器码;

JIT 编译器是一种混合方法,其中代码在运行时生成(但可能已经被缓存以提高性能),但以块的形式使用。

于 2012-07-19T17:16:49.677 回答
1

解释环境涉及在解析后立即执行的指令,其中解析和执行均由解释器完成。这意味着您运行代码的机器必须具有解释器才能运行程序。1

编译器会将指令解析为机器代码并存储它们以供以后执行。然而,Java 是字节编译的2,这意味着该过程将指令转换为字节码,然后由解释器使用。

于 2012-07-19T17:16:49.720 回答