编译原理笔记
1 和编译器相关的程序
- 解释程序。解释程序是如同编译器的一种语言翻译程序。它与编译器的不同之处在于:它立即执行源程序而不是生成在翻译完成之后才执行的目标代码,有比较好的错误诊断效果。他是把每行源程序翻译成一行对应的机器语言,然后执行他。下一次执行同一行码依然要先翻译再执行,所以性能不如编译执行的程序,编译执行的程序只要翻译一次就够了,编译好之后直接执行机器码。
- 汇编程序。汇编程序是用于特定计算机上的汇编语言的翻译程序。正如前面所提到的,汇编语言是计算机的机器语言的符号形式,它极易翻译。有时,编译器会生成汇编语言以作为其目标语言,然后再由一个汇编程序将它翻译成目标代码。
- 连接程序。编译器和汇编程序都经常依赖于连接程序,它将分别在不同的目标文件中编译或汇编的代码收集到一个可直接执行的文件中。在这种情况下,目标代码,即还未被连接的机器代码,与可执行的机器代码之间就有了区别。连接程序还连接目标程序和用于标准库函数的代码,以及连接目标程序和由计算机的操作系统提供的资源(例如,存储分配程序及输入与输出设备) 。
- 装入程序。编译器、汇编程序或连接程序生成的代码经常还不完全适用或不能执行,但是它们的主要存储器访问却可以在存储器的任何位置中且与一个不确定的起始位置相关。这样的代码被称为是可重定位的(r e l o c a t a b l e) ,而装入程序可处理所有的与指定的基地址或起始地址有关的可重定位的地址。
- 预处理器。预处理器是在真正的翻译开始之前由编译器调用的独立程序。预处理器可以删除注释、包含其他文件以及执行宏(宏 m a c r o是一段重复文字的简短描写)替代。
- 调试程序。调试程序是可在被编译了的程序中判定执行错误的程序,它也经常与编译器一起放在 I D E中。运行一个带有调试程序的程序与直接执行不同,这是因为调试程序保存着所有的或大多数源代码信息(诸如行数、变量名和过程) 。它还可以在预先指定的位置(称为断点(b r e a k p o i n t) )暂停执行,并提供有关已调用的函数以及变量的当前值的信息。
- 描述器。描述器是在执行中搜集目标程序行为统计的程序。程序员特别感兴趣的统计是每一个过程的调用次数和每一个过程执行时间所占的百分比。
2 编译的步骤
- 词法分析,扫描字符流,并组织成为有意义的词素序列。对于每个词素,词法分析器会产生如下的词法单元token。<token name,attribute value>
- 语法分析,使用上一个步骤产生的词法单元的第一个分量来创建树形的中间表示形式,例如抽象语法树,内部节点表示一个运算,叶子节点表示运算的分量。
- 语义分析器,用语法树和符号表的信息来检查源程序是否和程序语言定义的语义一致。同时他也会收集类型信息,把信息存放在语法树或者符号表中,以便在随后的中间代码生成步骤中使用。语义分析的一个例子是类型检查。
- 中间代码生成,把源程序翻译成目标代码的过程中,编译器所构造出来的中间表示形式。这种中间表示形式比较低级,并且和机器语言比较接近,可以看做是抽象的机器程序,它可以很容易被翻译成目标机器上的语言。例如三地址代码(z=x op y),他由一组类似汇编的指令组成,每个指令具有三个运算分量,每个运算分量都像一个寄存器。右部最多只能有一个运算符,运算分量可以少于3个:
t1=inttofloat(60)
t2=id3*t1
t3=id2+t2
id1=t3
- 代码优化,机器无关的中间代码,试图改进中间代码,以便生成更好的目标代码。
- 代码生成,以中间代码作为输入,映射到目标语言。如果目标语言是机器代码,那么就必须为程序的每个变量选择寄存器或者内存位置,然后中间指令被翻译成相同功能的机器指令序列。
- 符号表管理,记录程序中所使用变量的名字,并收集每个名字的各种属性的信息。这些属性包括,名字的存储分配、他的类型、作用域。如果是方法的名字,这些信息还包括参数变量和类型,每个参数的传递方法(值传递或者引用传递),以及返回类型。符号表数据结构为每个名字提供一个记录条目,从记录条目里面可以查找到名字的有关信息。变量的作用域就是通过在每个环境下面建立单独的符号表来实现作用域隔离的。
3 上下文无关文法定义的四个要素:
- 一个终结符号集合,他也成为词法单元。终结符号是该文法所定义的语言的基本符号的集合。
- 一个非终结符号集合,每个非终结符号代表一个终结符号串的集合
- 一个产生式集合,每个产生式包括一个被成为产生式头或左部的非终结符号,一个箭头,和一个称为产生式体或产生式右部的由终结符号和非终结符号组成的序列。
- 指定一个非终结符号为开始符号
例如数位和+、-符号组成的表达式9-5+2,数位之间必须有+、-。该文法的产生式为
list->list+digit
list->list-digit
list->digit
digit->0|1|2|3|4|5|6|7|8|9
该文法的终结符号为+、-、0、1、2、3、4、5、6、7、8、9
一个文法的语言的另一个定义是指任何能够由某棵语法分析树生成的符号串的集合。为一个给定的非终结符号串构造一个语法分析树的过程称为对该符号进行语法分析。
9-5+2可以构建为,以非终结符号串list为开始符号。他的内部节点为非终结符号,而抽象语法树的内部节点则是操作符。
2.6 待续 。。。