最近在看C语言的基础知识,之前只关注编译最后生成的二进制文件,不知道编译过程,学习到了整理一下。
过程如下:
预编译---->编译---->汇编---->链接器输出---->二进制文件。
编译器将编译分为预处理、编译和汇编。
连接器把各个独立的模块链接为可执行程序。
静态链接在编译期完成,动态链接在运行时完成。
1、处理所有的注释,以空格代替。
2、将所有的#define删除,并且展开所有的宏定义。
3、处理条件编译指令#if、#ifdef、#elif、#else、#endif。
4、处理#include,展开包含的文件。
5、保留编译器需要使用的#pragma指令。
总结:预编译改替换替换,展开#include文件,保留#pragma指令。
1、对预处理文件进行词法分析、语法和语义分析:
词法分析:关键字、标识符、立即数是否合法;
语法分析:表达式是否遵循语法规则;
语义分析:在语法基础上分析表达式是否合法。
2、分析结束后进行代码优化生成相应的汇编代码文件。
总结:编译对预处理文件进行分析,生成汇编代码。
汇编器将汇编代码转化为机器可执行的指令,每个汇编语句几乎都对应一条机器指令。
总结:汇编是把代码转化为机器能听懂的文件。
连接器是把代码中各个汇编生成的o文件连接起来。
分为静态链接
动态链接: