学习C语言之最熟悉的陌生人~编译和链接

💕💕这里是c语言之汇编与链接💕💕

💕💕想要了解更多内容,请点进我的主页呱OMGmyhair的博客主页💕💕

前言:

你也许知道在我们编译我们的程序时,会有以下四个步骤:预处理、编译、汇编、链接。但是其中具体的奥秘,你可能就不大清楚了,今天我就来带你认识这几位最熟悉的陌生人~😊😊

首先,以gcc为例分解编译过程:

1.预处理/预编译 

1.1预处理过程

在这个过程里,源文件和头文件被处理成以.i为后缀的文件。

在这一步里,主要处理源代码文件中以“#”开始的预编译指令。例如我们经常使用的:#define、#include。

1.2主要处理规则 

  • 将所有的 #define 删除,并展开所有的宏定义。
  • 处理所有的条件编译指令,如: #if、#ifdef、#elif、#else、#endif 。
  • 处理#include 预编译指令,将包含的头⽂件的内容插⼊到该预编译指令的位置。这个过程是递归进 ⾏的,也就是说被包含的头⽂件也可能包含其他⽂件。
  • 删除所有的注释
  • 添加⾏号和⽂件名标识,⽅便后续编译器⽣成调试信息等。
  • 保留所有的#pragma的编译器指令,编译器后续会使⽤。 

在这一过程里,包含的头文件会被展开,而#define标记的标识符会被替换。

例如:

这一段代码会在预处理阶段被处理成:#define被删除,对标识符进行替换

2.编译

2.1编译过程

编译过程就是将预处理后的⽂件进⾏⼀系列的:词法分析、语法分析、语义分析及优化,⽣成相应的 汇编代码⽂件。
编译过程可以分为以下六步:

2.2词法分析

将源代码程序被输⼊扫描器,扫描器的任务就是简单的进⾏词法分析,把代码中的字符分割成⼀系列 的记号(关键字、标识符、字⾯量、特殊字符等)。

2.3语法分析

接下来语法分析器,将对扫描产⽣的记号进⾏语法分析,从⽽产⽣语法树。这些语法树是以表达式为节点的树。在语法分析的同时,很多运算符的优先级和含义会被确定下来。如果出现了表达式不合法,比如各种括号不匹配、表达式中缺少操作符等,编译器就会报告语法分析阶段的错误。

2.4语义分析

由语义分析器来完成语义分析,即对表达式的语法层⾯分析。编译器所能做的分析是语义的静态分
析。静态语义分析通常包括声明和类型的匹配,类型的转换等。这个阶段会报告错误的语法信息。

3.汇编

汇编器是将汇编代码转转变成机器可执⾏的指令,每⼀个汇编语句⼏乎都对应⼀条机器指令。就是根据汇编指令和机器指令的对照表⼀⼀的进⾏翻译,也不做指令优化。

4.链接

随着代码量日渐增长,人们将代码按照功能和性质划分,形成了各种各样的功能模块。而将这些我们需要的模块联系起来的过程就是链接。而链接过程主要包括了地址和空间分配、符号决议、和重定位等这些步骤。在最基本的静态链接过程中,每个模块的源代码文件经过编译器编译成目标文件,目标文件和库一起链接形成最终可执行文件。最常见的库就是运行时库,它是支持程序运行的基本函数的集合。

举个例子,当我们在引用别的模块中的函数时,main不知道这个函数的地址,于是它将该函数地址搁置。等到链接器进行链接时,链接器会根据这个函数名去相应模块查找该函数的地址,然后再将main函数中搁置的地址进行修正。这个地址修正的过程被称为重定位,而要被修正的地方叫重定位入口。

  • 13
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值