抱歉博客有一阵子没更了,因为生了四五天的病,又因为书上对这一段介绍的顺序奇奇怪怪的,it confuse me for a long time. 不过我现在可以把我前几天写的东西记录一下了。
参考
- 《编译器设计》(《Engineering a Compiler》)
- 龙书
大体思路
AST => 线性IR(三地址代码) => 构建CFG => (future),可能要加SSA(静态单赋值形式)。
线性IR指令的一些要点
- 全局变量用@ name表示,局部变量用%name表示。
- 为了方便起见,在不同scope的变量,即便重名,也实际上是不同的变量,所以干脆起成不同的名字。
- 条件语句支持短路求值。
字符串的连接和比较大小,我暂时没想好怎么写,就先表示成函数形式。
构建CFG的一些要点
把整个IR存成一个数据结构,类似于这样
暂时不知道这样好不好,就觉得会方便一点。
小小的例子
对于这样一份代码:
void func(int a, int b) {
println("happy "