写在前面

本文隶属于专栏《100个问题搞定Java虚拟机》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢!

本专栏目录结构和文献引用请见100个问题搞定Java虚拟机

解答

按照《深入理解Java虚拟机:JVM高级特性与最佳实践第3版》的说法,Java 语言的编译器可以分为 3 类:

前端编译器

作用

把 java 文件转变成 class 文件

举例

JDK 的 Javac、 Eclipse JDT中的增量式编译器(ECJ)

JIT编译器(Just In Time Compiler)

作用

把字节码转变成机器码

举例

Hotspot VM的C1、C2编译器,Graal 编译器

AOT编译器

作用

直接把程序编译成与目标机器指令集相关的二进制代码

举例

JDK 的 Jaotc、GNU Compiler for the Java(GCJ)、 Excelsior JET

对比

前端编译器对代码的运行效率几乎没有任何优化措施。

虚拟机设计团队把对性能的优化集中到了后端的即时编译器中,这样可以让那些不是由 Javac产生的Cass文件(如 Scala、 Groovy等语言的 Class 文件)也同样能享受到编译器优化所带来的好处。

相当多新生的Java语法特性,都是靠编译器的“语法糖”来实现,而不是依赖虚拟机的底层改进来支持,可以说,Java中即时编译器在运行期的优化过程对于程序运行来说更重要,

而前端编译器在编译期的优化过程对于程序编码来说关系更加密切。

关于 Java 的语法糖请参考我的这篇博客——全网最全的 Java 语法糖指南

上一篇 下一篇