本学习笔记参考书目《编译原理(第二版)》(清华大学出版社)
目录
一、编译程序
1、什么是编译程序
2、编译程序的重要性
3、高级语言程序处理过程
二、编译过程与编译程序的结构
1、编译过程
2、六个阶段
3、编译程序的结构
4、编译阶段的组合
三、解释程序
1、编译程序与解释程序
1.从功能上看,编译程序就是一个语言翻译程序,即把一种语言(源语言)书写的程序翻译成另一种语言(目标语言)的等价程序。
2.编译程序的功能是:将高级语言程序(源程序)翻译成机器语言程序(目标程序)。
3.编译程序的基本任务:将源程序翻译成等价的目标语言程序。
1.使得多数计算机用户不必考虑与机器有关的繁琐细节。
2.使程序员和程序设计专家独立于机器。
1.一个源程序,分成多个模块存放在不同文件中。
2预处理程序完成上述源程序汇集在一起的任务(部分预处理程序也负责宏展开)。
3.编译程序生成汇编代码形式的目标程序,经由汇编程序翻译成可再装配的机器代码。
4.装配/连接编辑程序与某些库程序连接成真正能在机器上运行的代码。
1.编译程序完成从源程序到目标程序的翻译工作的复杂的整体过程。
2.整个过程分阶段进行。
(1)每个阶段将源程序的一种表现形式转换为另一种表现形式。
(2)各阶段进行的操作在逻辑上紧密相连。
词法分析、语法分析、语义分析、中间代码生成、代码优化、目标代码生成。
1.编译过程的第一个阶段。
2.该阶段的任务是:从左到右一个字符一个字符读入源程序,对字符流进行扫描和分解,从而识别出单词(也叫单词符号或符号,逻辑上紧密相连的一组字符,具有集体含义)
1.编译过程的第二个阶段。
2.任务是在词法分析的基础上将单词序列分解成各类语法短语。
3.依据:语言的语法规则(即描述程序结构的规则)
4.语法树:
注:词法分析与语法分析对比
1.相同点:本质上都是对源程序的结构进行分析。
2.不同点:词法分析的任务仅对源程序线性扫描即可完成,只需要线性扫描输入流。但不能用于识别递归定义的语法成分,如:不能用此办法匹配表达式中的括号。
1.审查源程序有无语义错误。
2.为代码生成阶段收集类型信息。
1.部分编译程序将源程序变成内部表示形式,即中间语言或中间代码。
2.是一种结构简单,含义明确的记号系统。
3.设计原则:容易生成、容易翻译成目标代码。
4.例:四元式形式(运算符,运算对象1,运算对象2,结果)
1.任务:对前阶段产生的中间代码进行变换或改造。
2.目的:使生成的目标代码更为高效,即省时间与省空间。
1.编译的最后阶段。
2.任务:把中间代码变换成特定机器上的绝对指令代码或可重定位的指令代码或汇编指令代码。
3.工作与硬件系统结构和指令含义有关。
4.工作复杂,涉及到硬件系统功能部件的运用、机器指令的选择、各种数据类型变量的存储空间分配以及寄存器和后缓寄存器的调度。
1.六个阶段的任务分别由六个模块完成,称作词法分析程序、语法分析程序、语义分析程序、中间代码生成程序、代码优化程序、目标代码生成程序。
2.一个完整的编译程序还必须包括“表格管理程序”和“出错处理程序”。
(1)表格管理:编译各个阶段工作都涉及构造,查找或更新有关表格。
(2)出错处理:编译程序应报告错误的性质和错误的发生地点,将错误造成的影响控制住最小范围内,使程序其余部分能够继续被编译下去。(部分源程序能自动校正错误)
1.上述编译过程阶段的划分是编译程序的逻辑组织。
2.常常把编译过程分为前端和后端。
(1)前端:主要依赖于源程序,与目标机无关的阶段;包括:词法分析,语法分析,语义分析和中间代码生成。
(2)后端:依赖于目标机而一般不依赖源语言,只与中间代码有关的阶段;包括:目标代码生成,相关出错处理,符号表操作。
编译程序是语言处理程序,将高级语言程序翻译成某个机器的汇编或二进制代码程序。
编译和运行是两个独立分开的阶段。
1.不需要在运行前先把源程序翻译成目标代码。
2.解释程序接受某个语言的程序并立即运行这个源程序。
3.工作模式是:一个个获取、分析并执行源程序语句,一旦第一个语句分析结束,源程序便开始运行并生成结果。
1.编译程序的编译和运行是两个独立分开的阶段,解释程序接受某个语言的程序并立即执行这个源程序。
2.存储组织有很大不同。
(1)编译程序:源语言程序被编译阶段,存储区要为源程序(中间形式)和目标代码开辟空间,存放编译用的各种表格(例:符号表);目标代码运行阶段,存储区中主要是目标代码和数据,编译所用的任何信息都不再需要。
(2)解释程序:一般把源程序一个语句一个语句进行语法分析,转换为一种内部表示形式。存放在源程序区;整个过程中,源程序,符号表等内容始终存放在存储区中,并且存放格式要易于使用和修改。程序的解释非常慢,空间开销大。