深度剖析“GCC编译器编译过程”

(这张图是本人画的并非网络图,如果有编译过程没有提到的可以提出来)


首先说说第一步
一.预编译
1.配置编译器环境
 编译器在编译之前要运行配置文件通常叫configure的配置文件,一般这个配置文件是由autoconf生成!
autoconf简介:
autoconf是由GNU组织开发的,autoconf的作用是能检查当前系统环境配置,包括分析一些软件包的依赖属性,并生成configure配置文件!
该配置文件是采用shell脚本格式所编写的,也就是说autoconf所生成的配置文件不需要用autoconf才能读取,只要能够读取shell脚本代码的程序都可以读取!
通过读取configure文件获取一些系统环境变量配置,编译参数,确保能在不同的系统环境下编译出的程序能正常运行!
2.头文件预编译
这里说的头文件编译不是编译头文件,众所周知头文件本身是不会参与编译的,真正参与编译的是.c/.cpo文件,头文件会被拷贝到.c/.cpp文件里一同编译,编译器通过.c/.cpp文件里的#include确定头文件位置并把头文件里面的声明或者变量定义全部拷贝到.c/.cpp文件里由一同编译并生成pch(编译好的代码),pdb(程序数据库文件)文件,通常一些使用imprt加载进来的dll,tld也会一同编译下次编译时会直接使用这个编译结果。这样做大大提高了编译效率,但是要保证更新.h/.cpp文件后一定要重新预编译不然编译器会使用上一次的编译结果。
这个步骤做不做是由程序员决定的,有些IDE会自动做这一步骤提高编译速率!而且IDE会检查如果.h/.c文件被更改会自动重新预编译生成新的pch文件保证不会使用旧的编译结果!
同时在这一步也确定了头文件的依赖关系。
3.宏替换,条件编译
这一步编译器会把用#define定义的宏变量替换成定义值,并做条件编译判断哪些代码要编译哪些代码不需要编译!
4.删除注释
编译器会把源文件中带//,/*符合开头的十进制字符串全部删除!
同时也会删除源文件中额外的空格包括换行缩进!
5.词法分析
词法分析器通常是基于有限状态自动机!同时词法分析器也支持正则表达式!
词法分析器主要作用就是把源文件里的字符(不是用双引号扩起来的字符串)一个一个从左到右的读取到源程序的字符流中并将读取到词法分析器的输入缓冲区里并单词化,例如 int a = 0;那么词法分析读取并分析之后则得到如下信息
int 整形变量声明
a 标识符
= 赋值语句
0 数字
; 语句结束
保存到自己输入缓冲区里供语法分析器调用!一般情况下词法分析器是以函数形式存在的以便语法分析器调用!
词法分析器还会对单词进行分类那些是关键字那些是合法的标识符,这些都是通过正规则表达式来匹配给出!


二.编译
1.语法分析
语法分析器通过调用词法分析器获取词法分析器字符流里的单词符号并抽象的构建成一个语法树得到中间代码开始从左到右的的开始检查是否有语法错误或者表达式错误!一旦发现有错误的语法或者表达式那么语法分析器会生成一个表格来存放第几行的代码发生了什么错误,并在检查完之后把表格里到错误信息输出到屏幕上!有的编译器在发现错误时可以自己更正不过是简单的语义错误!
2.代码优化
代码优化器有两种一种是会对语法分析器分析后的中间代码进行优化调整,另外一种是对汇编生成之后的目标代码进行优化调整!
3.汇编
会把源文件里的代码翻译成汇编指令!不同的系统使用的汇编指令不同!比如Linux和Windows所使用的汇编指令集不同,而且不同的CPU所使用的汇编指令集也是不同的!所以编译器会检查你的CPU所使用的指令集翻译成不同的汇编指令集!


三.汇编
1.将汇编指令转换成二进制数据
这一步会将汇编指令翻译成二进制数据!并且把代码文本(双引号扩起来的字符)一并翻译成二进制!


四.链接
这一步会对一些动态库,静态库以及其它相关文件进行链接,比如printf存放于printf.o文件里那么编译器要把peintf.o和源文件进行链接合并生成可执行文件!

 

注意本篇博客仅针对GCC编译器,其他编译器编译过程可能略有不同但是编译过程都是差不多的!

 

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

17岁boy想当攻城狮

感谢打赏

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值