我正在阅读一些有关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的一部分吗?我认为不是,但是不确定。
答案 0 :(得分:4)
主要是关于术语,措辞。
有一个java
二进制可执行文件(以及它的一些细微变化,例如javaw)。那就是java虚拟机!调用该二进制文件,然后启动JVM(有关所有荣耀的详细信息,请参见here)。
本质上:
java
二进制文件)java
和javac
)最后:对于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)