第01章 编译原理概述

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

(+,x,1,t4)
(=,t4,_,z)
代码优化不是编译程序的必要组成部分,不同的 编译程序所进行的代码优化程度差别很大,能够 完成代码优化的编译程序称为“优化编译程序”。 35
S.P
词法分析程序 符 号 表 管 理
语法分析程序 语义分析及生成中间代码程序 代码优化程序 代码生成程序 O.P
36
错 误 处 理
语法分析程序
语义分析及生成中间代码程序
代码优化程序 代码生成程序 O.P
错 误 处 理
40
1.4 编译程序的结构
对源程序(包括源程序中间形式)从头到尾扫描一 次,并做有关的加工处理 ,生成新的源程序中间 形式或目标程序,通常称之为一遍。
第一遍 S.P C1 S.P
中间形式1
第二遍 C2 S.P
中间形式2
源程序、翻译程序、目标程序 三者关系:
源程序
SOURCE PROGRA M
翻译程序
TRANSLATE R
目标程序
OBJECT PROGRAM
即源程序是翻译程序的输入,目标程序是翻译 程序的输出
14
1.2 翻译程序

汇编程序
若源程序用汇编语言书写,经过翻译程序得到用机器语 言表示的程序,这时的翻译程序就称之为汇编程序,这种翻 译过程称为“汇编”(Assemble)。
22
例如:a=10+c*20
a = 1 0 + C * 2 0 a = 10 + C * 2 0 a = 10 + C * 20
符号
100
记号
ID
单词
a
21 200
22 100 25 200
= NUM
+ ID * NUM
= 10
+ c * 20
23

res=fact *(term1+term2);
1.1 程序设计语言

机器语言(Machine Language)

0、1代码 0、1代码与助记符:更接近于计算机硬件指 令系统的工作 定义数据、描述算法(程序)

汇编语言(Assemble Language)


高级语言(High Level Language)

如:C、FORTRAN、PASCAL、C++、JAVA、 SQL(数据定义、数据操作) 12
1.5 编译程序的前后处理器
1.6 TEST语言和编译器
7
什么是“编译”?

把高级语言程序翻译成等价的低级语言程序。
源 程 序
编译程序
目 标 程 序
编译系统:编译程序和运行程序
8
学习本课程的目的

加深对程序设计语言的理解,提升自身 的能力
掌握编译程序的基本结构,掌握常用的 编译技术和方法 将编译原理的理论和方法应用于一般的 软件设计中
标识符类型 类型 地址
1(表示变量) 1(表示整型) 0001

标识符名
aaa
每个阶段中都要有: 符号表管理和错误处理
38
1.3.7 错误处理

诊察错误,并能报告用户错误性质和位 置
出错处理能力的优劣是衡量编译程序质 量好坏的一个重要指标

39
典型的编译程序具有7个逻辑部分
S.P
词法分析程序
符 号 表 管 理
30
错 误 处 理
1.3.3 语义分析及中间代码生成 程序

任务:依据语义规则对识别出的各种语法 成分析其含义,并进行初步翻译,生成中 间代码。
静态:
分析语法成份的含义,进行语义上的正确性检查
动态: 根据相应语义,生成中间代码(介于源语言和目 31 标语言之间的中间语言形式)
表达式:a=10+c*20
……
O.P
上一遍的结果是下一遍的输入,最后一遍生成目标程序。
41
1.4.1 单遍编译程序

单遍编译程序只对源程序进行一遍扫描,就完成 编译的各项任务,产生目标代码。在单遍编译程 序中,不产生中间代码,往往以语法分析程序为 中心,词法分析和语义分析作为语法分析的子程 序。
语法分析函数 { 词法分析子程序; 语义分析子程序; }
[3] 陈意云等编著,《编译原理》,高等教育出版 社。
„„
3
成绩评定

平时成绩
出勤率
30%
课后作业
课程设计(编译器)

期末考试
70%
4
作业

课后题:

第1、2、3、4、7、10章全部课后习题 第5章:1、2、3小题 第6章:1小题

课程设计
5
程序语言中涉及编译的一些问题?
1. 为什么有些语言规定标识符不能超过8个字符?而有些语 言对标识符的长度无限制? 2. 为什么有些语言能实现递归,而有些语言不能?
表达式
ID(a) 表达式 项 因子 NUM (10) = + 项 因子 表达式 项 * 因子
NUM(20)
ID(c)
32
例如wk.baidu.com达式
(a+b)*(c+d) 翻译成四元的中间 代码如下: (+ , a , b , t1) (+ , c , d , t2) (* , t1 , t2 , t3)
中间代码生成
编译原理基础
1
教材

《编译原理及实现》
作者:孙悦红
大学本科计算机
专业应用型规划教材

清华大学出版社
2
学时与参考教材

学分:3 学时:48
参考教材:
[1] 陈火旺、刘春林等编著,《程序设计语言编译 原理》,国防工业出版社。
[2] 张素琴、吕映芝等编著,《编译原理》,清华 大学出版社。
STO t2 将操作数栈顶的内容存入单元t2 LOAD t1 将t1的内容加载到操作数栈 LOAD t2 将t2的内容加载到操作数栈
MULT
将操作数栈顶的两个单元的内容相乘
33
STO t3 将累加器的内容存入单元t3
S.P
词法分析程序 符 号 表 管 理
语法分析程序 语义分析及生成中间代码程序 代码优化程序 代码生成程序 O.P
9


如:

词法分析中的字符串匹配技术可以应用于 文本编辑程序、信息检索、通讯程序、模 式识别中
上下文无关文法和语法制导的翻译可以用 于分析表达式,写打字程序,绘图程序等 小系统 代码优化技术更可以用于自己的结构化程 序中,用于改进性能、优化已有的程序等
10


主要内容


编译概述(编译组成、总体结构)
26
错 误 处 理
1.3.2 语法分析程序

编译程序的核心 任务:根据语法规则(即语言的文法), 分析并识别出各种语法成分(如表达式、 语句、函数等),并进行语法正确性检 查。
文法
<赋值语句>::=<标识符>“=”<表达式> <表达式>::=<表达式>“+”<表达式> | <表达式>“*”<表达式>
错误处理
分析阶段
词法 分析 语法 分析 语义 分析 符号表 代码 优化
综合阶段
目标代码 生成
19
对比

翻译外文资料:
1、能识别出句子中的一个单词(词法分析);
2、分析句子的语法结构(语法分析);
4、对译文进行修饰(代码优化); 5、写出最后的译文(目标代码生成)。
20
3、根据句子的含义进行初步翻译(语义分析);
源程序
用汇编语言或高级语言编写的程序称为源程序
目标程序
用目标语言所表示的程序 目标语言:可以是介于源语言和机器语言之间 的“中间语言”,可以是某种机器的机器语言,也可 以是某机器的汇编语言
翻译程序
将源程序转换为目标程序的程序称为翻译程序 。它是指各种语言的翻译器,包括汇编程序和编译 程序,是汇编程序、编译程序以及各种变换程序的 13 总称

编译程序
若源程序是用高级语言书写,经加工后得到目标程序, 上述翻译过程称“编译”(Compile)。
汇编程序与编译程序都是翻译程序,主要区别是加工对象的 不同。由于汇编语言格式简单,常与机器语言之间有一一对 应的关系。汇编程序所要做的翻译工作比编译程序简单的多。
15
编译到被执行的过程
1、编译程序的目标程序是机器语言(编译方式)
<表达式>::=“(”<表达式>“)” | <标识符> | <整数> | <实数>
27
语法分析与语文中分析句子成分相类似,根据句子 由主语、谓语组成,谓语由动词、宾语组成等语言规则, 可对句子“猴子吃香蕉”的进行分析,分析过程常用语 法树来表示句子。
句子
主语
谓语
名词(猴子)
动词(吃)
宾语
名词(香蕉) 图1.5句子“猴子吃香蕉”的语法分析树
LOAD a 将a的内容加载到操作数栈 LOAD b 将a的内容加载到操作数栈 ADD STO t1 将操作数栈顶的两个单元的内容相加 将操作数栈顶的内容存入单元t1
LOAD c 将c的内容加载到操作数栈 LOAD d 将d的内容加载到操作数栈 ADD 将操作数栈顶的两个单元的内容相加
翻译成某个抽象机的 汇编指令代码:
目标程序
3、当源程序处理完后, 进行善后处理,优化目 标程序。 43
1.4.2 多遍编译程序
1.3.5 目标代码生成

