You are on page 1of 31

编译原理

Compiler Principles
杨春明
E-mail: mryangforstu@yahoo.com.cn
HomePage: http://MrYang.stumental.com
Tel: 6089357

西南科技大学计算机学院软件教研室

http://www.stumental.com/mryang/ 1
课程要求
• 教学方式:理论(56)
• 考核方式:考试(70%)+平时成绩(30%)
• 课程学分:3.5
• 先修课程:《离散数学》《数据结构与算法》《程
序设计语言》
• 参考书籍:
– 编译原理. (美)阿霍(Aho, A. V.)等著. 李建中等译. 北京:
机械工业出版社, 2003.8
– 现代编译程序设计. (荷)格伦(Grune, D.) 等著. 冯博琴
等译. 北京:人民邮电出版社, 2003.9
http://www.stumental.com/mryang/ 2
编译原理内容提要
• 编译程序的功能、工作过程、结构以及
构造方法
• 词法分析以及程序的设计方法、有穷自
动机、正则表达式
• 文法的构造、文法描述的语言、短语和
句柄、语法树
• 运行时环境
• 中间代码生成以及程序的优化

http://www.stumental.com/mryang/ 3
为什么要学习编译原理
• 编译程序构造是计算机学科中一个非常成
功的分支,也是最早获得成功的分支;
• 编译原理蕴涵着计算机学科中解决问题的
思路、抽象问题和解决问题的方法;
• 编译原理课程的学习有利于加深对程序语
言的理解,可以帮助你更加快速的掌握新的
语言工具;
• 课程中包含了很多软件技术,这对于以后从
事软件设计是很有帮助的.

http://www.stumental.com/mryang/ 4
第一章 引论
• 本章内容
– 什么是编译程序
– 编译过程概述
– 编译程序的结构
– 编译程序的生成
– 编译程序的构造
– 编译技术在软件工程中的应用

http://www.stumental.com/mryang/ 5
程序设计语言与编译
• 计算机可以直接接收的语言是机器语言,
有二进制(0、1序列)组成,唯一可以在机器
上直接执行的语言。难读、难写、与硬件
环境密切相关。
• 汇编语言用记忆符表示指令的操作码。
• 高级程序设计语言摆脱了对硬件的依赖,
易读、易写、便于算法交流。

http://www.stumental.com/mryang/ 6
编译与语言
• 编译程序设计原理:
– 高级程序设计语言的实现原理
• 编译程序技术:
– 最具有代表性的计算机语言处理技术
• 计算机语言
– 人与计算机、计算机软件之间的交流工具
– 广义的计算机语言:软件之间传输的数据

http://www.stumental.com/mryang/ 7
什么是编译程序?
• 什么是编译程序
– 将高级程序设计语言翻译成逻辑上等价的低
级语言(汇编语言,机器语言)的翻译程序。
– 翻译程序指的是这样一个程序,它能够把某
一种语言程序(源语言程序)改造成另一种语
言程序(目标语言程序),而两者在逻辑上是
等价的。

源语言程序 目标语言程序
编译程序
(*.C,*.PAS) (*.OBJ,*.EXE)
http://www.stumental.com/mryang/ 8
什么是编译程序
• 程序设计语言的转换
– 翻译(Translation)
• 不改变语言的语义将一种语言翻译成另一种语言,在
逻辑上是等价的。
– 编译(Compile)
• 从高级语言转换为低级语言,然后运行计算。
– 解释(Interpretion)
• 接受高级语言的语句输入,进行解释并控制计算机执
行,得到结果。

想一下JAVA的与平台无关性是怎么回事?

http://www.stumental.com/mryang/ 9
编译过程概述
• 编译过程可分为两个阶段或三个阶段:

运行子程序
目标代码
编 目 初 计

译 标 始 算

程 代 数 结

序 码 据 果
编译时 运行时

运行子程序
目标代码
编 汇 汇 目 初 计

译 编 编 标 始 算

程 语 程 代 数 结

序 言 序 码 据 果

http://www.stumental.com/mryang/ 10
编译程序结构
• 编译程序从输入源程序到输出目标程序,可由
五部分来组成:
表格管理 出错处理

目标代码生成器
中间代码生成
词法分析器

