编译原理实战课
宫文学
北京原点代码 CEO
26066 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 55 讲
真实编译器解析篇 (19讲)
编译原理实战课
15
15
1.0x
00:00/00:00
登录|注册

16 | Java JIT编译器(四):Graal的后端是如何工作的?

可使用c1visualizer工具查看
dump到graal_dumps子目录
通过网络端口dump到IdealGraphVisualizer
解读匹配规则并发表见解
设计测试指令选择效果的例子
对Java编译器的探讨
指令选择算法的实现
LIR的具体概念
从LIR生成目标代码
窥孔优化
指令排序
寄存器分配算法
指令选择算法的匹配规则
示例程序addMemory的LIR生成
示例程序add1的LIR生成
指令选择算法
生成LIR的过程
LIR指令类型
ControlFlowGraph和Block类
Schedule过程
HIR与LIR的关系
后端处理过程
HIR处理过程
一课一思
课程小结
后端的其他功能
生成LIR及指令选择
认识LIR
后端的处理流程
Java JIT编译器后端功能

该思维导图由 AI 生成,仅供参考

你好,我是宫文学。
前面两讲中,我介绍了 Sea of Nodes 类型的 HIR,以及基于 HIR 的各种分析处理,这可以看做是编译器的中端。
可编译器最终还是要生成机器码的。那么,这个过程是怎么实现的呢?与硬件架构相关的 LIR 是什么样子的呢?指令选择是怎么做的呢?
这一讲,我就带你了解 Graal 编译器的后端功能,回答以上这些问题,破除你对后端处理过程的神秘感。
首先,我们来直观地了解一下后端处理的流程。

后端的处理流程

第 14 讲中,我们在运行 Java 示例程序的时候(比如atLeastTen()方法),使用了“-Dgraal.Dump=:5”的选项,这个选项会 dump 出整个编译过程最详细的信息。
对于 HIR 的处理过程,程序会通过网络端口,dump 到 IdealGraphVisualizer 里面。而后端的处理过程,缺省则会 dump 到工作目录下的一个“graal_dumps”子目录下。你可以用文本编辑器打开查看里面的信息。
//至少返回10
public int atLeastTen(int a){
if (a < 10)
return 10;
else
return a;
}
不过,你还可以再偷懒一下,使用一个图形工具c1visualizer来查看。
补充:c1visualizer 原本是用于查看 Hopspot 的 C1 编译器(也就是客户端编译器)的 LIR 的工具,这也就是说,Graal 的 LIR 和 C1 的是一样的。另外,该工具不能用太高版本的 JDK 运行,我用的是 JDK1.8。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文深入介绍了Java JIT编译器Graal的后端处理流程及LIR的生成特点。重点讲解了后端处理的流程,包括HIR最后一次排序、LIR生成、寄存器分配、基于LIR的优化和目标代码生成。特别强调了LIR的生成过程,指出LIR反映了目标硬件的特征,可以与机器码一对一地翻译。通过示例程序展示了Graal编译器是如何生成LIR,并在这个过程中实现指令选择的。文章还详细分析了针对不同程序的LIR生成和指令选择的过程,以及优化后的目标代码生成。此外,还提到了Graal对针对AArch64的指令选择较为初级,ARM公司的研发人员正在帮助Graal做改进,为读者提供了最新的技术动态。文章内容丰富,对于想要深入了解编译器后端处理过程的读者具有很高的参考价值。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《编译原理实战课》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(3)

  • 最新
  • 精选
  • 智昂张智恩震😱
    请问和JVM握手就是插入safe point的过程吗?具体的握手是在做什么?

    作者回复: 在安全点插入代码,是在编译期去做的。在运行期是去执行这些代码。 在这里,安全点的代码主要服务于垃圾收集目的。在JVM做垃圾收集的时候,各个线程都要停在安全点上。那么程序运行到这里的时候,就可以去运行一段代码,检查一下是否正要做垃圾收集,如果是的话,就先把线程停下来。否则,就继续执行。 在安全点插入代码还可以实现其他作用。比如,你可以在这里实现抢占式的并发调度功能,像Go的Goroutine就有这种调度机制。 所以说,编译器生成的目标代码要跟运行时机制相结合,这也是我们在第三篇会着重讲运行时机制的原因。上述说的两种情况,在第三篇讲垃圾收集和并发机制的时候,都会讲到。

    2020-07-08
    4
  • 手抓饼熊
    老师能否再开个专栏专门将graal的?这2门课讲的太好了,广度也非常好,如果再挑一个深度讲讲就很完美了,现在市面上对jit,编译优化和后端讲解的很少。

    作者回复: 感谢肯定! 是否开一个专栏,取决于是否有足够多的同学对这个话题感兴趣。如果话题比较小众,可以未来在社区里通过博客文章等方法大家一起探讨。

    2020-09-16
    3
  • 一些c工具链支持习语识别,能够识别源代码中的特定模式,并从源代码直接生成对应cpu的汇编代码,这类优化属于哪一环节?

    作者回复: 在优化算法中,专门会做一些分析,比如控制流分析之类,就是要识别源代码中的某些模式,比如循环结构等,以便于进行变量外提等优化。 另一方面,高抽象度的代码中(比如源代码、HIR),其实会有一些信息,如果利用好了的话,会有利于优化。而我们在Lower的过程中,有可能会把这些有用的信息丢掉。所以,我们在设计IR的时候,要尽量保存下来这些有用的信息,比如变成IR的元数据或标注。

    2020-12-24
收起评论
显示
设置
留言
3
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部