编译原理[笔记] 第一章-绪论

第一章 绪论

基本概念

1.高级语言与低级语言

语言包括特点
低级语言字位码、机器语言、汇编语言与特定机器有关(可移植性不好),功效高,使用困难且易出错
高级语言C语言、Pascal、Fortran等不依赖于机器(可移植性好),功效没有低级语言高,但使用容易且易维护

2.几种重要程序

程序定义
源程序用汇编语言或高级语言编写的程序
目标程序用目标语言表示的程序。目标语言可以是介于源语言和机器语言之间的中间语言,也可以是某种机器的机器语言或汇编语言
翻译程序将源程序转换为目标程序的程序,是汇编程序、编译程序以及各种变换程序的总称(见教材P5 表1.1)
汇编程序将用汇编语言编写的源程序转换为用机器语言表示的目标程序的翻译程序,这一过程称为汇编
编译程序将用高级语言编写的源程序转换为目标程序的翻译程序,这一过程称为编译
解释程序可以对源程序或编译得到的中间代码进行解释执行的程序

3.源程序的翻译与运行

源程序通过翻译过程到最后运行得到结果要经过两个阶段:
翻译(编译或汇编)阶段源程序 —> 翻译程序 —> 目标程序

运行阶段输入数据 —> 目标程序+运行子程序 —> 输出数据

4.源程序的解释执行

解释程序:可以对源程序或编译得到的中间代码进行解释执行的程序
解释执行过程源程序或中间代码+输入数据 —>解释程序 —>输出数据

相比于纯编译执行的优点与缺点
优点:(1)动态响应性好:如果程序的某部分或输入数据在程序运行时还需要发生改变,因为解释执行是对源代码的语句(或指令)一条一条的执行,执行某条时其它语句(或指令)可以放心的进行修改。
(2)便于调试:解释执行产生的中间代码中,尚未解释执行的部分还保持着源代码的样子,这使得程序的调试变得更加容易
(3)简易性:相比于编译系统,解释执行的处理系统更容易研制
(4)节省空间:相比于编译执行,解释执行的中间代码占用的储存空间更小,因为还未执行的部分还保持着源代码的状态
(5)移植性更好:解释执行的中间语言与机器无关(与源语言有关),因此,便于将语言处理系统移植到其他机器上
缺点:因为需要一条一条地解释执行,因此程序的运行速度较慢

5.“编译-解释执行”系统

为了让翻译系统同时具备编译执行和解释执行的特点,通常解释程序往往和编译程序结合使用,采用“编译-解释执行”方式。比如Java语言就需要采用编译-解释执行方式运行Java源代码,这样既使得Java源代码拥有很好的移植性的同时,在运行效率上也得到了优化。
“编译-解释执行”系统

此外,我们也可以先对源程序进行解释执行,以便测试与调试,待调试完成后再用编译程序将正确的源程序进行编译,这样可以大大提高编程的效率。

编译过程

编译过程是指将 高级语言程序 翻译为等价的 目标程序 的过程。习惯上将编译过程划分为5个基本阶段和七个逻辑部分
五个基本阶段:①词法分析 ②语法分析 ③语义分析、生成中间代码 ④代码优化 ⑤生成目标程序
七个逻辑部分:五个基本阶段的基础上加上各阶段需要做的 ⑥符号表管理 与 ⑦出错处理
编译过程的七个逻辑部分

1.词法分析

1.任务:分析和识别源程序中的单词
2.过程:词法分析的输入是字符串形式的源程序,词法分析扫描源程序(字符串),根据语言的词法规则分析识别出具有独立语法意义的单词(token),并以某种编码形式输出。
单词通常分为4类:
① 关键字或保留字 ② 标识符 ③ 常量 ④ 运算符和分界符
比如:x1 := ( 2.0 + 0.8 ) * c3 中,可识别出9个单词。(注意:其中 := 是二元赋值运算符)

2.语法分析

1.任务:根据语法规则(即语言的文法),分析并识别出各种语法成分,如表达式、各种说明、各种语句、
过程、函数、程序等,并进行语法正确性检查。
2.过程:语法分析的输入是通过词法分析获得的单词串形式的源程序,语法分析识别出语言的各自语法成分(如:变量声明、表达式、语句、函数等),并进行语法检查。语法分析最后输出一棵语法树,它的叶子节点是单词(token),每一个非叶子节点代表一个语法成分

3.语义分析、生成中间代码

1.任务:RT
2.过程:语义分析的输入是语法分析获得的语法成分,通过分析处理识别语法成分组合的含义,同时进行语义检查,最后生成中间代码
3.中间代码:中间代码介于源代码和目标代码之间,与目标机器无关,对代码优化和程序移植有很大的作用。
4.中间代码的形式:常用的中间代码形式有四元式、三元式、逆波兰表示和抽象语法树等。
例如:语句 x1 := ( 2.0 + 0.8 ) * c3 的中间代码 四元式 表示:

