版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、编译原理课程信息,教学目的与要求: 编译程序是现代计算机系统的基本组成部分之一。本课程重点讲述编译程序的设计原理和常用实现技术。通过课程的学习和实验的完成,应该清楚的理解一个编译程序是如何工作的;如果在以后遇到了任何一个程序设计语言,应该知道如何实现这个语言的多数机制;应具有一定的使用编译构造工具开发编译程序的经验;会将所学的常用技术和算法应用于类似的软件的设计和实现中。,教材及主要参考书,教材:编译原理(第2版),张素琴、吕映芝、蒋维杜、戴桂兰,清华大学出版社 2004 参考书:Compilers: Principles, Technigues, and Tools Alfred V.Aho
2、, Ravi Sethi, Jeffrey D.Ullman, Addison-Wesley,1986. 影印版:人民邮电出版社,2001 参考书:程序设计语言 编译原理(第3版),陈火旺、刘春林等,国防工业出版社 2000 等等,教学内容,1 编译程序概述 编译程序是现代计算机系统的基本组成部分之一.编译程序一般由词法分析程序,语法分析程序,语义分析程序,中间代码生成程序,目标代码生成程序,代码优化程序,符号表管理程序和错误处理程序等成分构成。本章概要介绍编译成分的主要功能以及编译阶段的逻辑关系。 2 PL/0 编译程序剖析 给出一个简单的类Pascal语言,其编译程序用高级语言(C和Pas
3、cal)实现。通过剖析该高级语言程序以理解各编译成分的功能及手工实现方法。,教学内容,3 高级语言的认识 要学习和构造编译程序,理解和定义程序设计语言是必不可少的。每个程序设计语言都有一定的规则用以规定合适程序的语法结构,也需要有对一个程序的含义的描述。上下文无关文法给出程序设计语言的精确的,易于理解的语法说明。尚没有公认的形式系统描述程序含义,但也有流行的描述语义规则的方法属性文法。 4 词法分析程序的自动构造 词法分析程序是编译程序的一个构成部分,它的主要任务是扫描源程序,按构词规则识别单词,并报告发现的词法错误。正则表达式和有穷状态自动机分别作为单词的描述工具和识别机制,成为词法分析程序
4、的自动构造原理,学习Lex(Flex)工具的使用方法。,教学内容,5 语法分析程序的构造 自顶向下的语法分析。可以看作是为一个输入串寻找一个最左推导的过程,也等价于从根开始,按前序生成结点,为输入串构造分析树的过程。讨论一种有效的无回溯的自顶向下分析程序,这种分析程序称为预测分析程序。介绍对于一个文法类:LL(1)文法, 如何自动的构造预测分析程序。 自底向上(自下而上)语法分析方法,也称移进-归约分析法。它的实现思想是对输入符号串自左向右进行扫描,并将输入符逐个移入一个后进先出栈中,边移进边分析,一旦栈顶符号串形成可归约串,就用相应非终结符代替可归约串,这称为一步归约,重复这一过程,直到归约
5、到栈中只剩文法的开始符号时,则为分析成功,并确认输入串是文法的句子。本章介绍LR分析法,分析过程中归约的是当前句型的句柄,称为规范归约。重点讲解LR类(LR(0)、SLR(1)、LALR(1)、LR(1)文法的分析表的构造原理。,教学内容,6 语义分析和中间代码生成 在词法分析和语法分析之后,编译程序下一个逻辑阶段的任务是语义分析和生成中间代码。引入属性文法和语法制导的翻译的概念,介绍中间代码的形式,针对一些语法成分讨论相应语义处理工作的描述。 7 符号表 介绍符号表的一般组织和使用方法,讨论分程序结构语言的名字作用域分析及符号表设计方案。,教学内容,8 运行时的存储组织和管理 编译的最终目标
6、是生成目标程序。在目标代码生成前,编译程序必须对目标程序运行时的数据空间进行组织和安排. 介绍目标程序运行时的数据空间的存储分配策略,说明程序设计语言本身关于名称的作用域和生存期的规则与存储分配策略的关系,重点讨论栈式动态存储方案.,教学内容,9 代码优化和目标代码生成 代码优化是对代码作一些等价变换,以使得最后生成的目标代码更为高效。介绍优化技术,优化分类以及优化工作的基础控制流和数据流分析问题。 编译的最后一个逻辑阶段是目标代码生成。目标代码生成程序的设计细节要考虑目标语言和操作系统的特点。讨论目标代码生成程序设计的一般问题,包括指令选择,寄存器分配和计算顺序选择。,第1章 概述,1.1
7、什么是编译程序 1.2 程序设计语言的实现 1.3 处理源程序的软件工具 1.4 编译技术的发展,1.1什么是编译程序(compiler),编译程序是现代计算机系统的基本组成部分. 从功能上看,一个编译程序就是一个语言翻译程序,它把一种语言(称作源语言)书写的程序翻译成另一种语言(称作目标语言)的等价的程序.,什么是编译程序,功能,术语 编译程序的源语言(源程序) 编译程序的目标语言(目标程序) 编译程序的实现语言,高级语言 书写的程序,编译程序,低级语言程序,什么是编译程序,分类 软件 系统软件 语言处理系统,分类,软件:计算机系统中的程序及其文档 系统软件:居于计算机系统中最靠近硬件的一层
8、,其他软件一般都通过系统软件发挥作用。他和具体的应用领域无关,如编译系统和操作系统等。,语言处理系统:把软件语言书写的各种程序处理成可在计算机上执行的程序。 软件语言:用于书写软件的语言。它主要包括需求定义语言,功能性语言,设计性语言,程序设计语言以及文档语言。,什么是编译程序,语言转(变)换系统,C+编译器,C+,C,Java,Bytecode,Java编译器,术语,编译程序(compiler) 编译程序的源语言(源程序) (source language)(source program) 编译程序的目标语言(目标程序) (object or target language)(object
9、or target program) 编译程序的实现语言(implementation language) 语言处理程序(language processor) 语言转(变)换(language transformation),编译逻辑过程,词法分析 语法分析 语义分析 中间代码生成 代码优化 目标代码生成,词法分析第一步识别单词,英文句子由单词构成 This line is a longer sentence. (字母组成的有集体含义的最小成分) 句子开头的单词第一个字母要大写 空格是单词分隔符 句点是句子结尾 中文分词?汉语编程?语言的发展?,无鸡鸭也可无鱼肉也可惟青菜豆腐不可少不得学费,
10、词法分析,从左至右扫描字符流的源程序、分解构成源程序的字符串,识别出(拼)一个个的单词(符号) 单词符号是语言中具有独立意义的最基本结构。多数程序语言中,单词符号一般包括 各类型的常数、保留字、标识符、运算符、界符等等。 例如 double f = sqrt(-1);,词法分析,double f = sqrt(-1); TDOUBLE (“double”)TIDENT (“f”)TOP (“=“)TIDENT (“sqrt”) TLPAREN (“(“) TOP (“-”)TINTCONSTANT (“1”)TRPAREN (“)”)TSEP (“;”),词法分析,词法分析(lexical a
11、nalysis or scanning) -The stream of characters making up a source program is read from left to right and grouped into tokens, which are sequences of characters that have a collective meaning. 单词-token 保留字-reserved word 标识符 -identifier(user-defined name),例,程序文本If x = y then z := 1 else z := 2; 经词法分析,
12、变成一个个单词 if, x, =, y, then, z, :=, 1, else, z, :=, 2, ; 语言的单词符号是由词法规则所确定的。词法规则规定了字母表中哪样的字符串是一个单词符号。,词法分析position := initial + rate * 60;,单词类型单词值 标识符1(id1) position 算符(赋值) := 标识符2(id2) initial 算符(加) + 标识符3(id3) rate 算符(乘) * 整数 60 分号 ;,语法分析 Syntax Analysis功能:层次分析.依据源程序的语法规则把源程序的单词序列组成语法短语(表示成语法树).,也称为
13、“parsing” 使用 context-free grammars 结构上的合法性Structural validation (可生成语法树或推导Creates parse tree or derivation),This line is a longer sentence,分析程序成分,double f = sqrt(-1); “sqrt(-1)”的推导,Expression FuncCall TIDENT TLPAREN Expression TRPAREN TIDENT TLPAREN UnaryExpression TRPAREN TIDENT TLPAREN TOP Express
14、ion TRPAREN TIDENT TLPAREN TOP TINTCONSTANT TRPAREN,规则 Expression - UnaryExpressionExpression - FuncCallExpression - TINTCONSTANTUnaryExpression - TOP ExpressionFuncCall - TIDENT TLPAREN Expression TRPAREN,double f = sqrt(-1);的Parsing ?,语言的语法规则规定了如何从单词符号形成更大的结构(即语法单位),语法分析,又例: position := initial +
15、rate * 60 ; (Pascal)规则 :=“:=” :=“+” :=“*” :=“(”“)” := := :=,赋值语句,标识符,表达式,表达式,+,表达式,表达式,标识符,整数,标识符,:=,表达式,*,id1:=id2+id3*N,语法分析,语法分析(syntax analysis or parsing) The purpose of syntax analysis is to determine the source programs phrase structure.This process is also called parsing.The source program i
16、s parsed to check whether it conforms to the source languages syntax,and to construct a suitable representation of its phrase structure. 语法树(推导树)(parse tree or derivation tree),语义分析,句子的结构理解了,扑捉它的“含义” 如:杰克说杰瑞把他的作业落在了家里。 “他的”是谁的? 又:杰克说杰克把他的作业落在了家里。 几个杰克?,语义分析,杰克把她的作业落在了家里。 (杰克是男生)“杰克”和“她的”不一致。 “杰克”和“他
17、的”才匹配,程序设计语言靠严格的约束规则解决二义。, int jack=3; int jack=4; cout jack; ,语义分析进一步分析语法结构正确的程序是否符合源程序的上下文约束、运算相容性等规定。,审查静态语义 使用的变量声明了吗? 允许操作的运算对象吗? 类型正确吗? ,例:Program p(); Var rate:real; procedure initial; position := initial + rate * 60 /* error */ /* error */ /* warning */; ,Program p(); Var rate:real; Var init
18、ial :real; Var position :real ; position := initial + rate * 60 /*warning*/,语义分析(处理),语义分析(语言的规定和实现),int arr2, c; c = arr * 10;,语义分析,语义分析(semantic analysis) The parsed program is further analyzed to determine whether it conforms to the source languages contextual constraints: scope rules, type rules
19、e.g. To relate each applied occurrence of an identifier in the source program to the corresponding declaration.,中间代码(中间表示)生成(翻译),源程序的内部(中间)表示 三元式、四元式、P-Code、C-Code、U-Code、bytecode ( * id3t1t2) t2 = id3 * t1 t2 := id3 * t1,id1:= id2 + id3 * 60 (1)(inttoreal,60-t1) (2)(*,id3t1t2) (3)(+,id2t2t3) (4)(:=
20、,t3-id1),翻译为中间代码,Three-address code,j = 2 * i + 1;if (j = n) j = 2 * i + 3;return aj;,t1 = 2 * it2 = t1 + 1j = t2t3 = j nif t3 goto L0t4 = 2 * it5 = t4 + 3j = t5L0: t6 = ajreturn t6,中间代码(intermediate code),Intermediate code is a intermediate representation of the source program . We want this repres
21、entation ( intermediate representation) to be easy to generate, and easy to translate into the target program. The representation can have a variety of forms, a common one is called three-address code or 4- tuple code.,不同层次的中间代码,代码优化Code Optimization应用一些技术对代码进行变换以使得编译产生的目标代码高效。,Example(中间代码一级),t1 =
22、2 * it2 = t1 + 1j = t2t3 = j nif t3 goto L0t4 = 2 * it5 = t4 + 3j = t5L0: t6 = ajreturn t6,t1 = 2 * ij = t1 + 1t3 = j nif t3 goto L0 j = t1 + 3L0: t6 = ajreturn t6,代码优化,id1:= id2 + id3 * 60 (1)(inttoreal60-t1) (2)( * id3t1t2) (3)( +id2t2t3) (4)( :=t3-id1) 变换 (1) ( *id360.0t1) ( 2)( + id2 t1id1),目标代码
23、生成,(*,id360.0t1) (+,id2t1id1),movid3,R2 mul#60.0,R2 movid2,R1 addR2,R1 movR1,id1,编译程序的工作,分析(analysis)和综合(synthesis) 源程序的分析 线性分析 层次分析 语义分析 目标程序的综合 编译阶段的划分前端(front end)和后端(back end) 编译的前端 与源语言有关但与目标机无关的那些部分组成 编译的后端 与目标机有关的那些部分组成 遍(趟)从头到尾扫描源程序(各种形式)一遍(pass),编译程序结构(components),词法分析程序 语法分析程序 语义分析程序 中间代码生
24、成程序 代码优化程序 目标代码生成程序 符号表管理程序 出错处理程序,出 错 处 理 程 序,表 格 管 理 程 序,符号表,记录源程序中使用的名字 收集每个名字的各种属性信息 类型、作用域、分配存储信息,name: I kind:常量 value:35 name:object kind:变量 type:实 level:2 add: dx 符号表管理(登录,查找) symbol table management,出错处理(error handling ),检查错误、报告出错信息、排错、恢复编译工作 (error reporting and error recovery) 早期的出错管理(复杂、
25、低效),1.2程序设计语言的实现有些语言基本通过解释程序 Java的Bytecode有些环境同时提供编译程序和解释系统 Lisp,主要的途径有两个:通过编译程序和解释程序,编译程序,低级语言程序,高级语言程序,高级语言程序,解释程序,计算结果,编译程序和解释系统,如对源程序: b := 2 ; a := b+2 ; 编译程序 write a ; 解释程序 直接将4的值输出(显示) (直接对源程序中的语句进行分析,执行其隐含的操作。),Int 2 St b Ld b add 2 St a,生成代码,编译程序和解释程序,编译程序是一个语言处理程序,它把一个高级语言程序翻译成某个机器的汇编或二进制代
26、码程序, 这个二进制代码程序在机器上运行以生成结果.因此通过编译程序使得我们可以先准备好一个在该机器上运行的程序,然后这个程序便会以机器的速度运行.但是在不把整个程序全部都翻译结束之后,这个程序是不能开始运行,也不能产生任何结果的.编译和运行是两个独立分开的阶段. 但在一个交互环境中,不需要将这两个阶段分隔开,编译就不如解释的方法更方便. 另一种语言处理程序,解释程序,它不需要在运行前先把源程序翻译成目标代码,也可以让我们实现在某台机器上运行程序并生成结果.,解释程序,是这样一个程序,它接受某个语言的程序并立即运行这个源程序.它的工作模式是一个个的获取,分析并执行源程序语句,一旦第一个语句分析
27、结束,源程序便开始运行并且生成结果, 它特别适合程序员交互方式的工作情况,即希望在获取下一个语句之前了解每个语句的执行结果,允许执行时修改程序. 著名的解释程序有Basic语言解释程序 ,Lisp语言解释程序,UNIX命令语言解释程序(shell),数据库查询语言SQL 解释程序以及bytecode解释程序.,高级语言解释系统(interpreter),功能 让计算机执行高级语言(basic,lisp,prolog) 与编译程序的不同 1)不生成目标代码 2)能支持交互环境 (同增量式编译系统) 源 程 序 初始数据,解释程序,计算结果,编译程序和解释程序的存储组织也有很大不同,编译程序处理时
28、,在源语言程序被编译阶段,存储区中要为源程序(中间形式)和目标代码开辟空间,要存放编译用的各种各样表格,比如符号表.在目标代码运行阶段,存储区中主要是目标代码和数据,编译所用的任何信息都不再需要. 解释程序一般是把源程序一个语句一个语句的进行语法分析,转换为一种内部表示形式,存放在源程序区,比如BASIC解释程序,将LET和GOTO这样的关键字表示为一个字节的操作码,标识符用其在符号表的入口位置表示.因为解释程序允许在执行用户程序时修改用户程序,这就要求源程序,符号表等内容始终存放在存储区中,并且存放格式要设计的易于使用和修改.,编译阶段和运行阶段存储结构,编译时 运行时,名字表,目标代码缓冲
29、区,编译用源程序中 间表示各种表格,目标代码区,数据区,源程序缓冲区,解释系统存储结构,语言处理过程,C程序 # include # include # define MAX_LINES 75 Enum booleans (FALSE,TRUE); Main (int argc,char *argv*) ,预处理器,编译器,汇编器,装配连接编辑,骨架程序,源程序,目标汇编程序,可重定位机器代码,绝对机器码,可重定位目标文件库,语言处理过程,1.3 处理源程序的软件工具 (编译技术的应用),结构化编缉器 程序分析工具 静态分析 动态分析 度量工具 结构度量 模块接口复杂度 c分析工具(sourc
30、e insight) 广泛的语言领域 数据库系统查询(SQL) 脚本语言 置标语言(SGML.HTML.XML),1.3处理源程序的软件工具,1.语言的结构化编辑器 2.语言程序的调试工具 3.程序格式化工具 4.语言程序测试工具 5.程序理解工具 6.高级语言之间的转换工具,1.语言的结构化编辑器 用户可使用该编辑器在语言的语法制导下编制出所需的源程序。结构化编辑器不仅具有通常的正文编辑器的正文编辑和修改功能,而且还能像编译程序那样对源程序正文进行分析。因此,结构化编辑器能够执行一些对编制程序有用的附加的任务。例如,它能够检查用户的输入是否正确,能够自动地提供关键字,当用户敲入if后,编辑器
31、立即显示then并将这两个关键字之间必须出现的条件留给用户输入,并能检查begin或左括号与end或右括号是否相匹配等等。由于结构化编辑器具有上述功能,既可保证编出的源程序无语法错误,并有统一的可读性好的程序格式,这无疑将会提高程序的开发效率和质量。 商用产品很多如Turbo-Edit,Editplus和Ultraedit等等.很多集成开发环境中里也都包含这种类似的工具,如Jbuilder中就有JAVA程序的结构化编辑器.,2.语言程序的调试工具 调试是软件开发过程中一个重要环节,结构化编辑器只能解决语法错误的问题,而对一个已通过编译的程序来说,需进一步了解的是程序执行的结果与编程人员的意图是
32、否一致,程序的执行是否实现预计的算法和功能。这种对算法的错误或程序没能反映算法的功能等错误就需用调试器来协助解决。,有一种调试器允许用户使用源程序正文和它的符号来调试,即一行一行的跟踪程序,查看变量和数据结构的变化以进行调试工作.当然,这些符号的信息必须由编译程序提供.调试器的实现可以有很多途径. 其中一种是写一个解释器,以交互的方式翻译和执行每一行,它必须维护其所有的运行时的资源以保证在程序执行期间很容易的查询不同变量的当前值. 如果不想通过解释程序允许编译了的代码调试,编译程序必须在目标代码(汇编)生成时同时生成特定的调试信息,比如,关联标识符和它表示的地址的信息,用于无歧义的引用一个声明
33、了多次的标识符的信息等等.调试功能愈强,实现愈复杂,它涉及源程序的语法分析和语义处理技术。,3.程序格式化工具程序格式化工具分析源程序并以使程序结构变得清晰可读的形式打印出来。例如,注释可以以一种专门的字形出现,且语句的嵌套层次结构可以用缩排方式(齿形结构)表示出来。 4.语言程序测试工具 语言程序的测试工具有两种:静态分析器和动态测试器。 静态分析器是在不运行程序的情况下对源程序进行静态地分析,以发现程序中潜在的错误或异常.它对源程序进行语法分析并制定相应表格,检查变量定值与引用的关系。如某变量未被赋值就被引用,或定值后未被引用,或多余的源代码等一些编译程序的语法分析发现不了的错误。 动态测
34、试工具也是首先对源程序进行分析,在分析基础上将用于记录和显示程序执行轨迹的语句或函数插入到源程序的适当位置,并用测试用例记录和显示程序运行时的实际路径,将运行结果与期望的结果进行比较分析,帮助编程人员查找问题。,5.程序理解工具对程序进行分析,确定模块间的调用关系,记录程序数据的静态属性和结构属性,并画出控制流程图,帮助用户理解程序。 6. 高级语言之间的转换工具 由于计算机硬件的不断更新换代,更新更好的程序设计语言的推出为提高计算机的使用效率提供了良好条件,然而一些已有的非常成熟的软件如何在新机器新语言情况下使用呢?为了减少重新编制程序所耗费的人力和时间,就要解决如何把一种高级语言转换成另一
35、种高级语言,乃至汇编语言转换成高级语言的问题。这种转换工作要对被转换的语言进行词法和语法分析,只不过生成的目标语言是另一种高级语言而已。这与实现一个完整的编译程序相比工作量要少些。 比如:C,PASCAL,FORTRAN到Ada的翻译器 IBM 4700汇编到C的转换器 COBOL 到Java 的编译器,计算模式,语言范式 语言应用领域,编译程序,万诺曼机体系结构 并行体系结构 嵌入系统,1.4 编译技术的发展,高级程序语言,不同的应用侧重: 数值计算- Fortran 系统程序设计-C 事务处理-obol VLSI设计-VHDL 人工智能-rolog 其它- 大型嵌入式实时处理-da 符号处
36、理-nobol 语言范型: 强制式语言-C,Fortran,Pascal 应用式(函数式)语言-ML,Lisp 基于规则(逻辑)的语言-Prolog,Yacc 面向对象语言-Ada,C+,Java,强制式语言(Imperative Language)也称过程式语言。,其特点是命令驱动,面向语句,一个强制式语言程序由一系列的语句组成,每个语句的执行引起若干存储单元中的值的改变,这种语言的语法形式通常具有如下形式; 语句1; 语句2; 语句3; 语言执行的解释与万诺曼机的体系结构对应:改变机器状态(内存,各种寄存器和外存的内容),应用式(函数式): 应用式语言(Applicative Language)更注重程序所表示的功能,而不是一个语句接一个语句地执行。程序的开发过程是从前面已有的函数出发构造出更复杂的函数,对初始数据集进行操作直至最终的函数可以用于从初始数据计算出最终
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 昆明工业职业技术学院《中国哲学方法论》2024-2025学年第二学期期末试卷
- 江西制造职业技术学院《机械制造工艺与装备》2024-2025学年第二学期期末试卷
- 四川电力职业技术学院《卡通形象设计》2024-2025学年第二学期期末试卷
- 西北大学现代学院《NoSQL数据库技术》2024-2025学年第二学期期末试卷
- 湖南石油化工职业技术学院《建筑设计(一)》2024-2025学年第二学期期末试卷
- 企业反舞弊与投诉举报制度
- 煤矿生产设备及材料查验制度
- 物资采购工作制度
- 右江民族医学院《影视音乐基础》2024-2025学年第二学期期末试卷
- 2026新疆昆玉城市建设投资运营集团有限责任公司招(竞)聘1人考试参考试题及答案解析
- JJF 1609-2017余氯测定仪校准规范
- GB/T 33328-2016色漆和清漆电导率和电阻的测定
- 中共历史上的重要会议总结
- 电力拖动自动控制系统-运动控制系统(第5版)习题答案
- 线性系统理论-郑大钟(第二版)课件
- 《杂环化学》课件
- 禾川x3系列伺服说明书
- 河南省周口市各县区乡镇行政村村庄村名居民村民委员会明细
- 企业培训5W2H分析法(31P PPT)
- 污水处理厂污泥脱水机房施工组织方案
- CCSA-量子保密通信技术白皮书
评论
0/150
提交评论