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

29 | 中端总结:不遗余力地进行代码优化

复用后端工具,包括LLVM、GraalVM和GCC
从IR的角度来看,采用SSA格式的IR,采用Sea of Nodes这样的数据结构
对于静态类型的语言,不同的编译器的优化程度也是不同的
对于面向对象的语言,内联优化和逃逸分析非常重要
JIT编译器可以充分利用推理性的优化机制
对于动态类型的语言,优化编译的首要任务是做类型推断
对于解释执行的语言,优化是有限的
有些基本的优化是每个编译器都会去实现的
实现各种优化算法
对IR做分析,如数据流分析
层层地做Lower
编译器需要从高到低的多个层次的IR
优点:简化程序表达;缺点:阅读困难,访问代价大
把数据流图和控制流图合二为一,更容易实现全局优化
公共子表达式消除更加简单,不需要数据流分析
清晰的use-def链提供了优化算法的便利
源代码中的一个变量会变成多个版本,每次赋值都形成一个新版本
课程小结
优化算法的特点
编译器基于IR,主要做了三种类型的处理
从高到低的多层次IR
Sea of Nodes的特点总结
SSA成为主流
提问留言区
测试Graal、Go和Clang三个编译器在其他方面的优化表现
对优化算法的总结
对IR的总结
一课一思
总结前面解析的7种真实的编译器中,中端部分的特征和编译技术

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

你好,我是宫文学。
今天这一讲,我继续带你来总结前面解析的 7 种真实的编译器中,中端部分的特征和编译技术。
在课程的第 1 讲,我也给你总结过编译器的中端的主要作用,就是实现各种优化。并且在中端实现的优化,基本上都是机器无关的。而优化是在 IR 上进行的。
所以,今天这一讲,我们主要来总结以下这两方面的问题:
第一,是对 IR 的总结。我在第 6 讲中曾经讲过,IR 分为 HIR、MIR 和 LIR 三个层次,可以采用线性结构、图、树等多种数据结构。那么基于我们对实际编译器的研究,再一起来总结一下它们的 IR 的特点。
第二,是对优化算法的总结。第 7 讲,我们把各种优化算法做了一个总体的梳理。现在就是时候,来总结一下编译器中的实际实现了。
通过今天的总结,你能够对中端的两大主题 IR 和优化,形成更加深入的理解,从而更有利于你熟练运用编译技术。
好了,我们先来把前面学到的 IR 的相关知识,来系统地梳理和印证一下吧。

对 IR 的总结

通过对前面几个真实编译器的分析,我们会发现 IR 方面的几个重要特征:SSA 已经成为主流;Sea of Nodes 展现出令人瞩目的优势;另外,一个编译器中的 IR,既要能表示抽象度比较高的操作,也要能表示抽象度比较低的、接近机器码的操作。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

编译器中端的关键主题是IR和优化。IR方面,SSA格式的IR提供了便利的use-def链,Sea of Nodes结合了数据流图和控制流图,便于全局优化。编译器通过层层Lower的过程,将程序的语义从高级语言逐步变到了汇编语言。优化算法往往以分析为基础,主要是机器无关的优化。对于解释执行的语言,编译器能做的优化有限,而对于动态类型的语言,类型推断是首要任务。JIT编译器可以充分利用推理性的优化机制,带来更好的优化效果。内联优化和逃逸分析对面向对象的语言非常重要。文章通过具体例子和图示生动地展现了不同编译器对数组加法的优化效果,使读者更易理解和把握这些编译器的优化特点。

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

全部留言(2)

  • 最新
  • 精选
  • pedro
    外行看语言,内行看编译器
    2022-06-23
    1
  • Geek_64affe
    我们的数据引擎,可以学习julia的方法了,根据类型编译成不同版本的函数,一定可以降低运行时的类型判断开销
    2022-04-13
收起评论
显示
设置
留言
2
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部