语法分析器

语义分析器

目标代码
源程序

优化
分析 综合
http://www.stumental.com/mryang/ 11
编译程序各阶段任务
• 词法分析(线性分析)
– 输入源程序,对构成源程序的字符串进行扫
描和分解,依据词法规则(或构词规则)识别
出一个个的单词(单词符号或符号),转换成
机器容易识别的内码形式。
– 内码用二元式(类号,内码)表示。
基本字 int
标识符 x,a,b
int x,a,b; 整常数 50
x=a+b*50; 运算符 +,*,=
界限符 , ,;
http://www.stumental.com/mryang/ 12
编译程序各阶段任务
• 语法分析(parsing或syntax analysis)
– 根据语言的语法规则(文法规则),把单词符
号串组成各类语法单位(语法范畴),如:短
语、子句、句子、程序段、程序
– 语法规则写成Backus-Naur-Form(BNF)式,
形式如下:
• A::=B|C 或 AÆB|C
– 语法分析有两种方法:
• 推导(Derive)和规约(Reduce)
– 语法分析对说明语句填写符号表,一般语句
构造语法树
http://www.stumental.com/mryang/ 13
编译程序各阶段任务
• 语法分析(parsing或syntax analysis)
– 语法树
– 表达式position:=initial+rate*60

:=

position +

initial *

rate 60
http://www.stumental.com/mryang/ 14
编译程序各阶段任务
• 中间代码生成
– 根据语义规则产生一种介于源语言与目标代
码之间的一种中间代码。
– 中间代码是不依赖于机器但是又便于生成依
赖于机器的目标代码的一种结构简单、含义
明确的记号系统。
– 中间代码常用四元式来表示:

算符 左操作数 右操作数 结果

http://www.stumental.com/mryang/ 15
编译程序各阶段的任务
• 中间代码生成
– 例:Z=(X+0.418)*Y/W
序号 算符 左操作数 右操作数 结果
(1) + X 0.418 T1
(2) * T1 Y T2
(3) / T2 W Z

常用的中间代码出了四元式外,还有三元式、间接三
元式和逆波兰记号等等。
http://www.stumental.com/mryang/ 16
编译程序各阶段任务
• 优化
– 对前阶段产生的中间代码进行加工变换,以期
在最后阶段能产生更为高效(省时间和空间)的
目标代码。
– 主要依据是等价变换规则
– 优化主要包括:
• 删除公共子表达式、合并已知量、删除无用赋值、
循环优化、算符规约等等

http://www.stumental.com/mryang/ 17
编译程序各阶段的任务
• 优化 FOR K:=1 TO 100 DO
– 例. BEGIN
M:=I+10*K
N:=J+10*K
END;
(1) ( :=,1, ,K ) (1) ( :=,1, ,K )
(2) ( j<,100,K,(9) ) (2) ( :=,I, ,M )
(3) ( *,10,K,T1 ) (3) ( :=,J, ,N )
(4) ( +,I,T1,M ) (4) ( j<,100,K,(9) )
(5) ( *,10,k,T2 ) (5) ( +,M,10,M )
(6) ( +,J,T2,N ) (6) ( +,N,10,N )
(7) ( +,K,1,K ) (7) ( +,K,1,K )
(8) ( j, , ,(2) ) (8) ( j, , ,(4) )
(9) … (9) …
http://www.stumental.com/mryang/ 18
编译程序各阶段任务
• 目标代码生成
– 把中间代码变换成指定机器上的绝对指令代码
或可重新定位的指令代码或汇编指令代码
– 与硬件系统功能部件的运用,机器指令的选
择,各种数据类型变量的存储空间分配,寄存
器和后缓寄存器的调度等等有很大的关系。

http://www.stumental.com/mryang/ 19
编译程序各阶段
• 表格与表格管理
– 编译程序在工作过程中需要保持系列的表格,用以
登记源程序的各类信息和编译各阶段的进展状况。
– 合理的设计和使用表格式编译程序构造的一个重要
问题。
– 与编译的头三个阶段有关的表格有:
• 符号表、常数表、标号表、分程序入口表、中间代码表、
过程引用表、循环特征表、等价名表、公用链表、格式表
– 表格的结构大体如下:

