美文网首页
Code Generation + Garbage Collec

Code Generation + Garbage Collec

作者: 98Future | 来源:发表于2017-11-29 09:21 被阅读0次

    在前面已经实现好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:

    相关文章

      网友评论

          本文标题:Code Generation + Garbage Collec

          本文链接:https://www.haomeiwen.com/subject/wgmebxtx.html