java 编译器是 JVM 的一部分吗?

Is the java compiler part of the JVM?

我正在阅读一些关于 JVM 的帖子,发现了一些令人困惑的信息。

例如这里:http://www.cs.cmu.edu/~jcarroll/15-100-s05/supps/basics/history.html

它说 "In fact, the Java compiler is often called the JVM compiler (for Java Virtual Machine)"。

此外,如果 java 编译器是 JVM 的一部分,我找不到确切的答案。 我知道 JVM 是一个解释器,但我读到它也进行一些编译。 另外,据我所知,JVM 是 JRE 的一部分; javac JDK 的一部分和 JDK 的 JRE 部分。

那么 javac 是 JVM 的一部分吗?我认为不是,但不确定。

主要是术语,措辞。

java 二进制可执行文件 (以及它的一些细微变体,例如 javaw)。那就是java虚拟机!您调用该二进制文件,然后启动 JVM(有关所有荣耀的详细信息,请参阅 here)。

本质上:

  • 一个 JRE 包含一个 JVM(前面提到的 java 二进制文件)
  • a JDK 包含一个 JVM, 为 Java 开发 的工具和库(所以: javajavac)

最后:使用术语 "JVM compiler" 代替 javac 是错误和误导的。 javac 将 java 源代码转换为 java 字节码,然后可以由 JVM 执行。但在这里要真正完整:大多数 JVM 实现 包含一个 "just in time" 编译器组件,用于将字节码转换为本机机器码以提高性能。

一些 JVM 将执行 JIT(及时)编译以优化 java 字节代码。 此外,可以在代码

中执行此操作

JavaCompiler 编译器=ToolProvider.getSystemJavaCompiler();

然而,传统上编译器是 JDK 的一部分,并且应用程序与不包含 javac

的 JRE 一起分发

虽然 "Java compiler is often called the JVM compiler (for Java Virtual Machine)" 可能会产生误导,但它仍然成立,因为 javac 本质上是将 Java 源代码转换为 JVM 的字节码 运行,然后根据需要将其解释为机器可读指令在平台上

由于 javac 是 JVM 的编译器,它不是它的一部分。

但是正如 Ghostcat 所说,将 javac 称为 JVM 编译器是一种误导,因为 JVM 有自己的即时编译实现

希望这会增加之前的答案

与此同时,我发现这张图片准确说明了 java 编译器的位置,它是 JDK 的一部分,但不是 JVM 或 JRE 的一部分: