引言
gcc现在的意思是“GUN编译器集合”,这里说的是上个世纪的意思“GUN C语言编译器”。
2.1程序的一般编译过程
以gcc为例:
一般情况下,比如我们有一个源文件:main.c,里面写的是我们的代码。想执行以下,gcc main.c,执行以下这个命令就会生成一个a.out的文件。然后./a.out就可以执行了。但是,这中间的过程可注意过吗?这就是编译原理要研究的内容了。这一节先说一下整个的处理过程,具体细节会在以后逐渐讨论,包括,词法分析,语法分析,中间代码生成和优化,优化又包括机器无关优化,并行性和局部性优化,等等这些内容。以及如何自己发明一种语言,然后自己动手写一个编译器将其编译!
分别加入参数可查看各个阶段的结果。
在上图中,CPP是“预编译”的缩写,AST是“抽象语法树”的缩写,SSA是“静态单赋值”的缩写,RTL是“寄存器传输语言”的缩写。各种含义,需要仔细品味一下,呵呵。
过程如下:
1》将不同语言,进行词法分析,语法分析,得到对应语言的AST
2》这些AST之间有稍微的差别,然后把这些差别去除,生成通用AST
3》按照AST,生成中间代码(三地址代码,即:x=y op z)
4》对中间代码进行优化,这部分的任务很艰巨
5》根据目标机器的汇编描述,生成对应机器架构的汇编语言
6》到此编译器的任务就算完了,剩下的汇编器。
7》汇编器将其汇编成机器代码(010100101000101010010101010000101011110.。。。。。)
8》连接器ld将源码中调用的库函数连接进来
9》最后,是加载器,将可执行文件加载到内存,并执行之。
2.2编译器的前端处理过程
下面是一句简单的c语句的编译过程。
如图所示:
2.3小结
一个高级语言写的程序的执行,要经过很复杂漫长的过程。这个过程对我们程序员来说却经常被忽视。
向编译器创造者致敬。
编译原理的学习过程一般比较枯燥,多一个人同行,就多一份趣味和快乐!