我找不到 JIT 和解释器之间的区别。
Jit 是解释器和编译器的中介。在运行时,它将字节代码转换为机器代码(JVM 或实际机器?),下次,它从缓存中获取并运行
我对吗?
解释器将直接执行字节码,而不将其转换为机器代码。是对的吗?
我们电脑中真正的处理器如何理解指令?
请解答我的疑惑。
首先第一件事:
使用 JVM,同时具有解释器和编译器(JVM编译器而不是像javac这样的源代码编译器)生成本机代码(又名底层物理 CPU(如 x86)的机器语言代码)来自字节码.
那么有什么区别:
区别在于它们如何生成本机代码、优化程度以及优化成本如何。通俗地说,解释器通过查找预定义的 JVM 指令到机器指令的映射(见下图),几乎将每个字节码指令转换为相应的本机指令。有趣的是,如果我们将一段字节码转换为机器代码,则可以进一步提高执行速度 - 因为考虑整个逻辑部分通常会提供优化空间,而不是转换(口译)每行隔离(到机器指令)。将一段字节码转换为(可能是优化的)机器指令的这种行为称为编译(在当前上下文中)。当编译在运行时完成时,编译器称为JIT编译器。
相互关系与协调:
由于 Java 设计师选择了 (硬件和操作系统)可移植性,他们选择了解释器架构(与 C 风格的编译、汇编和链接相反)。然而,为了获得更高的速度,还可以选择向 JVM 添加编译器。尽管如此,当程序继续被解释(并在物理 CPU 中执行)时,JVM 会检测到“热点”并生成统计信息。因此,使用解释器的统计数据,这些部分成为编译的候选者(优化的本机代码)。事实上,它是即时完成的(因此是 JIT 编译器),并且随后使用编译后的机器指令(而不是被解释)。以自然的方式,JVM 也会缓存此类编译后的代码片段。
注意事项:
这些几乎是基本概念。如果 JVM 的实际实现者采用了稍微不同的方式,请不要感到惊讶。其他语言的虚拟机的情况也可能如此。
注意事项:
“解释器在虚拟处理器中执行字节码”、“解释器直接执行字节码”等说法都是正确的,只要你明白最终有一组机器指令必须在物理硬件中运行。
一些好的参考资料:[虽然我没有进行广泛的搜索]
- [论文] 基于硬件翻译的 Java 虚拟中的指令折叠
大井仁 (Hitoshi Oi) 的机器
- [书籍] 计算机组织与设计,第四版,D. A. Patterson。 (见图2.23)
- [网络文章] JVM 性能优化,第 2 部分:编译器,作者:Eva Andreasson (JavaWorld)
PS:我交替使用了以下术语——“本机代码”、“机器语言代码”、“机器指令”等。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)