NAME(名字) INFORMATION(信息)

http://www.stumental.com/mryang/ 20
编译程序各阶段
• 出错处理
– 错误可发生在编译的各个阶段,错误处理也是
贯穿编译全过程。
– 词法分析阶段可查出的错误,如标识符的组成
不符合词法规则;语句结构错误是在语法分析
中可查出的错误;还有语义分析阶段可查出的
错误,即结构正确,但所涉及的操作无意义或
错误。
– 在编译时查出的,叫Comple-time error,在运
行时表现才表现出来的错误叫Run-time error。

http://www.stumental.com/mryang/ 21
编译程序各阶段
• 遍(Pass)
– 从外部介质读取源件经过加工获得某种结果
并将其送回外部介质的过程,称为一遍。

语法分析
归约
取单词
(类号,内码) 返回
源程序 扫描器 语义子程序 目标代码
编译程序
http://www.stumental.com/mryang/ 22
编译程序各阶段
• 编译前端与后端
– 编译前端:由与原语言有关但与目标机无关的
那些部分组成。包括词法分析、语法分析、语
义分析与中间代码生成。
– 编译后端:包括编译程序中与目标机有关的那
些部分,有代码优化和目标代码生成。

http://www.stumental.com/mryang/ 23
编译程序与程序设计环境
• 集成化的程序设计环境
– 将编辑程序、连接程序、调试工具与编译程序
集成起来。

http://www.stumental.com/mryang/ 24
编译程序的生成
• 编译程序生成方式有如下六种:
– 直接用机器语言编写编译程序
– 用汇编语言编写编译程序
– 高级语言编写
– 编译工具
– 自编译
– 移植

http://www.stumental.com/mryang/ 25
编译程序构造
• 要在某以太机器上为某种语言构造一个编
译程序,必须掌握下面三个方面的内容:
– 源语言
– 目标语言
– 编译方法

http://www.stumental.com/mryang/ 26
编译技术在软件工程中的应用

• 语法制导的结构化编辑器
– 除了通常的正文编辑和修改功能外,还能对源
程序进行语法分析
• 程序格式化工具
– 用更加清晰可读的格式排版程序,如缩进,格
式,注释使用专门字体等

http://www.stumental.com/mryang/ 27
编译技术在软件工程中的应用

• 软件测试工具
– 包括∶静态分析器和动态结构测试器。
– 静态分析器∶不运行程序而对程序中的潜在错
误和异常进行检查。
– 动态分析器∶用一组测试数据实际执行程序,
记录并分析执行路径,再与预期结果进行比
较,以发现程序中的异常

http://www.stumental.com/mryang/ 28
编译技术在软件工程中的应用

• 程序理解工具
– 对程序进行分析,确定模块间的调用关系,程
序数据的静态属性和结构属性,变量的交叉引
用,程序的控制流程图等,以帮助用户理解程

• 高级语言的翻译工具
– 一种高级语言译为另一种高级语言

http://www.stumental.com/mryang/ 29
怎样学习编译原理
• 做好思想准备,不要畏难,多看书,结合课本后面的
习题多做思考和类比, 在学习的过程中归纳出自己
的难点和疑惑点,然后重点突破;
• 自己动手做一个虚拟机,在虚拟机的基础上开发自
己的语言和编译器,加强实践;深刻的理解书本上
那些抽象的东西。
• 可以直接专注于编码(Lex,Yacc等)的研究,然后去
配合理论的学习,可以在第一次学习的过程中忽略
一些内容,等以后用的时候再来学习.

http://www.stumental.com/mryang/ 30
推荐资源
• http://ultra1.wuhee.edu.cn/compiler/compiler.htm
l上面有不少的编译原理相关的资料,而且还有语法
分析过程的JAVA演示程序,很形象生动的为大家
演示一些比较抽象的概念。
• 《Compiler Design in C》作者:Allen I. Holub,出
版社: Prentice Hall这是一本经典的编译原理教程,
均衡了编译原理理论和实践的内容,详细讨论了自
顶向下和自底向上的语法分析、语义分析、中间
表示和代码生成等内容,所有的程序都采用大家熟
悉的C语言来描述,是一本重点推荐的书。
http://www.stumental.com/mryang/ 31

You might also like