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

时间:2018-12-03 10:21:13

标签: java jvm javac

我正在阅读一些有关JVM的文章,并发现一些令人困惑的信息。

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

它说:“实际上,Java编译器通常被称为JVM编译器(对于Java虚拟机)。”

此外,如果Java编译器是否是JVM的一部分,我将找不到确切的答案。 我知道JVM是解释器,但我读到它也做了一些编译。 而且,据我所知,JVM是JRE的一部分。 JDK的javac部分和JDK的JRE部分。

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

4 个答案:

答案 0 :(得分:4)

主要是关于术语,措辞。

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

本质上:

  • JRE包含JVM(上述的java二进制文件)
  • JDK包含JVM,以及要为Java进行开发的工具和库(因此:javajavac

最后:对于javac使用术语“ JVM编译器”是错误的并且具有误导性。 javac将Java源代码转换为Java字节码,然后可由JVM执行。但是,这里要真正完成的是:大多数JVM实现 都包含一个“及时”编译器组件,用于将字节代码转换为本地机器代码以提高性能。

答案 1 :(得分:1)

某些JVM将执行JIT(Just in Time)编译来优化Java字节码。 另外,可以在代码

中执行此操作

JavaCompiler编译器= ToolProvider.getSystemJavaCompiler();

然而,传统上,编译器是JDK的一部分,并且应用程序是随不包含Javac的JRE一起分发的

答案 2 :(得分:0)

尽管“ Java编译器通常被称为JVM编译器(对于Java虚拟机)”可能会产生误导,但它仍然成立,因为javac本质上将Java源代码转换为字节代码以供JVM运行,然后将其解释为机器可读指令。取决于平台

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

但是正如Ghostcat指出的那样,将Javac称为JVM编译器会产生误导,因为JVM具有自己的即时编译实现。

希望这可以添加到较早的答案中

答案 3 :(得分:0)

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

Diagram