编译过程

一个源文件到可执行程序到底经历了哪几个过程?
它的编译链接过程分为四个步骤:预处理、编译、汇编、链接。

这里写图片描述

1.预处理

1)处理所有的#include预编译指令,将被包含的文件插入到预处理指令的位置。这个过程是递归的。
2)将所有的#define删除,并展开所有的宏定义。
3)处理所有的预处理指令,比如:#if、#denif、#ifdef、#else。
4)过滤掉所有的注释 “//” 和”/* */”中的内容。
5)添加行号和文件名标识,比如#2”test.c” 2,以便于编译时编译器产生调试用的行号信息及用于编译时产生编译错误或警告时能够显示行号。
6)保留所有的#pragma 编译器指令,因为编译器需要使用它们。

2.编译

编译过程就是把预处理完毕的文件进行一系列的词法分析、语法分析、语义分析以及优化后产生相应的汇编代码文件。
编译过程分为 6 步:扫描(词法分析)、语法分析、语义分析、源代码优化、代码生成和目标代码优化。
这里写图片描述
1)词法分析。
源代码程序被输入到扫描器,扫描器简单的进行词法分析。
2)语法分析。
语法分析器对扫描器产生的记号进行语法分析,从而产生语法树。
在这个阶段,如果出现了表达式不合法,比如括号不匹配,表达式中缺少操作数等,编译器就会报告语法分析阶段错误。
3)语义分析。
语义分析是由语义分析器完成的。语法分析器仅仅是完成了对表达式的语法层面的分析,但是它并不了解这个语句是否真正有意义。
4)中间语言生成
现代编译器往往有着很多层次的优化,往往在源代码级别会有一个优化过程。直接在语法树上进行这类优化比较困难,所以,源代码优化器往往将整个树转换成中间代码。
中间代码使得编译器可以被分成前端和后端。编译器前端负责产生机器无关的中间代码,编译器后端负责将中间代码转换成目标代码。
5)目标代码生成与优化。
源代码级优化器产生中间代码标志着下面的过程都属于编译器后端。编译器后端主要包括代码生成器和目标代码优化器。
代码生成器将中间代码转换成目标机器代码,这个代码十分依赖目标机器。因为不同的机器有着不同的字长、寄存器、整数数据类型和浮点数数据类型等。
目标代码优化器对目标代码进行优化。

3.汇编

汇编是将上一步的汇编代码转换成机器码(machine code),这一步产生的文件叫做目标文件,是二进制格式。

4.链接

把每个源代码模块独立地编译,然后按照要求将他们组装起来,这个组装过程就是链接。
链接的主要内容就是把各个模块之间相互引用的部分处理好,使得各个模块之间能够正确的衔接。
但从原理上将,它的工作无非就是把一些指令对其他符号地址的引用加以修正。链接过程主要包括地址和空间的分配、符号决议和重定位等这些步骤。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值