您的位置:首页 > 编程语言 > C语言/C++

编译过程的一些知识,针对C/C++

2017-04-16 12:19 211 查看
——摘自《高级C/C++编译技术》

一、 前言

编译过程粗略的划分为几个阶段:
1.预处理阶段
2.语言分析阶段
3.汇编阶段
4.优化阶段
5.代码生成阶段

二、 详细介绍

1.预处理阶段

编译过程的第一步是使用“预处理程序”这个特殊的文本处理程序来处理源代码文件。预处理程序会执行下面列出的一项或多项操作:

*将#include关键字标示的含有定义的文件(包括文件和头文件)包含到源代码文件中。

*将#define语句指定的值转换为常量

*在代码中调用宏的位置将宏定义转换成代码

*根据#if、#elif 和 #endif 指令的位置包含或排除特定部分的代码

预处理程序输出的内容就是转换完成的C/C++代码,这些输出结果会供下一编译阶段——语言分析使用。

2.语言分析阶段

(1)词法分析:将源代码分割成不可分割的单词。

(2)语法分析:将提取出来的单词连接成单词序列,并根据编程语言规则验证其顺序是否合理。

(3)语义分析:目的是发现符合语法规则的语句是否具有实际意义。

3.汇编阶段

当源代码经过校验,其中不包含任何语法错误后,编译器才会执行汇编阶段。在这个阶段中,编译器会将标准的语言集合转换成特定CPU指令集的语言集合。不同的CPU包含不同的功能性需求,通常会包含不同的指令集、寄存器和中断,这就解释了为什么不同的处理器要有不同的编译器对其支持。

4.优化阶段

当由源代码文件生成最初版本的汇编代码后,优化过程就开始了,这可以将程序的寄存器使用率最小化。此外,通过分析能够预测出实际不需要执行的部分代码,并将其删去。

5.代码生成阶段

最后到生成编译输出目标文件的阶段,其中每一个目标文件对应一个编译单元。汇编指令会在此阶段转换成对应机器指令的二进制值,并写入目标文件的特定位置。

我理解的目标文件,就是.o文件

三、 目标文件

编译阶段的输出是一个或多个目标文件,概括来讲:
*目标文件是通过对应的源码翻译得到的,由于一个项目中有许多源代码文件,因此编译的结果将是一组目标文件。
*符号(symbol)和节(setion)是目标文件的基本组成部分,其中符号表示的是程序中的内存地址或数据内存。绝大多数的目标文件中都包含代码节(.text)、初始化数据节(.data)、未初始化数据节(.bss)以及一些特殊节(比如调试信息等等)
*构建程序的目的在于:将每个独立的源代码文件进行编译后生成的节拼接到一个二进制可执行文件中。
最终生成的二进制文件中包含了多个相同类型的节(.text、.data和.bss节等),而这些节是从每个独立的目标文件中拼接得到的。
我们可以把一个目标文件看成一个简单的拼贴,进程内存映射看作一幅巨幅镶嵌画,而生成二进制文件的过程就是将这块拼贴放到镶嵌画中恰当位置的过程。

【注意】:目标文件中不包含专门的节会影响堆与栈中的数据。内存映射中的堆与栈内容完全在运行时确定。

通过对程序构建过程逐步分析,我们已经逐渐对整个构建过程有了一个基本的认识:

编译过程:将ASCII源代码文件翻译成对应二进制目标文件集合。

链接过程:将二进制目标文件的集合生成二进制可执行文件。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: