编译链接一直以来都是程序员所必知必会的知识,如果你都不清楚一个程序到底是如何从一个手写的源文件变成计算机所能识别的指令且能按部就班的执行的话,那么你就不是一个合格的程序员了。这是我的一个老师告诉我的。但是学习了这么久对这块的知识仍是比较模糊,虽然反复学习了很多遍,仍是没有完全掌握,这可能与我的个人学习习惯有关,不太擅长总结,就像我的blog只有聊聊几篇,从今天起我将系统性的对我所学的这些进行一个总结,加深一下自己对这些知识的理解。
那么言归正传,一个源文件到一个进程在这中间到底经历了些什么呢?
- 预编译
- 编译
- 汇编
- 链接
- 运行
简单概括就是这五步,那么这五步具体究竟做了些什么呢?接下来我就一步一步细细回顾一下。
1.预编译
预编译简单来讲就是处理‘#’和标识的。
- 删除#define,进行宏替换。
- 处理预编译指令“#if,#endif,#ifdef,#elif”等等。
- 处理头文件“#include”,进行递归展开。
- 删除注释。
- 添加行号以及文件标识,便于编译出错时,方便报错快速锁定行号。
- 保留#program,交给编译器。这是编译器所必须的。
经过预编译后,这里以c/c++举例,就会生成.i文件。
2.编译
- 词法分