编译

五大组成部分

  1. 词法分析:将程序文本拆分成字符或tokens, 跟据语言词法规则分析并识别单词,并以相应的编码方式输出(四大类单词:标识符、关键字、常量、运算符)。
  2. 语法分析:根据语言的语法规则,识别单词之间的关系,并生成语法树,并进行语法检查。
  3. 语义分析:检查语义错误,如类型检查、作用域检查等,并生成中间代码(便于优化、编译程序的移植(LLVM),常用:四元式、三元式和逆波兰式等)。
  4. 优化:减少内存使用或使程序运行的更快。
  5. 代码生成,生成目标程序
    编译程序中都需要包括表格管理(建表和查表)和错误处理模块。

概念

源程序是翻译程序的输入、目标程序是其输出;
汇编程序和编译程序都是翻译程序,前者是将汇编语言转为机器码,但后者是将高级语言转换。
解释程序(python):对源程序进行解释执行程序。
编译-解释程序(java):先编译后将源程序中间形式进行解释执行。

遍(PASS)

对源程序从头到尾扫描一次并做相应加工处理,生成新的源程序中间形式或目标程序,为一遍。扫描几次能够完成5个阶段就称为几遍。
分为单遍和多遍编译器。是否分遍,视具体情况而定(内存大小、语言复杂度等)。分遍后带来的主要缺点就是增加了不少重复性工作(如每一遍输入和输出都要进行文件的读写)。

前后端

前端与源语言有关,后端与目标机器有关。

前后处理器

前处理器:对源程序进行预处理,如C语言中的宏替换、文件包含等。
后处理器:对目标程序进行后处理,如汇编程序中的符号地址替换等。

cool

抽象、静态键入、复用(继承)、内存管理

语义分析

中间代码

四元式

分成四个部分:运算符、两个操作数(运算符左右两边)和结果(一般为编译程序引入的临时变量)。