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

3
我正在阅读一些有关JVM的帖子,并发现了一些令人困惑的信息。例如,在这里:http://www.cs.cmu.edu/~jcarroll/15-100-s05/supps/basics/history.html,它说“事实上,Java编译器通常被称为JVM编译器(用于Java虚拟机)”。
此外,我找不到确切的答案,即java编译器是否是JVM的一部分。我知道JVM是一个解释器,但我读到它也会进行一些编译。另外,据我所知,JVM是JRE的一部分;javac是JDK的一部分,而JRE则是JDK的一部分。
那么,javac是JVM的一部分吗?我认为不是,但不确定。

2
对我来说那只是一个措辞混乱的页面。不,javac 不是 JVM 本身的一部分。 - Jon Skeet
3
我认为称javac为“JVM编译器”的人并不多。 - Holger
1
好的,谢谢大家的回复! - Alex Salajan
我很感激你的快速回复! - GhostCat
4个回答

7

这主要涉及到术语和措辞。

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

本质上:

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

最后,将javac称为“JVM编译器”是错误和误导性的。 javac将Java源代码转换为Java字节码,然后可以由JVM执行。但是,为了真正完整,大多数JVM实现还包含“即时”编译器组件,以将字节码转换为本机机器代码以提高性能。


1
更准确地说,“java”可执行文件不是Java虚拟机。JRE包含除JVM之外的许多其他内容。但主要观点是正确的 - “javac”不是JVM的一部分。 - apangin
@apangin 很好的观点。我重新修改了我的答案,并给他们投了应有的票;-) - GhostCat
1
@apangin,JIT编译器是JVM的一部分。 ;) - Peter Lawrey
@PeterLawrey 嗯,我既没有10个得到600多票的问题,也没有600多个得到10票的问题。所以,那条评论并没有让我感到特别“安慰”。另一方面,我很高兴我没有去搜索你得到9票的问题;-) - GhostCat
@GhostCat,我感到安慰的是,我并不在前50页中。 - Peter Lawrey
1
@PeterLawrey 我并没有试图安慰你,如果这有所帮助的话。而且至少你不是SE上为数不多的双传奇持有者之一,因此理论上,如果我选择另一个社区,并开始努力工作,我可能会先达成这个目标;-) (https://meta.stackexchange.com/questions/299754/which-user-is-the-most-legendary-across-the-whole-network-of-sites) - GhostCat

5

同时,我找到了这张图,它清楚地说明了Java编译器的位置,它是JDK的一部分,但不是JVM或JRE的一部分:

Diagram


2
一些JVM会执行JIT(即时编译)来优化Java字节码。此外,可以在代码中实现这一点。
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
然而,传统上编译器是JDK的一部分,并且应用程序与不包含javac的JRE一起分发。

0

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

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

但是,正如Ghostcat所述,将javac称为JVM编译器是具有误导性的,因为JVM具有自己的即时编译实现。

希望这能补充之前的答案。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接