编译和解释之间的技术混淆
Posted
技术标签:
【中文标题】编译和解释之间的技术混淆【英文标题】:Technial confusion between compilation and interpretation 【发布时间】:2012-07-18 22:29:45 【问题描述】:我已经阅读了许多关于“解释”和“编译”的定义和陈述。但我还是很困惑。
从技术上讲,解释和编译之间的真正区别是什么?让我详细说明(请纠正我可能有的任何错误概念):
在java中,源代码被“编译”成字节码,然后被“解释”和/或“即时编译”成机器码。但是及时编译和解释之间有什么区别?我的意思是,最后,据我猜测,主机的 CPU 将只运行机器代码。因此,在解释中,指令也被转换为 CPU 可以理解的机器代码。那么,我们在哪里划定即时编译和解释之间的界限呢?
附:这是我的构想。这可能是完全错误的。在这种情况下,请原谅我的愚蠢并纠正我。
谢谢。
【问题讨论】:
编译只给你字节码。使用字节码,您可以从具有不同操作系统的不同 PC 上移动已编译的项目,Java 代码将在所有这些机器中以类似方式解释。这就是为什么你可以说 Java 代码是可移植的。 【参考方案1】:1.坦率地说,java同时具有编译器和解释器的想法是一个神话,它的行为被标记为编译和解释。
2。 Java 编译器 将人类可读的代码编译为字节码。然后由 JIT(即时编译器) 在运行时将其转换为机器级可执行代码。
3. 在运行时 JIT 识别代码的运行时密集部分,然后将其转换为机器级可执行代码,这部分代码称为@987654321 @,这就是为什么 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
解释行为,以及the JIT behaviour of storing this for later use is assumed as
编译。
5.虚拟内存表也有一个表,存储字节码的地址,如果需要可以使用。
【讨论】:
【参考方案2】:当代码被编译时,生成的工件可以直接被硬件理解。基本上它是直接发送到 CPU 的机器代码。这也意味着针对给定 CPU 架构编译的工件不会在另一个上运行。优点是立即启动和出色的性能。
在解释环境中,要么根本没有编译,要么此步骤的结果是中间代码。该代码是直接发送到处理单元的两个摘要。相反,需要一个单独的层(虚拟机、解释器)来读取此工件并在某些沙盒环境中执行它。这种方法的优点是可移植性——中间代码可以在任何可以使用本机解释器的平台上运行。不幸的是,性能几乎总是更差。
Java 中的 JIT 是一种混合技术。第一个字节码被解释,每条字节码指令都由解释器执行。然而,在某个时间点(在某些条件下)字节码会被翻译成机器码并直接发送到 CPU 以提高性能。这种方法带来了两全其美 - 中间代码的可移植性和本机代码的速度。此外,JIT 对代码的运行时行为了解更多(给定循环平均被调用多少次?这个方法真的是虚拟的吗?),因此机器代码可以比普通编译器生成的更快(! )
【讨论】:
@NominSim:谢谢,我稍微编辑了我的答案。我知道 JIT 不会编译调用频率不够高的代码。还有其他条件吗? 我对确切的条件并不肯定,我只知道存在无法编译的条件,只是想澄清一下,这样人们就不会假设所有内容都被编译成机器代码。跨度> 【参考方案3】:您说得对,最终一切都必须转换为机器码。基本区别在于,在解释器的情况下,每次代码运行时都会发生这种翻译,而编译器会提前进行这种翻译,之后就不需要编译器来运行程序了。
即时编译是两者的结合,运行程序仍需要 JIT 编译器,并且代码在运行时编译。
编译需要时间,但是当同一段代码运行多次时它是有利的,例如。在一个循环中。 Java HotSpot VM 进一步采用了这种方法,最初直接解释字节码,然后在一段代码运行一定次数后进行 JIT 编译。
【讨论】:
【参考方案4】:解释器逐行解释代码,并在运行时决定机器码;
编译器按块消费代码,并在编译时决定机器码;
JIT 编译器是一种混合方法,其中代码在运行时生成(但可能已经被缓存以提高性能),但以块的形式使用。
【讨论】:
【参考方案5】:解释环境涉及在解析后立即执行的指令,其中解析和执行均由解释器完成。这意味着你运行代码的机器必须有解释器才能运行程序。1
编译器会将指令解析为机器码并存储起来供以后执行。然而,Java 是 bytecompiled2,这意味着这个过程将指令转换为 ByteCode,然后由解释器使用。
【讨论】:
以上是关于编译和解释之间的技术混淆的主要内容,如果未能解决你的问题,请参考以下文章