编译和链接(小白初理解)

目录

1. 翻译环境和运⾏环境

 1.2翻译环境

2. 翻译环境:预编译+编译+汇编+链接

2.1预处理(预编译)阶段 

2.2编译 

2.2.1词法分析 

2.2.2语法分析 

2.2.3语义分析 

 2.3 汇编

2.4 链接

 3. 运⾏环境


1. 翻译环境和运⾏环境

翻译环境指的是:这个环境中讲我们输入的代码转换为机器可以执行的指令

执行环境指的是:就是用来执行代码的,程序的样子。

 1.2翻译环境

 翻译环境是由编译和链接这两个过程组成的,在编译中,还有三个小过程

预处理(有些书也叫预编译)、编译、汇编三个过程。

 

 一个c项目会有多个.c 文件一起构建处理,那么那么多 .c 怎么生成的可执行程序呢?

1. 多个 .c 文件经过编译会先生成对应的 .o 文件。

2.在Windows环境下的⽬标⽂件的后缀是.obj,Linux环境下⽬标⽂件的后缀是.o

3.多个.0文件 和链接库 被链接器处理最后形成可执行程序。

4.链接库是指运⾏时库(它是⽀持程序运⾏的基本函数集合)或者第三⽅库。

将编译展开成三个过程后 :

2. 翻译环境:预编译+编译+汇编+链接

2.1预处理(预编译)阶段 

 这个阶段中,.c 和.h文件都被处理为.i 为后缀的文件。

在gcc 中可以观察这阶段的特点命令如下:

gcc -E test.c -o test.i

 预处理阶段主要处理那些源⽂件中#开始的预编译指令。⽐如:#include,#define,处理的规则如下:

1. 将所有的#define 删除,将定义好的宏内容,替换 代码中 的位置。

2.处理所有的编译条件指令如: #if#ifdef#elif#else#endif

#if #elif #endif 和 if语句的用法相似,就是 if else if 类似,但需要用 #endif 来结束#if 的语句。不然不会编译。

3.处理#include 预编译指令,将包含的头⽂件的内容插⼊到该预编译指令的位置。这个过程是递归进⾏的,也就是说被包含的头⽂件也可能包含其他⽂件。

4.删除所有的注释

5.添加⾏号和⽂件名标识,⽅便后续编译器⽣成调试信息等。

6.或保留所有的#pragma的编译器指令,编译器后续会使⽤。

经过预处理后的.i 文件中就没有宏定义了,宏已经被展开了。头文件也都进入.i 文件中了。

 所以当我们⽆法知道宏定义或者头⽂件是否包含正确的时候,可以查看预处理后的.i⽂件来确认。

2.2编译 

编译过程就是将预处理后的⽂件进⾏⼀系列的:词法分析、语法分析、语义分析及优化,⽣成相应的汇编代码⽂件。指令如下
gcc -S test.i -o test.s
下面有一串代码,在编译时会被怎么编译呢?
array [index] = (index+ 4 )*( 2 + 6 );

2.2.1词法分析 

 这些记号被标识后,就要进行语法分析了

2.2.2语法分析 

 语法分析就是把上述的记号,根据先后顺序拆分。

2.2.3语义分析 

语义分析器来完成语义分析,这个阶段会报告错误的语法信息

 

 2.3 汇编

这个阶段就是把汇编代码变为机器可以执行的指令。 

2.4 链接

链接是⼀个复杂的过程,链接的时候需要把⼀堆⽂件链接在⼀起才⽣成可执⾏程序。
链接过程主要包括:地址和空间分配,符号决议和重定位等这些步骤。
链接解决的是⼀个项⽬中多⽂件、多模块之间互相调⽤的问题。

 

 一个文件叫test.c 一个叫add.c 经过编译后都会变成.o后缀的文件。

在test 中使用了add 中的函数和变量。由于 每个文件都是单独编译的。

编译test 的时候根本不知道 add 和g_val 的地址。所以编译器会暂时将这两个指令搁置。

等待最后链接的时候再根据符号去add 文件中查找 函数和变量的地址。

这时候才是真正的有了函数和变量的地址。

这个地址修正的过程叫做:重定位

 3. 运⾏环境

1. 程序必须载⼊内存中。在有操作系统的环境中:⼀般这个由操作系统完成。在独⽴的环境中,程序 的载⼊必须由⼿⼯安排,也可能是通过可执⾏代码置⼊只读内存来完成。
2. 程序的执⾏便开始。接着便调⽤main函数。
3. 开始执⾏程序代码。这个时候程序将使⽤⼀个运⾏时堆栈(stack),存储函数的局部变量和返回 地址。程序同时也可以使⽤静态(static)内存,存储于静态内存中的变量在程序的整个执⾏过程 ⼀直保留他们的值。
4. 终⽌程序。正常终⽌main函数;也有可能是意外终⽌。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值