汇编和解释之间的技术混淆

时间:2012-07-19 17:09:42

标签: java compilation interpretation

我读过很多关于“解释”和“编译”的定义和陈述。但我仍然非常困惑。

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

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

P.S。这是我的观念。这可能是完全错误的。在这种情况下,请原谅我的愚蠢并纠正我。

感谢。

5 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分:3)

1。坦率地说, java同时包含编译器和解释器是一个神话,它的行为被标记为编译和口译。

<强> 2。 Java编译器将人类可读代码编译为字节代码。然后在运行期间由 JIT(即时编译器)转换为机器级可执行代码。

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

4. JIT使用虚拟内存表(V-table),,它是指向类中方法的指针。 然后将热点代码转换为其机器级可执行代码,其地址存储在此处,当再次调用此部分时,则直接由此存储的地址提取Hot-Spot 解释行为This behavior of JIT to keep compiling small amount of code during Run time is assumed to be 编译

5. 虚拟内存表还有一个表,用于存储字节代码的地址,如果需要可以使用。

答案 2 :(得分:1)

你是对的,最终必须将所有内容转换为机器代码。基本区别在于,在解释器的情况下,每次代码运行时都会发生这种转换,而编译器会提前进行此转换,之后编译器不需要运行程序。

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

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

答案 3 :(得分:1)

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

编译器按块使用代码,并在编译时决定机器代码;

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

答案 4 :(得分:1)

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

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