UNIT 69 / 78 · W11-1
从表达式树走到真实编译器输出
本单元预计 4 核心小时。可以分成多个学习时段,按完整小节推进;停下来时留下输入、命令、结果和下一步。
时间包含阅读、编码与检查,是学习预算而非期限。打开此页只保存阅读位置,不代表通过验收。
开始本单元前
IR-45完整先备 →
先完成前一IR桥的五节,再进入真实IR实验;不把只编译或手写片段当执行。
先知道自己在观察什么
AST、IR 与 SSA:同一个表达式的三种表示 →
画AST并写临时值,再读SSA一次定义与控制流汇合;区别名称模型与真实LLVM verifier。
AST、IR 与 SSA:同一个表达式的三种表示 →
查LLVM公开IR介绍与语言参考,用当前工具输出核对参数、返回、add/mul或等价指令。
先备不清楚时,沿章节入口补读;不要依赖翻过页数判断进度。
先留下自己的预测或独立尝试
先画(2+3)*4的树并求值20,再运行原创AST求值器;它不是完整parser。
表达式树求值 →源码下载与编译入口
下载到自己的练习目录。按本节给出的完整命令编译;多文件与driver要求见原任务。需要时查阅文件保存与编译操作 →
45-a.cpp先保存预测,再核对正文标明的预期或诊断。完整构建、多文件与设备实验按原任务命令执行。
通过一个变动看清原因
在副本改为2*(3+4)的树结构,更新该表达式的独立期望。
修改后应观察到什么
结果14,树根与左右子树反映新的括号关系。
换一组条件,独立解决
在同一学习目录写小函数 twice_next(x)=(x+1)*2,限定x在[-100,100];用现有clang++分别以-O0/-O2和-S -emit-llvm生成IR,再编译调用x=5的程序。
用这些条件检查自己的实现
- 实际程序输出12;保存两份真实IR、命令与编译器版本,不手写冒充工具产物。
- 指出参数到返回值的一条use-def链;优化后形式可因版本不同而变,不以更短就判更快。
用证据决定是否进入下一单元
- SSA一次定义为什么不意味着内存永远不变?
- AST保留括号结构,IR还要显式表达哪些关系?
本单元的验收依据
表达式模型通过;本机支持LLVM IR输出时保存实际产物并完成逐行说明,不安装额外设备环境或声称编译器前端已实现。
留下自己的代码或推演、测试输入、真实输出和仍不确定的问题。未达到要求时,下一次继续本单元。