More Related Content More from tjpucompiler (11) 第1章 概论2. 教材
《编译原理》
张晶、陈香凝、董德义、李鑫、赵
曦 编
哈尔滨工程大学出版社
2011 年第一版
2
5. 主要内容
第 1 章 引论 第 6 章 LR 分析法
第 2 章 文法和语言 第 7 章 语法制导翻译
第 3 章 词法分析 和
第 4 章 自顶向下的 中间代码生成
语法 第 8 章 运行时的存储
分析 组织
第 5 章 自底向上的 第 9 章 符号表
语法 第 10 章 代码优化
分析 第 11 章 目标代码生 5
成
9. 世界上存在着多种语言,人们为了交
流,就需要建立各种语言之间的翻译
。
人与计算机之间的信息交流,同样存
在一个翻译问题。
计算机语言 — — 机器语言
人类语言 — — 高级程序设计语言 9
11. 机器语言
直接用计算机能够识别的二进制代码指令
来编写程序的语言。由二进制的指令代码
组成。
1 + 3 表示为 10000001 00000001 00000011
最底层的计算机语言,不需要翻译就可以
直接被计算机硬件识别。对应不同的计算
机硬件有不同的机器语言。
特点:执行速度快,但编写程序的难度大
,修改、调试不方便,直观性差,不易移
植。 11
12. 汇编语言
又称为符号语言。与机器语言一一对应,采
用能帮助记忆的英文缩写符号(指令助记符
)来代替机器语言指令中的操作码,用地址
符号来代替地址码。用指令助记符及地址符
号书写的指令称为汇编指令,用汇编指令编
写的程序称为汇编语言源程序。
将 X 、 Y 中的内容相加 表示为 ADD X Y
机器不能直接识别汇编语言程序,必须把它
翻译 为机器语言程序才能执行。
特点:比机器语言直观,容易理解记忆,比
高级语言的执行效率高,通用性和移植性较 12
差。
13. 高级语言
与具体的计算机硬件无关,是面向问题的程
序设计语言,其表达方式接近于自然语言和
数学语言,易于人们接受和掌握。
采用类似于数学公式的书写方式: x = 1 + 3
特点:独立于具体的计算机硬件,程序的编
制和调试方便,通用性和可移植性好。在计
算机执行之前,需要通过编译程序翻译成目
标语言程序,或需要通过解释程序边解释,
边执行。时间与空间效率比较低。
13
14. 比较 机器语言 汇编语言 高级语言
硬件识 是唯一可以 不可识别 不可识别
别 识别的语言
是否可 不可,需汇 不可,需编译 / 解
直接执 可直接执行 编、连接 释、连接
行
面向机器 面向问题
/ 对象
面向机器 占用内存少 占用内存大
占用内存少 执行速度快 执行速度相对慢
特点 执行速度快 较为直观 标准化程度高
使用不方便 与机器语言 便于程序交换,
一一对应 使用方便
定位 低级语言, 低级语言, 高级语言,种类
极少使用 很少使用 多,常用
14
15. 1. 翻译程序: 将一种语言编写的程序等价
转换成另一种语言编写的程序,实现上述
功能的程序称为翻译程序。
2. 编译程序: 把高级语言 ( 称作源语言 ) 书
写的程序翻译成低级语言 ( 称作目标语言 ) 的
等价的程序。
3. 两者关系: 编译程序是翻译程序的子
集。
15
16. 编译程序的功能
编译器的输入对象 编译器的输出对象
源程序 编译程序 目标程序
(高级语言程序 ( 编译器 ) (汇编程序)
)
面向人的 面向机器的
16
17. 编译和解释程序: 初始数据
编 目 计
源
译 标 算
程
程 程 结
序
序 序 果
解 计
源程序
释 算
程 边解释 结
初始数据 序 边执行 果 17
源程序
18. 解释程序和编译程序的区别
功能 工作结果 实现技术上
编译 源程序的一 源程序的 把中间代码转
程序 个转换系统 目标代码 换成目标程序
解释 源程序的一 源程序的
执行中间代码
程序 个执行系统 执行结果
解释程序和编译程序的根本区别:
是否生成目标代码 18
20. 编译过程概述
编译程序完成从源程序到目标程序
的翻译工作,是一个复杂的整体的过程。
从概念上讲,一个编译程序的整个
工作过程是划分成阶段进行的,每个阶段
将源程序的一种表示形式转换成另一种表
示形式。
20
22. 英译与编译的比较 ( 理解 5 个
阶段 )
1. 识别出句子的一个个单 1. 词法分析
词
2. 语法分析
2. 分析句子的语法结构
3. 语义分析中间代码生
3. 初步翻译句子的含义 成
4. 译文修饰 4. 代码优化
5. 写出最后译文 5. 目标代码生成
22
23. 引例
英语句子:
与此类似,
I wish you success. 编译程序将首先根
据源语言的定义来
对源程序进行分析
汉语句子: ,之后进行综合并
我希望你成功。 得到与源程序等价
(祝你成功。) 的目标程序。
23
24. 编译逻辑过程
词法分
析
语法分析
语义分析
中间代码生
成
代码优化 24
25. 1. 词法分析
从左至右读字符流的源程序、识别出
一个个单词(单词符号或符号)。
例 : position := initial + rate * 60;
单词类型 单词值
标识符 1( id 1)
p o s itio n
算符 ( 赋值 ) :=
标识符 2( id 2)
initia l
算符 ( 加 ) +
标识符 3( id 3)
25
ra te
算符 ( 乘 ) *
26. int a;
a = a 单词类型
+ 2; 单词值
保留字 int
标识符 ( 变量名 ) a
界符 ;
标识符 ( 变量名 ) a
算符 ( 赋值 ) =
标识符 ( 变量名 ) a
算符 ( 加 ) +
整数 2
界符 ; 26
27. 2. 语法分析
功能 : 在词法分析输出的单词流基础上,
依据源程序的语法规则分析该单词流是否
能正确地组成各类语法单位,并指出其中
的语法错误。
语法分析程序与自然语言中句子的语
法分析类似。语法分析定义了程序的结构元
素及其关系。通常将语法分析的结果表示为
分析树或语法树。
依据源程序的语法规则把源程序的
单词序列组成语法短语 ( 表示成语法
27
树 )。
28. position := initial + rate * 60 ;
规则 < 赋值语句 >::=< 标识符 >“:=”< 表
达式 >
< 表达式 >::=< 表达式 >“+”< 表达式
>
< 表达式 >::=< 表达式 >“*”< 表达式
>
< 表达式 >::=“(”< 表达式 >“)”
< 表达式 >::=< 标识符 >
< 表达式 >::=< 整数 >
< 表达式 >::=< 实数 > 28
29. 赋值语句
标识符 := 表达式
表达式 + 表达式
标识符 表达式 * 表达式
标识符 整数
29
30. 3. 语义分析
语义审查 ( 静态语义 )
按照语法树的层次关系和先后次序,逐个
语句地进行语义处理。
主要任务: 进行类型审查,审查每个算
符是否符合语言规范,不符合时应报告错
误。
类型匹配
类型转换
30
31. 4. 中间代码生成
源程序的内部 ( 中间 ) 表示
三元式、四元式、波兰式、逆波兰式
( * id3 t1 t2 )
t2 = id3 * t1
t2 := id3 * t1
31
32. id1:= id2 + id3 * 60
(1) (inttoreal, 60 - t1 )
(2) (* , id3 t1 t2 )
(3) (+ , id2 t2 t3 )
(4) (:= , t3 - id1 )
32
33. 5. 代码优化
对中间代码进行变换,使目标代码更
为高效。(节省时间和空间)
id1:= id2 + id3 * 60
(1) (inttoreal 60 - t1 )
(2) ( * id3 t1 t2 )
(3) ( + id2 t2 t3 )
(4) ( := t3 - id1 )
变换
( 1) ( * id3 60.0 t1
)
33
( 2 )( + id2 t1 id1 )
34. 6. 目标代码生成
(* , id3 60.0 t1 )
(+ , id2 t1 id1 )
movf id3,R2
mulf #60.0,R2
movf id2,R1
addf R2,R1
movf R1,id1 34
35. 符号表管理
记录源程序中使用的名字;
收集每个名字的各种属性信息:
类型、作用域、分配存储信息
Const1 常量 值: 35
Var1 变量 类型:实 层次: 2
35
36. 出错处理
检查错误;
词法分析程序发现某单词的拼写错误
语法分析程序发现语法错误,如括号不配
对
语义分析程序发现语法错误,如某运算符
与其运算对象的类型不相容
报告出错信息;
排错,恢复编译工作。
36
37. 编译程序的结构
词法分析程序
语法分析程序
语义分析程序
中间代码生成程序
代码优化程序
目标代码生成程序
符号表管理程序
出错处理程序
37
38. 词法分析程序
语法分析程序
表 出
格 语义分析程序 错
管 中间代码生成程序 处
理 代码优化程序 理
目标代码生成程序
38
41. 前端与后端
编译的前端( fro nt e nd ): 此部分
工作的特点是不依赖于具体机器。
编译的后端( b a c k e nd ): 此部分
对中间代码和目标机有较高的依赖性,而
一般不依赖于源程序代码。
41
42. 遍
遍(趟):从头到尾扫描源程序
(各种形式)一遍 ( p a s s ) 。
42
43. 小结
本章没有难以理解的内容 , 重点对
编译程序的功能和结构做一综述 , 要说
难点的是 : 了解编译程序各个成分在编
译阶段的逻辑关系以及他们怎样作为
一个整体完成编译任务的。
43