一片自留地 斯坦福 CS143(编译原理)代码生成

magicyang · 2021年03月12日 · 1386 次阅读

codegen 综述

结合上一节的 stack-machine 举例说明:

这里转化成 MIPS 的指令集。

这里定义了 cgen(e):

表达式示例:

举例说明是否可以用临时的寄存器替换 stack

答案是因为 cgen(e2) 是一个递归函数,因此不行,变量需要先压栈。

条件表达式示例:

函数调用和变量引用


函数调用和 activation record 强相关。

函数调用会使用 jal 的指令,跳转到函数对应的地址:

函数调用的 cgen:

jr 指令(callee):

简单看一下函数调用的状态:

由于 activation record 都是压栈记录的,因此并不是很好保存。

解决方法,使用 frame point:

举例说明:

codegen 人工示例:


sp,fp 有的时候不注意还是有点绕的,同时这个代码很不效率,真实情况下是不会出现这种情况的。

临时变量管理:


NT(e) 的定义:

这里求的是 max,而不是相加,处理过的变量可以被释放。
相关的公式:

举例说明:

AR 占用空间的计算公式:

结构如下图所示:

整理来看临时变量:

举例说明加法函数:

object

子类的特性:

举例说明:

对于 A,B,C 中的属性 a,需要在同一个位置。

这里说的还是有些抽象。
以 cool 的 object 结构进行说明:


继承的属性排布规则:

示例:

很多程序语言都有函数复写的功能,这里就涉及了 dispatch table 的概念:

dispatch table 示例:

dispatch table 和 object 结构结合起来看:

这样做的优势在于 method 的代码可以复用。

暂无回复。
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册