手把手带你写一门编程语言
宫文学
北京原点代码 CEO
7534 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 49 讲
起步篇:让一门超简单的语言跑起来 (21讲)
结束语 (1讲)
手把手带你写一门编程语言
15
15
1.0x
00:00/00:00
登录|注册

37 | 从AST到IR:体会数据流和控制流思维

你好,我是宫文学。
在上一节课,我们已经初步认识了基于图的 IR。那接下来,我们就直接动手来实现它,这需要我们修改之前的编译程序,基于 AST 来生成 IR,然后再基于 IR 生成汇编代码。
过去,我们语言的编译器只有前端和后端。加上这种中间的 IR 来过渡以后,我们就可以基于这个 IR 添加很多优化算法,形成编译器的中端。这样,我们编译器的结构也就更加完整了。
今天这节课,我先带你熟悉这个 IR,让你能够以数据流和控制流的思维模式来理解程序的运行逻辑。之后,我还会带你设计 IR 的数据结构,并介绍 HIR、MIR 和 LIR 的概念。最后,我们再来讨论如何基于 AST 生成 IR,从而为基于 IR 做优化、生成汇编代码做好铺垫。
首先,我还是以上一节课的示例程序为础,介绍一下程序是如何基于这个 IR 来运行的,加深你对控制流和数据流的理解。

理解基于图的运行逻辑

下面是上节课用到的示例程序,一个带有 if 语句的函数,它能够比较充分地展示数据流和控制流的特点:
function foo(a:number, b:number):number{
let x:number;
if (a>10){
x = a + b;
}
else{
x = a - b;
}
return x;
}
我们把这个程序转化成图,是这样的:
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

基于图的IR设计及转换过程是本文的主要内容。文章首先介绍了HIR、MIR和LIR之间的区别,以及它们在编译器中的作用。作者详细讲解了将AST翻译成HIR的过程,强调了在这一过程中需要注意的细节和区别。此外,文章还探讨了控制流和数据流的相对独立性,以及IR设计中数据节点和控制节点的特点。最后,作者提出了思考题,帮助读者更好地理解不同IR类型的应用场景。总的来说,本文深入浅出地介绍了基于图的IR设计和转换过程,对于想深入了解编译器中间表示的读者具有很高的参考价值。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《手把手带你写一门编程语言》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(6)

  • 最新
  • 精选
  • ifelse
    学习打卡
    2022-10-01归属地:浙江
  • 有学识的兔子
    HIR 贴近源码,会基于SSA进行格式化; LIR 接近汇编的一种表达;MIR介于两者之间,与硬件尽量无关; 因此问题对应的顺序是HIR,MIR,LIR。
    2021-11-14
  • 奋斗的蜗牛
    老师,节点之海和DAG是指同一种IR吗
    2021-11-09
    1
  • 奋斗的蜗牛
    场景1是HIR,场景2是MIR,场景3是LIR
    2021-11-08
  • 奋斗的蜗牛
    厉害,老师的水平真高,编译原理到老师的手里,信手拈来
    2021-11-08
  • 奋斗的蜗牛
    太赞了,感觉一下子茅塞顿开
    2021-11-08
收起评论
显示
设置
留言
6
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部