本文思路很清晰,分两步走。第一步,老的即时编译的缺陷导致新的编译器孕育而生。第二步,具体讲解 Graal 编译器的特性。
老即时编译
流程
先启动解释编译,分析出解释多次的代码,使用 c1 编译器进行编译,再次分析 c1 编译器编译多次的代码,使用 c2 编译器进行编译。
c2 编译器是最重要的一环,因为 c2 编译出高度优化的机器码。
缺陷
1. 旧代码难以扩展和维护 2. 使用更多的 JVM 内联函数,开发成本太大。
具体解释第二点缺陷
JVM 启动的时候会检测运行在哪个处理器上,并且更具特定的处理器生成特定的内联函数表,极大的运用了硬件的能力。这样就导致对于特定的处理器需要特定的内联表函数,就需要更多的内联函数。所以导致开发成本和维护成本大。
新即时编译
目标
更好的编译 Java 代码,那么出发点就是 JIT 就是将字节码转换为机器码,在 Java 中就是从 byte[] 转到另外一个 byte[],那么转换代码可不可以用 java 来写。
优势
工程师开发新编译器的进入门槛要低得多。
编译器的内存安全性。
能够利用成熟的 Java 工具进行编译器开发。
更快的新编译器功能原型设计。
编译器可以独立于 HotSpot。
编译器能够自己编译自己,以生成更快的 JIT 编译版本。