在前面已经实现好Semantics, Type-Checking等的基础上 完成编译器最后一部分,code generation和garbage collection, 这个是Run-Time的事情!
完整版流程:
代码传入--> compiler--> 先在compile Time的时候 check一下 各种Type是没有问题的 然后
--> code Generator.
Code Generator 主要就是output出一堆汇编代码 然后给更加底层的汇编去执行。汇编代码里涉及到register的一些调用, 所以还要思考怎么样最优的使用register 不浪费。【以及对于dead object 要清理】
例子:
output:
首先会先要做许多的Initialization.
Order:
整个程序里会有许多的class类型,最重要的几个排在最前面,比如Object, IO, Int, Bool, String,Main. 其他的就随便放。
Init:
Labels:
label是一个Section 的code的路口,主要是为了汇编语言用的。 比如一个while Loop 就会有一个起始的Label,继续执行会跳回Label起点 break的话会jump到别的label。
Value_initialization:
初始化变量值
这一步其实挺难的,要把变量的地址 存一个数据。
Dispatch Table:
每个类都有一个指针能够指向Dispatch Table。Dispatch Table里存放了这个Class 所有的function,包括从父类继承来的和自己定义的。所以在code-generation 开始run的时候,编译器要根据order-List 做一个DFS traversal 把所有class的dispatch table 填好,然后可以选择放在一个HashTable里。用DFS的原因是, 我们每看到一个class,就可以 根据继承关系从父类往下走,这样就可以把父类的方法传递下去填充进子类的Dispatch Table里。【每一个Node节点表示一个class,这个节点里会有父类子类的继承信息。这个是Semantics那里做的】
例:
Object:
Prototype Objects:
在Cool语言里, 要分配一个新object在Heap里的唯一方法是使用Object.copy 所以每个Class都要有一个prototype 模板object 可以用来放在heap里。 Prototype Object包含Class Tag, Object size, dispatch Information。
例:
Execution startup: