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

38|中端优化第1关:实现多种本地优化

你好,我是宫文学。
上一节课,我们设计了 IR 的数据结构,并且分析了如何从 AST 生成 IR。并且,这些 IR 还可以生成.dot 文件,以直观的图形化的方式显示出来。
不过,我们上一节课只分析了 if 语句,这还远远不够。这节课,我会先带你分析 for 循环语句,加深对你控制流和数据流的理解。接着,我们就会开始享受这个 IR 带来的红利,用它来完成一些基本的本地优化工作,包括公共子表达式删除、拷贝传播和死代码删除,让你初步体会基于 IR 做优化的感觉。
那么,我们先接着上一节课,继续把 for 循环从 AST 转换成 IR。

把 For 循环转换成 IR

同样地,我们还是借助一个例子来做分析。这个例子是一个实现累加功能的函数,bar 函数接受一个参数 a,然后返回从 1 到 a 的累加值。
function bar(a:number):number{
let sum:number = 0;
for(let i = 1; i <= a; i++){
sum = sum + i;
}
return sum;
}
这里,我先直接画出最后生成的 IR 图的样子:
你一看这个图,肯定会觉得有点眼花缭乱,摸不清头绪。不过没关系,这里面是有着清晰的逻辑的。
第一步,我们先来看控制流的部分。
在程序开头的时候,依然还是一个 Start 节点。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文介绍了如何将AST转换成IR,并利用IR进行多种本地优化。通过具体示例和图形化展示,生动地介绍了如何利用IR进行多种本地优化,包括公共子表达式删除、拷贝传播和死代码删除。文章通过详细介绍了如何将for循环转换成IR,包括控制流和数据流的处理,以及利用IR进行公共子表达式删除和拷贝传播的优化任务。同时,还介绍了如何检测死代码,并通过图形化展示展示了死代码在IR中的特点。最后,强调了优化工作的结果会为其他的优化创造机会,编译器在优化一个IR的时候会前后多次调用同一个优化算法。整体来说,本文通过具体示例和图形化展示,生动地介绍了如何利用IR进行多种本地优化,为读者提供了深入理解和应用IR的方法。

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

全部留言(3)

  • 最新
  • 精选
  • ifelse
    学习打卡
    2022-10-01归属地:浙江
  • chris
    老师, 是否连接loopend和loopbegin的黑线箭头方向反了, 应该是loopbegin指向loopend
    2022-01-26
    1
  • 奋斗的蜗牛
    如果考虑控制流,我认为比较DataNode时,要加入控制节点的比较
    2021-11-10
收起评论
显示
设置
留言
3
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部