写在前面
本文隶属于专栏《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 语法糖指南