Code Generation + Garbage Collection实现[part1]

在前面已经实现好Semantics, Type-Checking等的基础上  完成编译器最后一部分,code generation和garbage collection, 这个是Run-Time的事情!

完整版流程:

代码传入--> compiler--> 先在compile Time的时候 check一下 各种Type是没有问题的  然后

--> code Generator.


Code Generator 主要就是output出一堆汇编代码 然后给更加底层的汇编去执行。汇编代码里涉及到register的一些调用, 所以还要思考怎么样最优的使用register 不浪费。【以及对于dead object 要清理】

例子:


Code Generation + Garbage Collection实现[part1]_第1张图片

output:

首先会先要做许多的Initialization.


Code Generation + Garbage Collection实现[part1]_第2张图片
Code Generation + Garbage Collection实现[part1]_第3张图片
Code Generation + Garbage Collection实现[part1]_第4张图片


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那里做的】

例:

Code Generation + Garbage Collection实现[part1]_第5张图片

Object:


Prototype Objects:

在Cool语言里, 要分配一个新object在Heap里的唯一方法是使用Object.copy  所以每个Class都要有一个prototype 模板object  可以用来放在heap里。 Prototype Object包含Class Tag, Object size,  dispatch Information。

例:

Code Generation + Garbage Collection实现[part1]_第6张图片

Execution startup:

你可能感兴趣的:(Code Generation + Garbage Collection实现[part1])