操作符左操作数右操作数结果
+2.00.8T1
*T1c3T2
:=x1T2

4.代码优化

1.任务:在确保源代码功能不变的的前提下,使目标代码更加简短,以尽量减少储存空间和运行时间。
2.方法:例如,上面的四元式中第一个四元式是计算常量表达式值,该值在编译时就可以算出并存放在工作单元中,不必生成目标指令来计算,这样四元式可优化为:
编译时:2.0 + 0.8 → T1
中间代码(四元式):

操作符左操作数右操作数结果
*T1c3T2
:=x1T2

5.生成目标程序

1.任务:通过中间代码生成(地址指令序列表示的)目标程序。
2.需要注意的问题:
①这部分工作与机器关系密切,所以要根据具体机器进行
②在做这部分工作时(要注意充分利用累加器),也可以进行优化处理。
③在翻译成目标程序的过程中,要切记保持 语义的等价性(翻译的根据)。

编译程序构造

1.逻辑结构

1.主体结构:由上可知,按逻辑功能不同,可将编译过程划分为五个基本阶段。与此相对应,我们将实现整个编译过程的编译程序划分为五个逻辑阶段(即五个逻辑子过程)。
2.辅助结构:符号表管理和出错处理。
①符号表管理:在整个编译过程中始终都要贯穿着填表和查表的工作。即要及时地把源程序中的信息和编译过程中所产生的信息登记在表格中,而在随后的编译过程中同时又要不断地查找这些表格中的信息。
②出错处理:规模较大的源程序难免有多种错误。编译程序必须要有出错处理的功能,即能诊察出错误,并向用户报告错误性质和位置,以便用户修改源程序。出错处理能力的优劣是衡量编译程序质量好坏的一个重要指标。

2.编译程序的前端和后端

根据编译程序各部分功能,将编译程序分成前端和后端
①前端:包括的部分:词法分析、语法分析、语义分析、中间代码生成、代码优化以及相应部分的符号表管理和出错处理部分(语言处理系统的分析部分)
特点:与源语言有关,与目标机器无关。
②后端:包括的部分:目标程序生成、与目标机有关的优化以及相应部分的符号表管理和出错处理部分(语言处理系统的综合部分)
特点:与目标机器有关,依赖中间语言而与源语言无关。
③分成前端和后端开发的好处:
(1)不同目标机器的编译程序可能使用同一个前端部分,不同源语言可能使用同一个后端部分。
(2)前端、后端的开发人员可以并行工作,提高效率。

3.遍

对源程序(包括源程序中间形式)从头到尾扫描一次,并做有关的加工处理,生成新的源程序中间形式或目标程序,通常称之为一遍。
编译过程中的遍
遍与五个基本阶段的区别:
①五个基本阶段:将源程序翻译为目标程序在 逻辑上要完成的工作
②遍:为完成五个基本阶段的工作,实际对源程序(或其中间形式)进行扫描并加工处理的 动作单元

★一遍扫描的编译程序

我们在实验课中实现的PL/0编译器就是这一类型的编译程序,总共只用进行一次扫描就可以完成编译过程的各项任务。
工作原理
①以语法分析程序为核心。
②当语法分析程序需要读入新的单词时,调用词法分析程序,从源程序中依次读入字符并进行单词识别。当识别出单词时,将识别出的单词返回到语法分析程序。
③当语法分析程序根据词法分析返回的单词组成,识别出某语法成分时,调用语义分析程序对其进行分析并生成相应部分的目标程序片段,语义分析程序向语法分析程序返回分析结果。
④语法分析程序执行结束后,对产生的目标程序进行整合,得到完整的目标程序。

关于分遍

分遍扫描的编译程序与一遍扫描的编译程序相对,每一遍只完成一个或相连的几个逻辑部分的工作。第一遍的输入是源程序,最后一遍的输出是目标程序,其它每一遍的输入程序是上一遍的输出程序。
★优点与缺点
①优点:
(1)减少对内存的要求(主要):分遍后,编译时可以以遍为单位将程序调入内存进行加工。
(2)优化工作更充足:分遍使编译程序结构更清晰,相互联系更简单,更利于优化工作的进行(可以分部分进行优化,而不是要同时考虑所有部分)。
(3)实现前后端的分离
②缺点:
增加重复工作,文件读写频繁,降低编译效率。

编译技术在软件工程中的应用

1.语法制导的结构化编辑器:提供自动格式缩进、实时语法检查、自动关键字匹配等辅助功能,提高编程效率。
2.程序格式化工具:优化源代码可读性
3.软件测试工具
(1)静态分析器:对源代码的分析,检测出无法执行到的代码部分、未定义或赋值就引用的变量等。
(2)动态结构测试器:使用样例对程序进行测试。
4.其它工具

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值