← 完整学习路线

UNIT 69 / 78 · W11-1

从表达式树走到真实编译器输出

本单元预计 4 核心小时。可以分成多个学习时段,按完整小节推进;停下来时留下输入、命令、结果和下一步。

时间包含阅读、编码与检查,是学习预算而非期限。打开此页只保存阅读位置,不代表通过验收。

开始本单元前

IR-45完整先备 →
先完成前一IR桥的五节,再进入真实IR实验;不把只编译或手写片段当执行。

01 / READ

先知道自己在观察什么

AST、IR 与 SSA:同一个表达式的三种表示 →

画AST并写临时值,再读SSA一次定义与控制流汇合;区别名称模型与真实LLVM verifier。

AST、IR 与 SSA:同一个表达式的三种表示 →

查LLVM公开IR介绍与语言参考,用当前工具输出核对参数、返回、add/mul或等价指令。

先备不清楚时,沿章节入口补读;不要依赖翻过页数判断进度。

02 / PREDICT & RUN

先留下自己的预测或独立尝试

先画(2+3)*4的树并求值20,再运行原创AST求值器;它不是完整parser。

表达式树求值 →
源码下载与编译入口

下载到自己的练习目录。按本节给出的完整命令编译;多文件与driver要求见原任务。需要时查阅文件保存与编译操作 →

45-a.cpp

先保存预测,再核对正文标明的预期或诊断。完整构建、多文件与设备实验按原任务命令执行。

03 / CHANGE ONE THING

通过一个变动看清原因

在副本改为2*(3+4)的树结构,更新该表达式的独立期望。

修改后应观察到什么

结果14,树根与左右子树反映新的括号关系。

04 / DO IT YOURSELF

换一组条件,独立解决

在同一学习目录写小函数 twice_next(x)=(x+1)*2,限定x在[-100,100];用现有clang++分别以-O0/-O2和-S -emit-llvm生成IR,再编译调用x=5的程序。

用这些条件检查自己的实现

  • 实际程序输出12;保存两份真实IR、命令与编译器版本,不手写冒充工具产物。
  • 指出参数到返回值的一条use-def链;优化后形式可因版本不同而变,不以更短就判更快。
05 / EXPLAIN & CHECK

用证据决定是否进入下一单元

  1. SSA一次定义为什么不意味着内存永远不变?
  2. AST保留括号结构,IR还要显式表达哪些关系?

本单元的验收依据

表达式模型通过;本机支持LLVM IR输出时保存实际产物并完成逐行说明,不安装额外设备环境或声称编译器前端已实现。

留下自己的代码或推演、测试输入、真实输出和仍不确定的问题。未达到要求时,下一次继续本单元。