版权声明:本文为博主原创文章,转载请附上本文链接地址。from : https://blog.csdn.net/lovechris00 https://blog.csdn.net/lovechris00/article/details/72821757
编译过程流程图
预编译(预处理)
预处理器:是在真正的编译开始之前,由编译器调用的独立程序。预处理器可包含其他文件以及执行宏替代,条件编译(如删除注释)。
(iOS:因为预处理指令是在编译之前就进行了,所以它比程序运行时进行操作的效率高。)
中间语言
现代的优化型编译器(optimizing compiler)常常用好几种层次的中间代码来表示程序。
高层的中间代码(high level IR)接近输入的源程序
的格式,与输入语言相关(language dependent),包含更多的全局性的信息,和源程序的结构;
中层的中间代码(middle level IR)与输入语言无关。
低层的中间代码(Low level IR)与机器语言类似。
编译
将每个文件的代码都转为二进制代码。在这个过程中,如果有语法错误,会有编译失败的提示,如果成功,那么会生成对应多个目标文件。
编译对象:前端生成并传递过来的中间代码
编译器的工作:编译(程序)分析
常见的编译分析有
- 函数调用树(call tree)
- 控制流程图(Control flow graph)
以及在此基础上的
- 变量定义-使用
- 使用-定义链(define-use/use-define or u-d/d-u chain)
- 变量别名分析(alias analysis)
- 指针分析(pointer analysis)
- 数据依赖分析(data dependence analysis)等。
编译器工作结果
常见的优化和变形
- 函数内嵌(inlining)
- 无用代码删除(Dead code elimination)
- 标准化循环结构(loop normalization)
- 循环体展开(loop unrolling)
- 循环体合并
- 分裂(loop fusion,loop fission)
优化和变形的目的:
- 减少代码的长度
- 提高内存(memory)、缓存(cache)的使用率
- 减少读写磁盘、访问网络数据的频率
- 更高级的优化甚至可以把序列化的代码(serial code)变成并行运算,多线程的代码(parallelized,multi-threadedcode)。
链接
链接:在一个文件中可能会到其他文件,因此,还需要将编译生成的目标文件和系统提供的文件组合到一起,这个过程就是链接。经过链接,最后生成可执行文件。
链接器(Linker)是一个程序,将一个或多个由编译器或汇编器生成的目标文件外加库链接为一个可执行文件。
参考资料:
百度百科-编译器