2.2 编译器做了什么

编译过程一般可以分为6步:扫描、语法分析、语义分析、源代码优化、代码生成和目标代码优化。

扫描器,词法分析,将源代码的字符序列分割成一系列记号。记号分类:关键字、标识符、字面量和特殊符号。其他工作,比如将标识符放到符号表,将数字、字符串常量放到文字表等。C语言的宏替换和文件包含一般不归入编译器的范围而交给一个独立的预处理器。lex程序实现词法扫描。

语法分析器将记号进行语法分析,从而产生语法树。上下文无关语法的分析手段。语法树就是以表达式为节点的树。在语法分析的同时,很多运算符号的优先级和含义也被确定下来。语法分析也有一个现成的程序叫做yacc。

语义分析器,语法分析并不了解语句是否真正有意义。编译器所能分析的语义是静态语义,指在编译期可以确定的语义。静态语义通常包括声明和类型的匹配、类型的转换。

现代的编译器有着很多层次的优化,往往在源代码级别就会有一个优化过程。直接在语法树上作优化比较困难,所以源码级优化器往往将整个语法树转换成中间代码,它是语法树的顺序表示。中间代码使得编译器可以被分为前端和后端。编译器前端产生机器无关的中间代码,编译器后端将中间代码转换成目标机器代码。

代码生成器和目标代码优化器,现代编译器可以将一个源码文件编译成一个未链接的目标文件,然后由链接器将这些目标文件链接起来形成可执行文件。

 

您还未添加分享代码,请到主题选项中,添加百度分享代码!

您可以选择一种方式赞助本站

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

图片 表情