470 likes | 641 Views
编 译 原 理. 指导教师 : 杨建国. 指导教师 : 杨建国 二零零七年十一月. 二零零七年十月. 联 系 方 式. QQ : 383108986 MSN : yang2003915@hotmail.com 电子邮件: yangjg@ecust.edu.cn 个人网站: www.snwei.com( 盛威网 ). 《 编译原理 》 课程说明. 实际上课时间: 5* 16 周 理论和实践并重的课程 按要求完成相应的实验(包括实验报告)和作业
E N D
编 译 原 理 指导教师:杨建国 指导教师:杨建国 二零零七年十一月 二零零七年十月
联 系 方 式 • QQ : 383108986 • MSN : yang2003915@hotmail.com • 电子邮件: yangjg@ecust.edu.cn • 个人网站: www.snwei.com(盛威网)
《编译原理》课程说明 • 实际上课时间: 5* 16周 • 理论和实践并重的课程 • 按要求完成相应的实验(包括实验报告)和作业 • 关于考试:作业、实验、考勤 30%;上机考试10%;期 末考试60%(迟到、早退、旷课、上机玩游戏和聊天、 带签名扣3分)
开设《编译原理》目的 系统地向学生讲述编译系统的结构、工作流程及编译程序各组成部分的设计原理和实现技术,使学生通过本课程的学习之后,既掌握编译理论和方法方面的基本知识,也具有设计、实现、分析和维护编译程序等方面的初步能力
《编译原理》教材及主要参考书 • 教材:《编译原理》(第2版),张素琴、吕映芝、蒋维 杜、戴桂兰,清华大学出版社,2005.10 • 参考书: • ◎《编译技术》(第二版),钱焕延,东南大学出版社, • 2005.1 • ◎《编译原理课程设计》,王雷、刘志成、周晶,机械 • 工业出版社,2005.3 • ◎《编译原理学习辅导》,张伟,清华大学出版社, • 2005.7
《编译原理》教材及主要参考书 ◎《编译原理习题与解析》,伍春香,清华大学出版社, 2001.8 ◎《编译原理》,蒋立源,西北工业大学出版社,1996.2 ◎ 参考教案:清华大学教案、视频(清华大学、东南大学、 北京交通大学、西北工业大学、四川电视大学) ◎ 《编译原理》,何炎祥,高等教育出版社,2004.8 ◎ 《计算机编译原理-编译程序构造实践》,张幸儿,科 学出版社,2005.7
《编译原理》教材及主要参考书 ◎《编译原理》,Alfred V.Aho、Ravi Sethi Jeffery D.Ullman著,李建中、姜守旭译 ,机械工业出版社, 2006.2 ◎《现代编译原理C语言描述》,Andrew W.Appel著,赵克 佳、黄春、沈志宇译,人民邮电出版社,2006.4 ◎《编译原理及实践》,Kenneth C.Louden著,冯博琴、冯 岚等译,机械工业出版社,2003.3
编 译 原 理 教 案 • 第一章 引论 • 第二章 PL/O编译程序的实现 • 第三章 文法和语言 • 第四章 词法分析 • 第五章 自顶向下语法分析方法 • 第六章 自底向上优先分析 • 第七章 LR分析
编 译 原 理 教 案 • 第八章 语法制导翻译和中间代码生成 • 第九章 符号表 • 第十章 目标程序运行时的存储组织 • 第十一章 代码优化 • 第十二章 代码生成 • 第十三章 编译程序的构造 • 第十四章 面向对象语言的编译 • 第十五章 编译程序的面向对象构造
第一章 引论 • 第一节 程序设计语言 • 第二节 编译程序 • 第三节 源程序执行的途径 • 第四节 编译程序的结构 • 第五节 编译程序的开发
第一章 引论 • 1.1 程序设计语言 一.机器语言 • 一般来说,计算机可以直接执行的代码形式的指令系统 称为机器语言
例如,在国产DJS——21计算机中,取、除、减、送的例如,在国产DJS——21计算机中,取、除、减、送的 指令代码分别为:002,00E,009,004 • 假定a、b、c、x四个单元的地址码分别为:0123,1234, 2103,0576,那么要计算 x:= a / b – c • 其机器语言程序为: • 002 0123 • 00E 1234 • 009 2103 • 004 0576
二.汇编语言 • 汇编语言就是计算机符号形式的指令系统 • 如对应于取、除、减、送采用下列符号:CLA,DIV, SUB,STO • 那么上述程序的汇编语言程序: • CLA a • DIV b • SUB c • STO x
三.高级语言 • 常用的高级语言:BASIC、FORTRAN、ALGOL、 • PASCAL、COBOL、C 等 • 上例用 BASIC 语言写为赋值语句为: x = a / b - c • 用 PASCAL 语言写为赋值语句为: x:=a / b - c
又如求半径为 r 的圆面积和周长的问题,用PASCAL语言 编写的程序是: Program scr ( input , output ) ; const pi = 3.1416 ; var s, c, r : real ; begin read ( r ) ; s : = pi * sqr ( r ) ; c : = 2 * pi * r ; write ( r, s, c) End.
(翻译) (B语言) (A语言) 源程序 翻译程序 目标程序 汇编语言 汇编程序 机器语言 编译程序 高级语言 汇编(机器)语言 源程序 解释程序 无 • 1.2 编译程序 • 计算机实现程序设计语言的方法 • 第一种方法:对程序进行翻译 • 第二种方法:对程序进行解释
1.3 源程序执行的途径 一.编译途径 1.定义:将一份源程序从头至尾翻译成某台计算机上的机 器语言,让机器接受,然后执行之,并允许重 复执行若干次
源程序 源程序 目标程序 编译程序 编译程序 汇编语言程序 汇编程序 运行结果 目标代码 初始数据 运行程序 初始数据 运行程序 运行结果 3.三大阶段: 2.两大阶段: 编译 阶段 编 译 阶 段 汇编 阶段 运 行 阶 段 运行 阶段
初始数据 源程序 解释程序 结 果 二.解释途径 1.定义:就是对于源程序的一个语句,把它翻译成相应的 机器语言, 并让计算机立即执行 2.解释执行阶段:
3.两种方式: • 直接解释执行 • 把源程序先转换成以词为单位的中间代码程序,然后对 中间代码程序逐句解释执行
1. 4 编译程序的结构 一.编译程序的组成 1.单词和属性字: • 单词是指语言中具有独立意义的最小语法单位 • 单词的属性是指单词特征和特性的有关信息 • 属性字是指单词的一种机内表示 • 属性字的特点:一是长度统一,二是刻划了单词的属性 • 属性字的组成:
信 息 表 管 理 程 序 源 程 序 词法 分析 程序 语法 分析 程序 语义 分析 程序 中间 代码 生成 代码 优化 程序 目标 代码 生成 目标代码 错 误 检 查 和 处 理 程 序 2.编译程序的组成:
词法分析: 主要任务:从左到右扫描源程序,识别单词及其有关属性 , 并转换成属性字 例如:对于 PASCAL 语言中的赋值语句 x : = 2 * a + b
语法分析: 主要任务:分析源程序的结构, 判别它是否为相应程序设计 语言中的一个合法程序
语义分析: 主要任务:根据语法结构分析其含义,并用某中间语言 表示出来,亦就生成中间代码,或者直接生 成目标代码 三元式定义为如下形式:(op, a1, a2) 对于表达式:a + b * c / d 则有三元式: (1) ( *, b, c) (2) (/, (1), d) (3) (+, a , (2) ) 于是 x : = 2 * a + b 的中间代码形式为: (1) ( *, 2, a) (2) (+, (1), b) (3) (:=, (2), x)
中间代码生成: • 使用中间语言的好处是使编译算法更加清晰,便于优 化,还使编译程序的更多部分不依赖于目标机器 • 常见的中间代码形式: 逆波兰表示、三元式、四元式及 树形结构等等
代码优化: 主要任务:为了提高目标程序的质量而进行的工作。所 谓目标程序的优,就是尽量缩短运行时间和尽量最少占 用存储空间
代码生成: 主要任务:完成从中间代码到目标代码的生成工作。如 果在语义分析时已直接生成了目标代码,则无需做此项 工作
错误检查和处理程序: 主要任务:查错和纠错
信息表管理程序: • 主要任务:建立一批不同用途的表格 + 保持一些专用的表格 • 一般信息表的登记项由关键字和与之相关联的信息组成
3.编译程序的简单模型 例如求半径为 r 的圆面积和周长的问题, 用PASCAL语言编写的程序是: Program scr ( input , output ) ; { 程序首部 } var s, c, r : real ; { 说明 r, s, c 是实型变量 } begin s : = pi * sqr ( r ) ; { 计算圆的面积 s } c : = 2 * pi * r ; { 计算圆的周长 c } End. { 程序结束 }
(1) 词法分析: Programscr(input,output); vars, c,r:real; begins: =3.14*sqr(r); c: =2*3.14*r; End.
: = 2 * c 3.14 * r < 变量 > < 常量 > < 乘除号 > < 常量 > < 乘除号 > < 变量 > < 因子 > < 因子 > < 因子 > < 项 > < 项 > < 项 > < 表达式 > < 赋值语句 > (2) 语法分析:
(3) 语义分析: (1)( *, 3.14, r ) (2)(*, (1), r) (3)(:=, (2), s) (4)(*, 2, 3.14) (5)(*, (4) , r ) (6)(:=, (5) , c) (4) 代码优化: (1)( *, 3.14, r ) (2)(*, (1), r) (3)(:=, (2), s) (4)(*, 6.28, r) (5)(:=, (4) , c ) • 思考:还可以怎么优化? • 答案:3.14*r
(5) 目标代码生成: (1)( *, 3.14, r ) (2)(*, (1), r) (3)(:=, (2), s) (4)(*, 2, (1) ) (5)(:=, (4) , c)
词法分析 分 析 错 误 处 理 语法分析 语义分析 综 合 优 化 代码生成 目标程序 二.编译程序的逻辑结构 1.编译程序的逻辑结构 源程序 表 格 管 理
2.编译程序的趟: 所谓一趟是指一个编译程序在编译时刻把源程序或与之 等价的中间程序从头到尾扫描一遍,并转换成为紧密相邻的 等价程序的全过程
词法分析 目标程序 语法分析 语义分析 • 单趟扫描: 源程序 • 优点:编译速度快、效率高、编译程序总长度短 • 缺点:编译程序复杂、占用存贮空间大
源 程序 等价程序1 词法分析 语法分析 等价程序2 语义分析 等价程序3 优 化 等价程序4 目标程序 代码生成 • 多趟扫描: • 优点:各趟所要完成的功能明确而单纯、编译程序较容 易且便于分工、存贮空间节省 • 缺点:编译程序的总长度长、各趟的工作有些要重复进行、 效率较低
1. 5 编译程序的开发 一.编译程序的开发过程 1.认真分析、合理分工 2.算法设计、方案确定 3.语言选择、编制程序 4.调试程序、确保质量 5.资料整理、文本形成
二.编译程序的开发技术 1.系统程序设计语言(系统编程语言): 能编写编译程序或其它系统软件的高级语言
2.编译程序的开发技术: • 自编译:用某一高级语言书写其本身的编译程序 • 交叉编译:A机器上的编译程序能产生B机器上的目标 代码
自展:首先确定一个非常简单的核心语言L0,用机器语自展:首先确定一个非常简单的核心语言L0,用机器语 言或汇编语言书写出它的编译程序T0,再把语言L0扩充 到L1,此时L0 L1并用L0编写L1的编译程序T1,再把 语言L1扩充为L2,有L1 L2并用L1编写L2的编译程序 T2,,如此逐步扩展下去,好似滚雪球一样,直到 我们所要求的编译程序 • 移植:将 A 机器上的某高级语言的编译程序搬到 B 机 器上运行
编译程序 自动生成软件 编译程序 3.编译程序的自动生成问题: 源语言的定义 机器语言的描述 • 如UNIX操作系统下的软件工具Lex和Yacc等 • 编译程序生成软件工具还有LLama和Occs • 形式语言学和编译技术的发展已能实现编译程序的自动生 成,但是目前的主要问题是时间效率和空间节省问题
第1章 作业题 P11: 1. 2. 3. 4.