把一个.c文件变成一个可执行文件(比如window下的.exe)大致分为四步:
1 预编译:这一步的输入为.c文件,输出为.i文件,做的事情是展开所有的include和define;
2 编译:这一步的输入为.i文件,输出为.as文件(汇编文件)。详细地说,分为五个步骤:
(1)词法分析:将源代码分割成一系列记号,关键字、标识符之类;
(2)语法分析:根据一些语法规则(这里就是c的语法)将词法分析的输出建立一棵语法树;
(3)语义分析:分析语法树上的运算啊赋值啊之类的合不合法(比如两个指针相乘就是不合法的);
(4)中间语言生成:生成中间代码(比如三地址码),然后可以在中间代码上做一些优化;
(5)目标代码生成:将目标代码翻译成汇编,然后可以对汇编代码做一些优化。
3 汇编:这一步的输入为.as文件,输出为目标文件(比如window下就是.obj文件)。
4 链接:这一步的输入为很多目标文件,输出为可执行文件。链接主要做了两件事情:符号决议和重定位。符号决议用来确定一个变量或者函数到底是哪一个,重定位是确定符号的地址。