1、第一章 编译概述,有关信息,语言的基础知识,计算机专业主干课编译程序/系统是计算机系统的核心支撑软件贯穿程序语言、系统环境(平台)、体系结构联系计算机科学和计算机系统的典范,课 程 性 质,介绍编译器构造的一般原理和基本实现方法介绍的理论知识:形式语言和自动机理论、语法制导的定义和属性文法、类型论、程序分析原理等强调形式描述技术和自动生成技术强调对编译原理和技术的宏观理解,不把注意力分散到枝节算法,不偏向于任何源语言或目标机器,课程内容,理解编译程序设计与实现的基本原理掌握常用语言机制的实现技术经历开发一个小型编译程序的主要阶段具有使用构造工具开发编译程序的经验会将所学的通用方法和技术应用于类
2、似软件的设计和实现中,教学目的要求,原理 + 技术 + 工具,先修课程程序设计 (高级语言、汇编语言)数据结构其它相关课程计算机系统结构,操作系统,计算语言学,算法分析与设计 ,软硬件协同设计,形式语义学 ,相 关 课 程,书名 编译原理作者 王生原 等出版社 人民邮电出版社教案网页北语主页/网络教学辅助系统/ 用户名、密码:姓名的全拼,教 材与教案,Compilers:Principles,Techniques,and Tools Alfred V.Aho, Ravi Sethi, Jeffrey D.Ullman, 1986人民邮电版影印,2002. 机械工业版中译本,2003编译原理张素
3、琴 等 编著,清华大学出版社,2000,参 考 书 目,概述 2 学时实例( PL/0)剖析 8 学时自动机、正规式、文法和语言 12 学时语法分析 16 学时符号表、语义分析、语法制导翻译、中间代码生成10 学时运行时存储组织、代码优化、目标代码生成6 学时实验 18学时,课时计划,随堂布置小测检查独立完成情况,书面作业,实验计划,PL/0 实验实现 PL/0语言(给定架构和部分实现)手工或借助前端构造工具,总评成绩 (100%) 平时 (10%) 实验 (20%) 期末考试 (70%),考 核 计 划,时间:上班时间 地点:主楼 南 311 室,答 疑 与 交 流,编译程序概述,什么是编译
4、程序,编译程序的逻辑结构,编译程序的伙伴程序,编译程序的组织,编译程序的生成环境,什么是编译程序,从基本功能来看,编译程序(Compiler)是一种翻译程序(Translator)将语言A的程序翻译为语言B的程序称语言A为源语言 (Source Language)称语言B为目标语言 (Target Language),source program,target program,compiler,feedback messages,什么是编译程序,编译程序是较为复杂的翻译程序需要对源程序进行分析(Analysis),识别源程序的结构信息,理解与源程序的语义信息,反馈出错的语法、语义信息根据分析结
5、果进行综合(Synthesis),生成语义上等价于源程序的目标程序较为简单的翻译程序如:预处理程序(Preprocessor),一般只基于简单的模式匹配来实现翻译,什么是编译程序,编译程序通常是从较高级语言的程序翻译至较低级语言的程序,如,什么是编译程序,经编译程序生成的目标语言程序可以在支持该目标语言的虚拟机上执行,编译程序的逻辑结构,编译程序的工作逻辑上可分为两个阶段分析(Analysis)阶段理解源程序,挖掘源程序的语义实现分析阶段任务的部分称为编译程序的前端(Front End);对传统编译程序/系统,前端不涉及目标程序及其虚拟机综合(Synthesis)阶段生成与源程序语义上等价的目
6、标程序实现分析阶段任务的部分称为编译程序的后端 (Back End) ;对传统编译程序/系统,后端与目标程序及其虚拟机相关,编译程序的逻辑结构,典型编译程序的逻辑过程,词法分析,语法分析,语义分析和中间代码生成,中间代码优化,目标代码优化,目标代码生成,编译程序的逻辑结构,典型编译程序的主要逻辑模块,词法分析模块,语法分析模块,语义分析模块,中间代码优化模块,目标代码优化模块,目标代码生成模块,符 号 表 管 理 模 块,中间代码生成模块,出 错 处 理 模 块,编译程序的组织,编译程序的遍(Passes)对一种代码形式从头到尾扫描描一遍将一个代码空间变换到另一个代码空间代码空间 = 代码 +
7、 符号表 + 其他有用信息,编译程序的组织取决于各遍的组织单遍编译程序,多遍编译程序多个遍之间有逻辑上的先后关系多个遍的实现可采用顺序结构或并发结构(后者不常用),编译程序的组织,例:一个以语法、语义分析程序为中心的单遍编译程序组织,source program,target program,语法、语义分析程序,词法分析程序,代码生成程序,编译程序的伙伴程序,解释程序(Interpreter)不产生目标程序不区别翻译阶段和执行阶段翻译源程序的每条语句后直接执行程序执行期间一直有解释程序守候常用于实现虚拟机,预处理程序(Preprocessor)支持宏定义(Macro definition)如C
8、源程序中 #define 行的处理支持文件包含(File inclusion)如C源程序中 #include 行的处理支持其他更复杂的源程序扩展信息,编译程序的伙伴程序,汇编程序(Assembler)翻译汇编语言程序至可重定位的(Relocatable)机器语言程序,装入和连接程序(Loader and Link-editor)装入程序对可重定位机器语言程序进行修改将相对地址变换为机器绝对地址连接程序合并多个可重定位机器语言程序文件到同一个程序装入和连接程序产生最终可执行的机器语言程序,编译程序的伙伴程序,编译程序、汇编程序及装入和连接程序之间的关系,编译程序的伙伴程序,编译过程和编译程序结构
9、,词法分析,语法分析,代码优化,中间代码生成,符号表组织与管理及出错处理,语义分析,目标代码生成,自动构造工具,运行时存储组织,词法分析,词法分析程序(Lexical Analyzer)或词法扫描程序(Lexical Scanner)的作用从左至右扫描构成源程序的字符流识别出有词法意义的单词(Token)返回单词的类别和单词的值,或词法错误信息,词法分析,例:Pascal 程序文本position := initial + rate * 60; 经词法分析程序处理后,转换为下列单词序列,单词类型 单词值标识符 position赋值算符 :=标识符 initial加算符 +标识符 rate乘算符
10、 *整数 60分号 ;,语法分析,语法分析程序(Parser)的作用从左至右扫描构成源程序的单词流返回语法分析结果(语法分析树,推导过程或归约过程)或语法错误信息,语法分析,例:Pascal 程序文本position := initial + rate * 60; 对应的单词流经语法分析程序处理后的结果可以表示成下列语法分析树,语义分析,语义分析(semantic analysis)的作用对语法分析后的程序进行静态语义分析不符合语义规则时给出语义错误信息,根据语义规则进行静态语义分析语义规则通常指对语言的上下文约束(Contextual constraints)如:作用域规则(scope ru
11、les)类型规则(type rules),语义分析,var rate:real;procedure initial;position := initial + rate * 60/* error */ /* error */ /* warning */;,例,语义分析,var rate:real;var position :real;var initial :real;position := initial + rate * 60/* warning */;,例,中间代码生成,在语法语义分析的基础上生成源程序的中间表示(Intermediate representation)形式,其作用主要是
12、建立源语言和目标语言之间的桥梁,避开二者之间较大的语义跨度,中间表示形式举例抽象语法树(Abstract syntax tree,AST)三地址码(Three-address code,TAC)P-codeBytecode,中间代码生成,例:右边源程序中的赋值语句可能转化为如下抽象语法树形式的中间表示,Var rate:real; Var position :real; Var initial :real; position := initial + rate * 60/* warning */; ,中间代码生成,例:右边源程序可能转化出如下三地址码形式的中间表示,Var rate:real;
13、 Var position :real; Var initial :real; position := initial + rate * 60/* warning */; ,id1:= id2 + id3 * 60 (1) (inttoreal, 60 - t1 ) (2) (* , id3 t1 t2 ) (3) (+ , id2 t2 t3 ) (4) (:= , t3 - id1 ),代码生成前如何安排目标机资源的使用,需要明确存储布局和存储分配策略,运行时存储组织,几个常见问题数据表示 如何在目标机中表示每个源语言类型的值表达式计算 如何组织表达式的计算存储分配 如何组织不同作用域变量
14、的存储过程实现 如何以例程实现过程/函数调用,参数传递,应用各种优化技术对代码进行变换以使得编译产生的目标代码高效,代码优化,例:,id1:= id2 + id3 * 60 (1) (inttoreal, 60 - t1 ) (2) (* , id3 t1 t2 ) (3) (+ , id2 t2 t3 ) (4) (:= , t3 - id1 ),(1) (* , id3 60.0 t1 ) (2) (+ , id2 t1 id1 ),可优化为:,生成目标虚拟机代码,目标代码生成,例:,(1) (* , id3 60.0 t1 ) (2) (+ , id2 t1 id1 ),生成汇编代码:,
15、movf id3,R2 mulf #60.0,R2 movf id2,R1 addf R2,R1 movf R1,id1,记录源程序中使用的名字收集每个名字的各种属性信息类型作用域分配存储信息符号表管理(symbol table management )登录查找,符号表组织与管理,出错处理,出错处理(error handling) 主要工作检查错误报告出错信息(error reporting) 排错恢复编译工作(error recovery),PL/0编译程序总体结构,T-型图,PL/0编译程序总体结构,PL/0编译程序的组织:一个以语法、语义分析程序为中心的单遍编译程序,PL/0 程序示例,类P-code虚拟机,