当前位置:编程问答 > C/C++ >

深入浅出编译原理-2-gcc编译器概览

引言

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小结

一个高级语言写的程序的执行,要经过很复杂漫长的过程。这个过程对我们程序员来说却经常被忽视。

向编译器创造者致敬。

编译原理的学习过程一般比较枯燥,多一个人同行,就多一份趣味和快乐!
作者:rill_zhen

补充:软件开发 , C语言 ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,