编译器的工作可以分成若干阶段,每个阶段把源程序从一种表示变换成另一种表示。

词法分析

词法分析阅读构成源程序的字符流,按编程语言的词法规则把它们组成词法记号( token )流。

语法分析

语法分析( syntax analysis )简称分析( parsing ),它检查词法分析输出的记号流是否符合编程语言的语法规则,并依据这些规则所体现出的语言构造( construct,如函数、语句、表达式等 )的层次性,用各记号的第一元建成一种树形的中间表示,这个中间表示用抽象语法的方式描绘了该记号流的语法情况。一种典型的中间表示是语法树,其中内部结点表示运算,它们的子结点代表该运算的运算对象。

语义分析

语义分析阶段使用语法树和符号表中的信息,依据语言定义来检查源程序各部分之间的语义一致性,以保证程序各部分能有意义地结合在一起。它还收集类型信息,把它们保存在符号表或语法树中。

语义分析的一个重要部分是类型检查,编译器检查每个算符的运算对象,看它们的类型是否适当。例如,当实数作为数组的下标时,许多语言的定义都要求编译器报告错误。语言定义也可能允许运算对象的类型作隐式转换,例如当二元算术算符作用于一个整数和一个实数时,编译器会把其中的整数转换为实数。

中间代码生成

经过语法分析和语义分析后,许多编译器为源程序产生更低级的显式中间表示,可以把这种中间表示想像成一种抽象机的程序。这种中间表示必须具有两个性质:它易于产生并且易于翻译成目标程序。

代码优化

独立于机器的代码优化阶段试图改进中间代码,以便产生较好的目标代码。通常,“较好”是指执行较快,但也可能期望其他目标,如目标代码较短或目标代码执行时能耗较低。

代码生成

代码生成是指取源程序的一种中间表示作为输入并把它映射到一种目标语言。如果目标语言是机器代码,则需要为源程序所用的变量选择寄存器或内存单元,然后把中间指令序列翻译为完成同样任务的机器指令序列。