我正在学习Java,以下内容对我来说有些困惑。我的理解是:
Java编译器 → Java编译器只是将
.java
程序转换为.class
文件,也就是将源代码转换成字节码(它是虚拟机(JVM)的操作码列表,这使得Java具备了平台无关性)。Java解释器 → 仅仅“解释”代码,并且不会将其转换为本地机器代码。它会按照命令逐条执行每个字节码指令,无论相同的指令出现了多少次。这就是为什么它很慢,而Java引入了JIT概念。
JIT编译器 → 这也是在执行时发挥作用的。JIT编译器能够通过缓存已经被翻译的代码块的结果来提高性能,与简单地重新评估字节码中的每一行或操作数相比。
现在我有几个问题:
由于我的物理处理器只理解本地机器代码,使用JVM的解释器如何执行Java程序?解释器不会将字节码转换为本地机器代码。除非有人将机器代码放入内存中,否则物理处理器将无法执行它。
假设解释器也能将字节码转换为本地机器代码,那么“带缓存的代码块执行(JIT)和逐行执行(解释器)”是唯一区分JIT和解释器的东西吗?
如果在执行时,JIT编译器将字节码转换为本地机器代码(用于执行程序),为什么Java不使用预先编译?在生成基于JVM的字节码之后(反过来使Java具备平台无关性),我们可以将其带到要执行它的目标机器上,并将其转换为本地机器代码(与C编译的情况相同,创建一个
.exe
或.out
文件)。这是可能的,因为每个系统上都有特定的JVM。这比使用JIT编译更快,因为它需要一些时间来编译和加载程序。通过只分发字节码(在最终从字节码到机器代码的转换之前生成),它仍将是平台无关的。