================================================================================

程序运行过程:预处理(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)

================================================================================

可执行文件生成:每个模块的源代码文件经过编译器编译成目标文件,目标文件和库一起链接

     形成最终可执行文件。

================================================================================