我试图理解Java源代码是如何执行的,我对JVM内部的JIT编译器实际上是什么感到困惑.首先,让我告诉您我是如何理解从Java源代码到在计算机上执行机器代码的过程.也许,我误解了导致混乱的过程中的某些事情.
步骤:
现在,根据维基百科关于JVM的文章,更具体地说是"字节码解释器和即时编译器"部分,为了执行Java字节码,你需要一个解释器(但我们有一个JIT 编译器).
现在这里有点困惑我.我把它分成了引号:
"当解释器执行Java字节码时,执行总是比编译成本机机器语言的同一程序的执行慢."
由于计算机只能执行机器代码,并且解释器在将字节码转换为机器代码方面比编译器慢,为什么JVM使用解释器而不是编译器?
为什么我们没有为JIT编译器为CPU生成另一个中间可执行文件,以便它可以快速执行指令?
"JIT编译器可以在执行程序时将Java字节码转换为本机机器语言.然后,程序的翻译部分可以比它们解释的更快地执行.这种技术可以应用于经常执行的程序的那些部分."
JIT编译器真的是一个能够编译频繁执行的代码的解释器吗?编译器和解释器这两个术语是否可以互换使用?
提前致谢.
由于计算机只能执行机器代码,并且解释器将字节码转换为机器代码的速度比编译器慢,因此JVM为什么使用解释器而不是编译器?
因为编译到机器代码也需要时间,尤其是在必须分析代码以对其进行优化时,所以解释速度足以在大多数时间执行,并且实际上比仅执行一次/偶尔运行的compile + run要快。
另外,解释器不会“将字节码转换为机器码”。它评估字节码并执行字节码请求的操作。解释器本身是机器代码,但不翻译字节码,而是解释/评估字节码。
为什么我们没有由JIT编译器为CPU生成的另一个中间可执行文件,以便它可以快速执行指令?
这将违反Java的“一次写入,可在任何地方运行”的范例。
JIT编译器真的是可以编译频繁执行的代码的解释器吗?
不,JIT编译器(或更准确地说,是EJP提到的HotSpot编译器)是按需由JVM执行的编译器。
术语“编译器”和“解释器”是否错误地互换使用?
正确。它们不能互换使用,因为它们不会做相同的事情。解释器执行字节码。JIT / HotSpot编译器将字节码转换为机器代码,但不运行它。
| 归档时间: |
|
| 查看次数: |
1730 次 |
| 最近记录: |