被隐藏的过程
- 预处理(Prepressing)- 展开宏定义(处理#define,#include),删除注释,添加行号和文件名标识。生成.i 预处理文件
- 编译(Compilation)- 词法分析、语法分析、语义分析、优化。预处理+编译用
ccl
完成。生成.s 汇编代码文件 - 汇编(Assembly)- 把汇编代码转成机器可执行的指令,不需要做指令优化。用汇编器
as
完成。生成.o 目标文件(object file) - 链接(Linking)- 用链接器
ld
完成。
编译器做了什么
通常,编译过程分为6步:扫描、语法分析、语义分析、源代码优化、代码生成、目标代码优化。
1 词法分析(src -> Tokens, Scannar:lex)
- 源代码进入扫描器,用有限状态机 把源代码的字符分割成
Token
。Token
一般包括关键字、标识符、字面量、特殊符号。 - 同时,扫描器也会完成其他工作,例如将标识符放到符号表,将数字、字符串常量放到文字表等。
- lex,可以根据用户描述好的词法规则,来进行词法扫描的,词法扫描器。
2 语法分析(Tokens -> ST, Parser :yacc)
- 对Tokens进