编译过程的一些知识,针对C/C++
2017-04-16 12:19
211 查看
——摘自《高级C/C++编译技术》
1.预处理阶段
2.语言分析阶段
3.汇编阶段
4.优化阶段
5.代码生成阶段
编译过程的第一步是使用“预处理程序”这个特殊的文本处理程序来处理源代码文件。预处理程序会执行下面列出的一项或多项操作:
*将#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源代码文件翻译成对应二进制目标文件集合。
链接过程:将二进制目标文件的集合生成二进制可执行文件。
一、 前言
编译过程粗略的划分为几个阶段: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源代码文件翻译成对应二进制目标文件集合。
链接过程:将二进制目标文件的集合生成二进制可执行文件。
相关文章推荐
- C++编译过程中常见的一些错误
- 编译过程的一些小知识——内部连接与外部连接
- C++一些基本概念总结【面向过程篇】——编译预处理
- 编译过程的一些小知识——LIB与DLL的区别
- C/C++一些知识4(重载与多态、虚继承)
- 【转】C++编译过程中"没有找到MFC80UD.DLL,因此这个程序未能启动.重新安装应用程序可能会修复此问题"? 的彻底解决
- C++应用程序的编译过程
- C/C++开发过程中的一些bug
- C/C++一些知识3(面向对象)
- java编译过程与c/c++编译过程不同
- VC中编译、运行程序一些知识
- C++编译链接、过程
- C++的一些编译选项说明
- c++碰到的一些细节知识
- GCC编译初步知识 - [C/C++]
- 编译预处理一些知识简单总结
- 自己总结C/C++的一些容易被遗忘的基础知识!
- 今天学到的C++的一些新知识!
- c++模板类(一)理解编译器的编译模板过程
- C/C++一些知识2(指针)