编译与链接

compile_and_link

编译器做了什么?

词法分析(scanner):运用“有限状态机”的算法将源代码的字符分割成一系列的记号(Token)。LEX程序,实现词法扫描

语法分析(grammar parser):得到由表达式为节点构造的syntax tree,仅仅完成了语法层面的分析,并不了解这个语句是否有意思。使用工具yacc

语义分析(semantic analyzer):编译器能用的是“静态语义”分析,静态语言通常包含声明、类型的匹配和转换。
经过语义分析后,语法树上的所有节点(表达式)都被标识了“类型”,如果需要隐示转换,会在语法树上插入相应的转换节点。

源代码优化(source code optimizer):在源代码级别进行优化,比如将可以直接计算出的表达式优化掉。
直接在表达树上进行优化是非常困难的,所以通过生成“中间代码”的方式来优化。中间代码有很多种类型,不同的编码器有不同的形式。常见的有thread-address code和P-Code。
中间代码使得编译器可分为前端和后端。前端负责产生机器无关的中间代码,后端负责将中间代码转换成目标机器代码。

目标代码生成(code generator):将中间代码转化为目标机器代码
目标代码优化(target code optimizer):比如选择合适的寻址方式、使用位移代替乘法、删除多余的指令等。

发表评论

电子邮件地址不会被公开。