我读过很多关于“解释”和“编译”的定义和陈述。但我仍然非常困惑。
从技术上讲,真正的解释和编译之间的区别是什么?让我详细说明(请纠正我可能有的任何错误概念):
在java中,源代码被“编译”成ByteCode,然后将其“解释”和/或“及时编译”成机器代码。但是,及时编译和解释之间有什么区别?我的意思是,最后,据我猜测,主机的CPU只运行机器代码。因此,在解释中,指令也被转换成可由CPU理解的机器代码。那么,我们在哪里绘制即时编译和解释之间的界限?
P.S。这是我的观念。这可能是完全错误的。在这种情况下,请原谅我的愚蠢并纠正我。
感谢。
答案 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)