结合上一节的 stack-machine 举例说明:
这里转化成 MIPS 的指令集。
这里定义了 cgen(e):
表达式示例:
举例说明是否可以用临时的寄存器替换 stack
答案是因为 cgen(e2) 是一个递归函数,因此不行,变量需要先压栈。
条件表达式示例:
函数调用和 activation record 强相关。
函数调用会使用 jal 的指令,跳转到函数对应的地址:
函数调用的 cgen:
jr 指令(callee):
简单看一下函数调用的状态:
由于 activation record 都是压栈记录的,因此并不是很好保存。
解决方法,使用 frame point:
举例说明:
sp,fp 有的时候不注意还是有点绕的,同时这个代码很不效率,真实情况下是不会出现这种情况的。
NT(e) 的定义:
这里求的是 max,而不是相加,处理过的变量可以被释放。
相关的公式:
举例说明:
AR 占用空间的计算公式:
结构如下图所示:
整理来看临时变量:
举例说明加法函数:
子类的特性:
举例说明:
对于 A,B,C 中的属性 a,需要在同一个位置。
这里说的还是有些抽象。
以 cool 的 object 结构进行说明:
继承的属性排布规则:
示例:
很多程序语言都有函数复写的功能,这里就涉及了 dispatch table 的概念:
dispatch table 示例:
dispatch table 和 object 结构结合起来看:
这样做的优势在于 method 的代码可以复用。