任务:把中间代码变换成特定机器上的 低级语言代码
目标代码的形式可以是绝对指令代码、 可重定位的机器指令代码或汇编指令代 码。

37
1.3.6 符号表管理

填表:把源程序中的信息和编译过程中 所产生的信息登记在表格中
查表:在随后的编译过程中同时又要不 断的查找这些表格中的信息
3. C语言规定数组下界为0,上界为声明的数减1,为什么?
4. 嵌套的IF语句规定ELSE与上面最近的IF配对,为什么? 5. 为什么有些程序运行一段时间后会导致内存溢出?
当我们学完编译后,这些问题就可以得到解答。
6
第一章 编译概述
1.1 程序设计语言
1.2 编译程序
1.3 编译程序的组成
1.4 编译程序的结构
文法和语言(文法、推导、句型、归约、语法树) 词法分析(词法分析、正规表达式、正规文法、NFA、 DFA) 语法分析(自顶向下:递归下降分析、LL(1);自底向 上:LR分析法)


语义制导翻译(属性文法翻译、语法制导翻译)
运行环境(符号表管理、存储分配) 语义分析和代码生成 代码优化
11
42
典型的单遍编译程序结构如图所示
1、当语法分析需要读进一个新单词 时,就调用词法分析子程序。词法 分析子程序则从源程序中依次读入 字符,组合成单词符号,并将单词 符号返回给语法分析程序。
取单词 源程序 词法分析
开始 语法分析 送单词 语义分析及代码生成
2、当语法分析程序识别出 一个语法成分时,就调用语 义分析子程序进行语义分析, 并生成目标程序。
结果 IDN
‘ =’ IDN ‘*’ ‘ (’ IDN ‘ +’ IDN res
fact
term1
term2
24
‘ )’ ‘ ;’
对比

中文句子划分 “我们是一家人” 我们 是 一家人
“我是大学生”


大学生
“叔叔亲了我妈妈也亲了我”
25
S.P
词法分析程序 符 号 表 管 理
语法分析程序 语义分析及生成中间代码程序 代码优化程序 代码生成程序 O.P
运 行 结 果
编译阶段
汇编阶段
运行阶段
17
编译到被执行的过程
3、从源程序的编译到执行只有一个阶段—— 解释执行阶段(解释方式)
源程序
数据
解 释 程 序
结果
在解释方式下,最终并不生成目标程序,这是编译 方式与解释方式的根本区别。 18
1.3 编译程序的组成

按照编译程序的执行过程和所完成的任 务,编译分成前后两个阶段:分析阶段 和综合阶段。
28
如何画 a=10*(c+20) 的语法 表达式: a=10+c*20 分析树?
表达式 ID(a)
表达式
=
+
表达式
项 项 * 因子
项 因子
NUM (10)
因子
ID(c)
NUM(20)
29
S.P
词法分析程序 符 号 表 管 理
语法分析程序 语义分析及生成中间代码程序 代码优化程序 代码生成程序 O.P
34
错 误 处 理
1.3.4 代码优化

任务:对中间代码进行加工变换,以得 到高质量的目标代码
而优化后的代码如下:
(=,6.28,_,x) (*,10,a,y) (=,7.28,_,z)
有四元式指令代码如下:
(*,3.14,2,t1) (=,t1,_,x) (*,2,5,t2) (*,t2,a,t3) (=,t3,_,y)
S.P
词法分析程序
语法分析程序 语义分析及生成中间代码程序 代码优化程序 代码生成程序 O.P
21
符 号 表 管 理
错 误 处 理
1.3.1 词法分析

词法分析又称扫描器。
任务:根据词法规则分析和识别单词 字符序列 编码形式
单词:是语言的基本语法单位 <1>保留字(如:if、else、while) <2>标识符(如:max、min、str) <3>常数 (如:12、6.8、’a’) <4>分界符(如:+、-、*、/、;、(、) )
数据
目标程序 高级语言 源程序 编译 程序 编译阶段 机器语言 目标程序 运行 结果
+
运行子程序 执行阶段
16
编译到被执行的过程
2、编译程序的目标程序是汇编语言(编译方式)
数据
高 级 语 言 源 程 序
编 译 程 序
汇 编 语 言 目 标 程 序
汇 编 程 序
机 器 语 言 目 标 程 序
目标程序 + 运行子程序
相关文档
最新文档