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

20|怎么实现一个更好的寄存器分配算法:实现篇

你好,我是宫文学。
在上一节课,我们已经介绍了寄存器分配算法的原理。不过呢,我们这门课,不是停留在对原理的理解上就够了,还要把它具体实现出来才行。在实现的过程中,你会发现有不少实际的具体问题要去解决。而你一旦解决好了它们,你对寄存器分配相关原理的理解也会变得更加通透和深入。
所以,今天这一节课,我就会带你具体实现寄存器分配算法。在这个过程中,你会解决这些具体的技术问题:
首先,我们会了解如何基于我们现在的 LIR 来具体实现变量活跃性分析。特别是,当程序中存在多个基本块的时候,分析算法该如何设计。
第二,我们也会学习到在实现线性扫描算法中的一些技术点,包括如何分配寄存器、在调用函数时如何保存 Caller 需要保护的寄存器,以及如何正确的维护栈桢。
解决了这些问题之后,我们会对我们的语言再做一次性能测试,看看这次性能的提升有多大。那么接下来,就让我们先看看实现变量活跃性分析,需要考虑哪些技术细节吧。

实现变量活跃性分析

我们先来总结一下,在实现变量活跃性分析的时候,我们会遇到哪几个技术点。我们一般要考虑如何保存变量活跃性分析的结果、如何表达变量的定义,以及如何基于 CFG 来做变量活跃性分析这三个方面。
现在我们就一一来分析一下。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文深入探讨了基于控制流图的变量活跃性分析算法的实现细节,重点介绍了基于CFG的活跃变量分析算法的实现。文章首先介绍了变量活跃性分析的技术要点,包括数据结构设计、变量定义表达方式以及基于控制流图进行分析。随后详细讲解了算法的实现步骤,包括倒序扫描指令、处理变量声明和引用等。此外,文章还提到了在存在多个基本块时,需要考虑基本块之间的关系形成的控制流图对分析结果的影响。作者还介绍了算法的复杂性,特别是在处理带有环的图时,算法的复杂度会提升。另外,文章还强调了对数据结构的调整和构建CFG的重要性,以及持续迭代分析的重要性。整体来看,本文对寄存器分配算法的实现细节进行了深入浅出的介绍,对于想要深入了解寄存器分配算法的读者具有很高的参考价值。文章内容涵盖了寄存器分配算法的关键技术点,包括线性扫描算法的修改、寄存器的保护和重载、以及栈桢的维护等。通过采用这个升级版的寄存器分配算法,生成的汇编文件操作数大部分为寄存器,从而提升了性能。读者可通过本文快速了解寄存器分配算法的实现细节及其对性能的提升作用。文章还对性能比拼进行了详细分析,指出了寄存器分配算法的优化对于程序性能的提升作用,并探讨了CPU高速缓存对性能的影响。最后,文章提出了思考题,鼓励读者深入研究并分享优化思路。

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

全部留言(4)

  • 最新
  • 精选
  • chris
    老师的这个LivenessAnalyzer算法其实是简化的了, 更好理解但效率更低. 更高效的算法应该先计算每个基本块的gen集合(基本块中使用前未定义的变量集合)和kill集合(基本块中定义的变量集合), 然后利用" liveout等于CFG后继基本块livein的并集", 和 livein = liveout - kill + gen这两个公式计算不动点. 这个算法就不需要每次都重新分析一遍基本块
    2021-09-25
    1
    2
  • ifelse
    学习打卡
    2022-09-20归属地:浙江
  • 奋斗的蜗牛
    给大神跪倒,佩服得五体投地!
    2021-09-23
  • 奋斗的蜗牛
    实在是太强了,各种复杂的理论,能讲得这么清楚!!
    2021-09-23
收起评论
显示
设置
留言
4
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部