================================================================================
程序运行过程:预处理(Prepressing)、编译(Compilation)、汇编(Assembly)、链接(Linking).
================================================================================
预处理:主要处理那些源代码文件中以“#”开始的预编译指令(“#include”,“#define”)
1、将所有的“#define”删除,并且展开所有的宏定义。
2、处理所有条件预编译指令,比如"if","#ifdef","#elif","#else","#endif"。
3、处理“#include”预编译指令,将被包含的文件插入到该预编译指令的位置。注意,这个过程是递归进行的,
也就是说被包含的文件可能还包含其他文件。
4、删除说有的注释“//”和“/* */”。
5、添加行号和文件名标识,比如#2“hello.c”2,以便于编译时编译器产生调试用的行号信息及用于编译是产生
编译错误或敬告时能够显示行号。
6、保留所有的#pragma编译器指令,因为编译器需要使用他们。
================================================================================
汇编:
汇编器是将汇编代码转换成机器可执行的指令,每一个汇编语句几乎够对应一条机器指令。
没有复杂的语法,没有语义,不需要指令优化,根据汇编指令和机器指令对照表一一翻译
================================================================================
链接:模块间通信的过程
程序量加大,程序分成模块
模块间通信:(静态语言c/c++):模块间的函数调用,模块间变量访问
函数访问须知道目标函数的地址,变量访问也许知道目标变量的地址
以上归结为:模块间符号的引用
链接过程主要包括:地址和空间分配(Address and Storage Allocation)
符号决议(Sysbol Resolution)
重定位(Relocation)
================================================================================
可执行文件生成:每个模块的源代码文件经过编译器编译成目标文件,目标文件和库一起链接
形成最终可执行文件。
================================================================================