编译原理实战课
宫文学
北京物演科技CEO
立即订阅
3002 人已学习
课程目录
已更新 32 讲 / 共 53 讲
0/4登录后,你可以任选4讲全文学习。
课前必读 (2讲)
开篇词 | 在真实世界的编译器中游历
免费
学习指南 | 如何学习这门编译原理实战课?
预备知识篇 (9讲)
01 | 编译的全过程都悄悄做了哪些事情?
02 | 词法分析:用两种方式构造有限自动机
03 | 语法分析:两个基本功和两种算法思路
04 | 语义分析:让程序符合语义规则
05 | 运行时机制:程序如何运行,你有发言权
06 | 中间代码:不是只有一副面孔
07 | 代码优化:跟编译器做朋友,让你的代码飞起来
08 | 代码生成:如何实现机器相关的优化?
知识地图 | 一起来复习编译技术核心概念与算法
真实编译器解析篇 (19讲)
09 | Java编译器(一):手写的编译器有什么优势?
10 | Java编译器(二):语法分析之后,还要做些什么?
11 | Java编译器(三):属性分析和数据流分析
12 | Java编译器(四):去除语法糖和生成字节码
13 | Java JIT编译器(一):动手修改Graal编译器
14 | Java JIT编译器(二):Sea of Nodes为何如此强大?
15 | Java JIT编译器(三):探究内联和逃逸分析的算法原理
16 | Java JIT编译器(四):Graal的后端是如何工作的?
17 | Python编译器(一):如何用工具生成编译器?
18 | Python编译器(二):从AST到字节码
19 | Python编译器(三):运行时机制
20 | JavaScript编译器(一):V8的解析和编译过程
21 | JavaScript编译器(二):V8的解释器和优化编译器
22 | Julia编译器(一):如何让动态语言性能很高?
23 | Julia编译器(二):如何利用LLVM的优化和后端功能?
24 | Go语言编译器:把它当作教科书吧
25 | MySQL编译器(一):解析一条SQL语句的执行过程
26 | MySQL编译器(二):编译技术如何帮你提升数据库性能?
热点问题答疑:如何吃透7种语言的编译器?
不定期加餐 (2讲)
不定期加餐1 | 远程办公,需要你我具备什么样的素质?
不定期加餐2 | 学习技术的过程,其实是训练心理素质的过程
编译原理实战课
15
15
1.0x
00:00/00:00
登录|注册

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

宫文学 2020-07-08
你好,我是宫文学。
前面两讲中,我介绍了 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/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《编译原理实战课》,如需阅读全部文章,
请订阅文章所属专栏新⼈⾸单¥29.9
立即订阅
登录 后留言

精选留言(1)

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

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

    2020-07-08
收起评论
1
返回
顶部