7

ucc编译器(中间代码生成)

 3 years ago
source link: https://feixiaoxing.blog.csdn.net/article/details/118055827
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

ucc编译器(中间代码生成)

费晓行 2021-06-19 17:07:55 34
分类专栏: ucc编译器

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】

    所谓中间代码生成,就是生成一种和具体汇编语言无关的中间代码。生成中间代码有很多的好处,一方面它可以转化成不同的汇编语言,使得后端移植变得很容易;另外一方面,中间代码可以做很多优化工作,剔除大量的冗余代码、无效代码、垃圾代码。

    之间在语法分析、语义分析的时候,我们一直提到declaration、expression、statement这三种语句。等真正走到中间代码生成这个环节的时候,其实只需要处理expression和statement的翻译就可以了,declaration本身只是申明,这一部分其实可以省略了。

1、函数入口

void Translate(AstTranslationUnit transUnit)

2、语句翻译

tranexpr.c

https://github.com/sheisc/ucc162.3/blob/a92719fff0ab7eb5b0c45768acedabb3cd70ca05/ucc/ucl/tranexpr.c

transtmt.c

https://github.com/sheisc/ucc162.3/blob/a92719fff0ab7eb5b0c45768acedabb3cd70ca05/ucc/ucl/transtmt.c

3、打印生成的中间代码

uildasm.c

https://github.com/sheisc/ucc162.3/blob/a92719fff0ab7eb5b0c45768acedabb3cd70ca05/ucc/ucl/uildasm.c

4、中间代码格式

opcode.h

对应结构体,

5、gen.c

    这是文件是中间代码生成最基础的一个文件,中间代码需要处理的很多基础工作都是在这里完成的。比如创建临时变量、创建跳转、创建返回值、创建函数调用等等。

6、不失一般性,我们以statment的翻译作为举例说明,

6.1 入口函数

6.2 if-statement翻译

6.3 while-statement翻译

6.4 break-statement翻译

6.6 return-statement翻译

6.7 switch-statment翻译

    switch-statement翻译几乎是statement翻译里面最复杂的一部分。整个处理过程由TranslateSwitchStatement、TranslateSwitchBuckets、MergeSwitchBucket这三个部分组成。

TranslateSwitchStatement是总的入口,TranslateSwitchBuckets负责排序,MergeSwitchBucket负责每个case前后的拼接,这部分可以专门写一篇文章介绍下。

6.8 和expression的对接

6.9 可开可关的优化

6.10 总结

    中间代码的生成其实有很多的套路。比如说if语言、for语言、while语言、do{}while()语言翻译,这些都是套路。如果同学们有兴趣实现一套自己的语言,这部分完全可以直接拿过来使用。

    另外一个需要重点掌握的,就是opcode.h。这部分和汇编语言基本是一一对应的。中间语言生成对应的汇编指令,本质上寻找合适的寄存器、查表获取对应的汇编指令,这样其实就可以完成汇编代码生成了。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK