编译原理引论
语言处理器
编译器
可以阅读以某一种语言(源语言)编写的程序,并把该程序翻译成为一个等价的、用另一种语言(目标语言)编写的程序
重要任务之一是报告它在翻译过程中发现源程序中的错误
解释器
直接利用用户的输入直接执行源程序中指定的操作
对比
解释器的错误诊断效果通常比编译器的好,因为解释器逐个语句的执行源程序
一个编译器的结构
分析部分——(称为前端)
把源程序分解成多个组成要素,并在这些要素之上加上语法结构
使用该结构来创建该源程序的一个中间表示
如果检查出源程序没有按照正常的语法构成,或者语义不一致,它就必须提供有用的信息,使得用户可以按此进行改正
收集有关源程序的信息,并把信息存放在一个称为符号表的数据结构中
符号表将和中间表现形式一起传送给综合部分
综合部分——(称为后端)
根据分析部分传送的符号表和中间表现形式来构造用户期待的目标程序
词法分析
编译器的第一步骤
词法分析器读入组成源程序的字符流,并且将它们组织成为有意义的词素的序列
对于每个词素,词法分析器产生如下形式的词法单元(token):<token-name,attibute-value>
语法分析
编译器的第二个步骤
使用词法单元token的第一分量token-name来创建树形的中间表示
重用的表示方法是语法树,树中的每个内部结点表示一个运算,而该结点的子结点便是该运算的分量
语义分析
语义分析器使用语法树与符号表中的信息来检查源程序是否和语言定义的语义一致
同时也收集类型信息,并把这些信息存放在语法树或符号表中,以便在随后的中间代码生成过程中使用
语法分析的一个重要部分是类型检查
中间代码生成
在把一个源程序翻译成目标程序的过程中,一个编译器可能构造出一个或多个中间表示
中间表示可以有多种形式,语法树就是其一
当编译器生成一个明确的低级的或类机器语言的中间表示,这个表示看作是抽象机器的程序
该中间表示应具备:易于生成;能够被轻松的翻译成目标机器的语言
代码优化
机器无关的代码优化步骤试图改进中间代码,以便生成更好的目标代码
更好的:以为着更快,但是也可能会有其他目标,如更短的或能耗更低的目标代码
代码生成
代码生成器以源程序的中间表示形式作为输入,并把它映射到目标语言
如果目标语言是机器代码,那么就必须为程序使用的每个变量选择寄存器或内存位置
中间指令被翻译成为能够完成相同任务的机器指令序列
代码生成的重要部分之一:合理分配寄存器以分配变量的值
符号表管理
编译器的重要功能之一是记录源程序中使用的变量的名字,并手机和每个名字的各种属性和有关的信息
这些属性可以提供一个名字的存储分配、它的类型、作用域(即在程序中的哪些地方可以使用这个变量的值)等信息
对于过程名字,这些信息还包括:参数数量、类型、每个参数的传递方法以及返回类型
将多个步骤组成趟
多个步骤的组合可以组合成一趟
每趟读入一个输入文件并产生一个输出文件
可以把不同的前端和某个目标机的后端结合起来,为不同的源语言建立目标机上的编译器
可以把前端和不同的目标机后端结合,建立针对不同目标机的编译器
编译构造工具
常用的编译构造工具包括:语法分析器的生成器、扫描器的生成器、语法制导的翻译引擎、代码生成器的