JIT 与口译员

2022-08-31 13:59:36

我找不到JIT和口译员之间的区别。

Jit 是解释器和编译器的中介。在运行时,它将字节码转换为机器代码(JVM或实际机器?下次,它从缓存中获取并运行 我是对的吗?

解释器将直接执行字节码,而无需将其转换为机器代码。是吗?

我们PC中的真实处理器将如何理解指令?

请消除我的疑虑。


答案 1

首先:
使用JVM,解释器和编译器(JVM编译器,而不是像javac这样的源代码编译器)都从字节码中生成本机代码(也称为x86等底层物理CPU的机器语言代码)。

那么有什么区别:
区别在于它们如何生成本机代码,优化程度以及优化的成本。非正式地说,解释器几乎通过查找预定义的JVM指令到机器指令映射,将每个字节码指令转换为相应的本机指令(见下图)。有趣的是,如果我们采用一段字节码并将其转换为机器代码,则可以进一步加快执行速度 - 因为考虑整个逻辑部分通常为优化提供空间,而不是单独转换(解释)每行(到机器指令)。将一段字节码转换为(可能是优化的)机器指令的这种行为称为编译(在当前上下文中)。在运行时完成编译时,编译器称为 JIT 编译器。

enter image description here

协同关系和协调:
由于Java设计人员追求(硬件和操作系统)可移植性,他们选择了解释器架构(而不是c样式的编译,组装和链接)。但是,为了实现更高的速度,还可以选择将编译器添加到JVM中。尽管如此,当程序继续被解释(并在物理CPU中执行)时,JVM会检测到“热点”并生成统计信息。因此,使用来自解释器的统计信息,这些部分成为编译的候选者(优化的本机代码)。事实上,它是动态完成的(因此JIT编译器),随后使用编译的机器指令(而不是解释)。以一种自然的方式,JVM还缓存了这些已编译的代码段。

警告:
这些几乎是基本概念。如果一个实际的JVM实现者,它的方式有点不同,不要感到惊讶。其他语言的VM也是如此。

警告:
像“解释器在虚拟处理器中执行字节码”,“解释器直接执行字节码”等陈述都是正确的,只要你明白最终有一组机器指令必须在物理硬件中运行。

一些好的参考资料:[我还没有做广泛的搜索]

  • [论文]在基于硬件翻译的Java虚拟机中的指令折叠,由Hitoshi Oi提供
  • [书]计算机组织与设计,第4版,D. A. Patterson。(见图2.23)
  • [网络文章]JVM 性能优化,第 2 部分:编译器,作者:Eva Andreasson (JavaWorld)

PS:我互换使用以下术语 - “本机代码”,“机器语言代码”,“机器指令”等。


答案 2
  • 解释器:读取源代码或其某些中间表示形式(字节码),并直接执行它。

  • JIT 编译器:读取源代码,或者更常见的是它的一些中间表示形式(字节码),动态编译并执行本机代码


推荐