我对JVM有一个非常基本的问题:它是编译器还是解释器?
如果它是解释器,那么JVM内部存在的JIT编译器怎么办?
如果两者都不是,那么JVM到底是什么?(我不希望将字节码转换为机器特定的代码等jVM的基本定义。)
我对JVM有一个非常基本的问题:它是编译器还是解释器?
如果它是解释器,那么JVM内部存在的JIT编译器怎么办?
如果两者都不是,那么JVM到底是什么?(我不希望将字节码转换为机器特定的代码等jVM的基本定义。)
Answers:
首先,让我们对以下术语有一个清晰的认识
Javac
是Java编译器-将Java代码编译为Bytecode
JVM
是Java虚拟机-运行/解释/将字节码转换为本机代码
JIT
是即时编译器-在运行本机代码之前,将给定的字节码指令序列在运行时编译为机器代码。它的主要目的是对性能进行重大优化。
现在,让我们找到您问题的答案。
1)JVM: is it a compiler or an interpreter?
-答案:口译员
2)what about JIT compiler that exist inside the JVM?
-答:如果您完整阅读了此回复,则可能现在知道了
3)what exactly is the JVM?
-答:
.class
文件加载到RAM中希望这对您有所帮助。
两者都有一点,但传统意义上都不是。
现代JVM使用字节码,并在首次需要时将其编译为本地代码。在本文中,“ JIT”代表“及时”。它从外部充当解释器,但实际上它是在幕后被编译为机器代码。
JVM不应与Java编译器混淆,后者会将源代码编译为字节码。因此,将其视为“编译器”不是有用的,而是知道它在后台确实进行了一些编译。
.dex
通过解释和刚刚在实时(JIT)编译...直接代码”(source.android.com/devices/tech/ota/ab/...)
Javac是编译器,而不是传统的编译器。编译器通常将源代码转换为机器级语言以供执行,并且只需一次操作即可完成,即在ONCE处获取整个代码并将其转换为机器级语言。(有关详情,请参见下文)。同时,JavaC将其转换为字节码而不是机器级语言。
JIT是Java编译器,但也可以充当解释器。典型的编译器会立即将所有代码从源代码转换为机器级别的语言。相反,JIT逐行执行(逐行执行是Interpreters的功能),并将JavaC生成的字节码转换为机器级语言并执行。带有JIT的JVM具有多种实现。热点是Java编程的主要热点之一。热点实现使JIT通过立即将重复的代码块转换为机器级语言(如上述编译器)来优化执行,从而可以更快地执行它们,而不用将代码的每一行都转换为1。关于编译器和解释器的典型定义,答案不是黑白的。
阅读一些在线答案,博客等后,这就是我的理解。如果有人对提高理解有建议,请随时提出建议。
JVM同时具有编译器和解释器。因为编译器会编译代码并生成字节码。之后,解释器将字节码转换为机器可理解的代码。
示例:编写并编译程序,该程序可在Windows上运行。将.class文件带到另一个OS(Unix),它将运行,因为解释器将字节码转换为机器可理解的代码。