330 likes | 564 Views
编译原理. “ 编译原理 ” 是计算机专业的一门主要专业课。通过对该课程的学习,不仅可以掌握编译程序本身的基本实现原理和技术,同时也有助于提高对程序设计语言的理解,提高语言设计及程序设计的能力。 从软件工程看,编译器是一个很好的实例,所介绍的概念和技术能应用到一般的软件设计之中。 大多数程序员同时是简单语言的设计者,有助于提高对这些语言的设计水平。 在软件逆向工程、程序理解和软件安全等方面有着广泛的应用。. 编译原理不好学 理论性很强 非常抽象 算法复杂. 编译原理也不难学 相对独立 方法机械. 勤动手、多实践、提高学习能力
E N D
“编译原理”是计算机专业的一门主要专业课。通过对该课程的学习,不仅可以掌握编译程序本身的基本实现原理和技术,同时也有助于提高对程序设计语言的理解,提高语言设计及程序设计的能力。“编译原理”是计算机专业的一门主要专业课。通过对该课程的学习,不仅可以掌握编译程序本身的基本实现原理和技术,同时也有助于提高对程序设计语言的理解,提高语言设计及程序设计的能力。 • 从软件工程看,编译器是一个很好的实例,所介绍的概念和技术能应用到一般的软件设计之中。 • 大多数程序员同时是简单语言的设计者,有助于提高对这些语言的设计水平。 • 在软件逆向工程、程序理解和软件安全等方面有着广泛的应用。
编译原理不好学 理论性很强 非常抽象 算法复杂 • 编译原理也不难学 相对独立 方法机械 • 勤动手、多实践、提高学习能力 • 1.学到的知识是死的,总有过时的时候。只有通过学习知识提高学习能力,才是立于不败之地的保证。 • 2.记笔记:好记性不如烂笔头,通过动手加深理解和记忆。 • 3.做作业、做上机题:自己动手为主,参考“解答”为辅。 • 4.学习应积极思考,把握上课、复习、作业、实验各环节。
参考书目: 1.编译原理及实践,Kenneth C.Louden,机械工业出版社 2.编译原理,吕映芝,清华大学出版社 3.编译原理. (美)阿霍(Aho, A. V.)等著. 李建中等译. 北京:机械工业出版社, 2003.8 4.现代编译程序设计. (荷)格伦(Grune, D.) 等著. 冯博琴等译. 北京:人民邮电出版社, 2003.9 5.陈意云,编译原理和技术(第二版),中国科大出版社,1997 6.陈意云、张昱,编译原理习题精选,中国科大出版社,2002
成绩评定 • 考试成绩占70%, • 平时成绩30% 作业 上机实验 测验 考勤和平时学习态度
第一章 引论 1.1 什么叫编译程序 翻译程序:是指以某一种语言程序(源程序)转换成与之等价的另一种语言(目标语言)的程序(目标程序)。 编译程序:如果一个翻译程序的源语言是某种高级语言,其目标语言是相对于某一计算机的汇编语言或机器语言,则称这种翻译程序为编译程序(或称为编译器)。
初始数据 源 程 序 计 算 结 果 目标程序 编 译 程 序 计 算 结 果 解 释 程 序 源程序 初始数据
解释程序和编译程序的区别 解释程序和编译程序的根本区别: 是否生成目标代码
编译程序的分类 • 诊断编译程序 • 优化编译程序 • 可变目标编译程序 • 交叉编译程序 宿主机:运行编译程序的计算机称为宿主机。 目标机:运行编译程序所产生的目标代码的计算机称为目标机。
编译技术的发展 • 第一个编译程序出现在20世纪50年代早期,多是将算术公式翻译成机器代码 • 20世纪50年代末,提出并研制编译程序的自动生成工具 • 20世纪60年代起,出现自展技术(用被编译的语言来书写该语言自身的编译程序)。
编译实现方式的发展 • 手工 • 机器语言 • 汇编语言 • 系统程序设计语言 • 自动构造工具 • lex • yacc
编译技术的应用 • 语言的结构化编辑器 • 语言程序的调试工具 • 语言程序测试工具 • 高级语言之间的转换工具
1.2 编译过程概述 翻译外文资料与编译源程序进行类比
第一阶段 词法分析(Lexical analysis) 输入源程序,对构成源程序的字符串进行扫描和分解,识别出一个个单词(也称单词符号,或简称符号)并转换成内部形式。 输入:源程序中的字符流 输出:等长的内部形式,即属性字。 在词法分析阶段工作所依循的是语言的词法规则。描述词法规则的有效工具是正规式和有限自动机。
词法分析举例 • 例子,hoo.c: main() { float position, initial, rate; position = initial + rate * 60; } position = initial + rate * 60 字符流 scanner id1 = id2 + id3 * 60 记号流 标识符 赋值运算符 标识符 加运算符 标识符 乘运算符 整型常量
第二阶段 语法分析(Syntax analysis) 语法分析的任务:在词法分析的基础上,根据语言的语法规则,把单词符号分解成各类语法单位(语法范畴),如“短语”、“句子”、 “子句”、“程序段”、“程序”等并生成另一种内部表示。 输入:由词法分析程序识别出并转换的符号 输出:另一种内部表示,如语法分析树或其它中间表示。 语法规则通常用上下文无关文法描述。
= 语法树 + id1 id2 * 60 id3 id1 = id2 + id3 * 60 记号流 parser
第三阶段 语义分析与中间代码的产生 包括两方面的工作:首先对各种语法范畴进行静态语义检查,如果正确则进行另一方面的工作,即进行中间代码的翻译。 通常使用属性文法描述语义规则 所谓“中间代码”是一种含义明确,便于处理的记号系统。 中间代码常用四元式表示,除此之外还有三元式、间接三元式、逆波兰记号、树形表示等。
= 进行类型转换 + id1 id2 * id3 int float 60 t1 = int_to_float( 60 ) t2 = id3 * t1 t3 = id2 + t2 id1 = t3
第四阶段 优化 优化的任务在于对前段产生的中间代码进行加工,以期在最后阶段产生更为高效(省时间和空间)的目标代码。 优化所依循的原则是程序的等价变换规则 其方法有:公共子表达式的提取、循环优化、删除无用代码等。 例:课本 P3
第五阶段 目标代码生成 这一阶段的任务:把中间代码(或经优化处理后)变换成特定机器上的低级语言代码。它有赖于硬件系统结构和机器指令含义。 movf id3R2 mulf #60.0R2 movf id2R1 addf R2R1 movf R1id1
position = initial + rate * 60 词法分析器 id1 = id2 + id3 * 60 语法分析器 = + id1 语义分析器 id2 * id3 60 = + id1 中间代码生成器 id2 * t1 = int_to_float( 60 ) t2 = id3 * t1 t3 = id2 + t2 id1 = t3 id3 inttofloat 60 代码优化 t1 = id3 * 60.0 id1 = t1+id2 代码生成器 movfid3 R2 mulf#60.0 R2 movfid2 R1 addf R2 R1 movfR1 id1
源程序 词法分析器 1.3 编译程序的结构 单词符号 表 格 管 理 出 错 处 理 语法分析器 语法单位 语义分析与中间代码产生 中间代码 优化器 中间代码 目标代码生成器 目标代码
1.3.2 表格与表格管理 在编译程序使用的表格中最重要的是符号表。 符号表记录源程序中出现的每一个名字以及名字的各种属性。如常量名、变量名,过程名等;变量名的类型、所占内存、地址等。 1.3.3 出错处理 一个编译程序应设法发现源程序中的错误,并把有关错误报告给用户。这部分的工作由专门的一组程序(叫做出错处理程序)完成。 源程序中的错误分为: 语法错误—非法字符、括号不匹配 语义错误—说明错误、作用域错误、类型不一致
1.3.4 遍(或趟,pass) 所谓“遍”就是对源程序或源程序的中间结果从头到尾扫描一次,并作有关的加工处理,生成新的中间结果或目标程序。 语法分析 归约 取单词 (类号,内码) 返回 源程序 扫描器 语义子程序 目标代码 单遍编译程序
1.3.5 编译前端与后端 前端主要由与源语言有关但与目标机无关的那些部分组成。通常包括词法分析、语法分析、语义分析与中间代码产生,有的代码优化工作,也可以包括在前端。 后端包括编译程序中与目标机有关的部分,如与目标机有关的优化,和目标代码的生成等。
1.4 编译程序与程序设计环境 程序设计环境:编辑程序 连接程序 调试工具 … 课本P8
S T I 1.5 编译程序的生成 以前构造编译程序或编译程序的核心部分的工具是机器语言或汇编语言。 目前使用高级语言作工具来构造编译程序。用T形图来表示源语言S、目标语言T和编译语言I之间的关系。 目标语言T 源语言S 编译程序的实现语言I T形图
L A S A L A A A S 自编译过程(自展) 目标是在机器A(目标语言)上,用语言A(实现语言)构造高级语言L(源语言)的编译程序。 • Step1: 源语言L的子集语言S, S L。在机器A(目标语言)上,用语言A(实现语言)构造语言S的编译程序。 • Step2: 在机器A(目标语言)上,用语言S(实现语言)构造语言L的编译程序。
L A S A L A S A A 自编译过程 • Step3: “自编译方式”的方法是,先对语言的核心部分构造一个小小的编译程序(可用低级语言实现),在以它为工具构造一个能够编译更多语言成分的较大编译程序。如此扩展下去,就像滚雪球一样,越滚越大,最后形成人们所期望的整个编译程序。这种通过一系列的自展途径而形成编译程序的过程叫做自编译过程。
L B L A B A 编译程序的移植 考虑将A机器上语言L的编译移植到机器B上,即目标是: 已有的编译程序是:
L B L A L B L A A • Step1: 得到机器A上(实现语言)语言L到语言B的编译程序 用语言L编写的语言L到语言B的编译程序 借助已有的A机器上语言L的编译程序
L B L B L B L A B • Step2: 用语言L编写的语言L到语言B的编译程序 得到机器B上(实现语言)语言L到语言B的编译程序 新的A机器上语言L到语言B的编译程序