一个解释器是一种将高级语言代码转换为机器格式的软件程序。不是,那是编译器。一个
解释器是一种直接执行语言指令的计算机程序。这与将高级语言转换为低级语言的编译器不同。C编译器从C到汇编代码,而汇编程序(另一种类型的编译器)则从汇编到机器代码 - 现代C编译器可以完成从C到机器代码的两个步骤。在Java中,java编译器执行代码验证并将Java源代码转换为字节码类文件。它还执行许多小处理任务,例如常量的预计算(如果可能),字符串的缓存等。现在Java解释器的平台是JVM,在其中运行,因此基本上它将生成可以由JVM运行的代码。
JVM直接操作字节码。Java解释器与JVM的整合非常紧密,它们不应被视为分离实体。此外,也存在大量优化,使得字节码可以在执行时动态优化,仅仅称之为解释器是不够准确的。请参考下面的内容。
“因此,它接收字节码并生成中间代码和目标机器代码,并将它们提供给JVM。”
JVM负责这些转换。
“我更愿意说JVM使用字节码、经过优化的用户代码、包括Java和本地代码的Java库以及OS调用来执行Java应用程序。”
“现在我还不清楚其中的子进程,即1.解释器生成中间代码。2.解释的代码随后进行优化。3.然后生成目标代码。4.最后执行。”
Java编译器生成字节码。当JVM执行代码时,步骤2-4在JVM内部的运行时发生。这与C(例如)非常不同,因为这些单独的步骤由不同的实用程序运行。不要将其视为“子进程”,而应将其视为JVM内部的模块。
“那么解释器是否负责生成目标代码?并执行它?”
有点像。JVM的解释器根据定义读取字节码并直接执行它。但是,在现代JVM中,解释器与即时编译器(JIT)一起工作,以便
动态生成本机代码,以使JVM能够更有效地执行您的代码。
此外,还有后处理的“编译”阶段,它会在运行时分析生成的代码,以便通过其他机制优化本机代码,例如内联经常使用的代码块。这就是为什么JVM在启动时负载峰值如此之高的原因。它不仅加载jar和class文件,而且实际上正在进行
cc -O3
的即时编译。
尽管我们谈论JVM执行代码,但这在技术上并不正确。一旦字节码被翻译成本地代码,JVM和Java应用程序的执行就由CPU和其他硬件架构完成。操作系统是底层基础,负责所有进程和资源管理,以便程序可以高效地共享硬件和执行任务。操作系统还提供API,使应用程序可以轻松访问磁盘、网络、内存和其他硬件和资源。