收藏 分享(赏)

A2013-9-CH01--编译概述.ppt

上传人:scg750829 文档编号:8168264 上传时间:2019-06-12 格式:PPT 页数:83 大小:885KB
下载 相关 举报
A2013-9-CH01--编译概述.ppt_第1页
第1页 / 共83页
A2013-9-CH01--编译概述.ppt_第2页
第2页 / 共83页
A2013-9-CH01--编译概述.ppt_第3页
第3页 / 共83页
A2013-9-CH01--编译概述.ppt_第4页
第4页 / 共83页
A2013-9-CH01--编译概述.ppt_第5页
第5页 / 共83页
点击查看更多>>
资源描述

1、第1章 编译概述,知识点:翻译、编译、解释的概念编译的阶段、任务、及典型结构编译程序的伙伴工具,2,编译概述,简介 1.1 翻译和解释 1.2 编译的阶段和任务 1.3 编译有关的其他概念 1.4 编译程序的伙伴工具 1.5 编译原理的应用小结,3,简介,什么是编译? 把源程序转换成等价的目标程序的过程即是编译。 编译程序的设计涉及到的知识: 程序设计语言 形式语言与自动机理论 计算机体系结构 数据结构 算法分析与设计 操作系统 软件工程等,4,1.1 翻译和解释,一、程序设计语言 二、翻译程序,5,一、程序设计语言,低级语言 机器语言 符号语言 汇编语言高级语言 过程性语言面向用户的语言 如

2、:C、Pascal 专用语言面向问题的语言 如:SQL 面向对象的语言 如:Java、C+,6,7,8,9,高级语言的优点,高级语言独立于机器。所编程序移植性比较好。 不必考虑存储单元的分配问题、数据的外部形式转换成机器的内部形式等细节。 用变量描述存储单元 具有丰富的数据结构和控制结构。 数据结构:数组、记录等 控制结构:循环、分支、过程调用等。 更接近于自然语言。 可读性好,便于维护。 编程效率高。,10,11,把英文翻译为中文 识别出句子中的一个个单词; 分析句子的语法结构; 根据句子的含义进行初步翻译; 对译文进行修饰; 写出最后的译文。,二、翻译程序,12,翻译程序扫描所输入的源程序

3、,并将其转换为目标程序,或将源程序直接翻译成结果。,编译器(即编译程序):把源程序翻译成目标程序的翻译器。笔译 解释器(即解释程序):直接执行源程序的翻译器。口译,13,编译程序,源程序是用高级语言或汇编语言编写的,目标程序是用目标语言表示的。,14,编译和执行阶段,编译时间:实现源程序到目标程序的转换所占用的时间。 源程序和数据是在不同时间(即分别在编译阶段和运行阶段)进行处理的。,源程序,目标程序,编译时,数据,执行时,15,解释程序,解释程序解释执行源程序,不生成目标程序。 同时处理源程序和数据。,源程序,数据,16,total:=total+rate*4 的解释过程,解释程序先将源程序

4、转换成一棵树,遍历该树,执行结点上所规定的动作。,调用一个过程,执行右边的表达式,计算结果送入total的存储单元,递归调用过程,对表达式进行计算,17,另一种有效的方法:先将源程序转换为某种中间形式,然后对中间形式的程序解释执行。例如: JAVA语言,操作系统平台,Java虚拟机(解释器),Java编译器,18,19,编译过程,把英文翻译为中文 识别出句子中的一个个单词; 分析句子的语法结构; 根据句子的含义进行初步翻译; 对译文进行修饰; 写出最后的译文。,词法分析,语法分析,语义分析和中间代码生成,优化,目标代码生成,20,1.2 编译的阶段和任务,一、分析阶段根据源语言的定义,分析源程

5、序的结构 1.词法分析 2.语法分析 3.语义分析 二、综合阶段根据分析结果构造出所要求的目标程序 4.中间代码生成 5.代码优化 6.目标代码生成 三、符号表的管理 四、错误诊断和处理,21,编译程序的典型结构,22,一、分析阶段,任务:根据源语言的定义,对源程序进行结构分析和语义分析,从而把源程序正文转换为某种内部表示。 分析阶段是对源程序结构的静态分析。 任务划分: 1.词法分析 2.语法分析 3.语义分析,23,1. 词法分析,扫描,线性分析 词法分析器: 依次读入源程序中的每个字符,对构成源程序的字符串进行分解,识别出每个具有独立意义的字符串作为记号(token)并组织成记号流。 把

6、需要存放的单词放到符号表中,如变量名,标号,常量等。 形成记号的字符串叫做该记号的单词(lexeme)。 工作依据:源语言的构词规则(即词法),也称为模式(pattern)。 标识符的模式是:以字母开头的字母数字序列。,24,词法分析器从左到右扫描组成源程序的字符串,并将其转换成单词(记号token)串;同时要:查词法错误,进行标识符登记符号表管理。 输入:字符串 输出:(种别码,属性值)序对属性值token的机内表示,25,sum=(10+20)*(num+square);,结果: (标识符,sum) (赋值号,=) (左括号, ( ) (整常数,10) (加号,+ ) (整常数,20) (

7、右括号, ) ) (乘号,* ) (左括号, ( ) (标识符,num) (加号,+ ) (标识符,square) (右括号, ) ) (分号,; ),26,对 total:=total+rate*4 的词法分析,(1) 标识符 total (内部名字为id1) (2) 赋值号 := (3) 标识符 total (内部名字为id1) (4) 加号 + (5) 标识符 rate (内部名字为id2) (6) 乘号 * (7) 整常数 4,27,空格、注释的处理及其他,分隔记号的空格:被删去 源程序中的注释:被跳过 识别出来的标识符要放入符号表。 对某些记号还要增加一个“属性值” 如发现标识符to

8、tal时,词法分析器不仅产生一个记号如id,还把它的单词total填入符号表(如果total在表中不存在的话),记号id的属性值就是指向符号表中R条目的指针。,28,2. 语法分析,层次结构的分析 把记号流按语言的语法结构层次地分组,以形成语法短语或语法单位。 源程序的语法短语常用分析树表示。 工作依据:源语言的语法规则。 输入:token序列 输出:语法成分,29,功能: 实现“组词成句”,将词组成各类语法成分:表达式、因子、项,语句,子程序 构造分析树 指出语法错误 制导翻译,30,程序的层次结构通常由递归的规则表示, 【例如】表达式的定义规则如下: (1) 任何一个标识符是一个表达式 (

9、2) 任何一个数是一个表达式 如果expr1和expr2是表达式,expr1+expr2、 expr1*expr2、(expr1)也都是表达式。【例如】使用如下规则递归地定义语句: (1) 如果id是一个标识符,expr是一个表达式,则id:= expr是一个语句。 (2) 如果expr是一个表达式,stmt是语句,则while(expr) do stmt和if(expr) then stmt都是语句。,31,根据语句和表达式的定义规则,构造total:=total+rate*4 的分析树,total是表达式; rate 是表达式; 4是表达式 rate*4是表达式; total+rate*4

10、是表达式 total:=total+rate*4是一个语句,32,total:=total+rate*4 的分析树,33,与该分析树对应的语法树如下:,语法树是分析树的浓缩表示,其中,算符作为内部结点,运算对象作为子结点。,34,3. 语义分析,对语句的意义进行检查分析 收集类型等必要信息 用语法分析确定的层次结构表示各语法成份 工作依据:源语言的语义规则(程序语义正确性的规定) 一个重要任务:类型检查 根据规则检查每个运算符及其运算对象是否符合要求; 数组的下标是否合法; 过程调用时,形参与实参个数、类型是否匹配等,float total, rate; total:=total+rate*4

11、,35,赋值语句 total:=total+rate*4 插入转换符的语法树,增加一个语义处理结点:将整型变为实型的一目运算符,36,total:=total+rate*4 的各分析步骤及其中间结果,id1:=id1+id2*4,37,二、综合阶段,任务:根据所制定的源语言到目标语言的对应关系,对分析阶段所产生的中间形式进行综合加工,从而得到与源程序等价的目标程序。 任务划分: (4) 中间代码生成 (5) 代码优化 (6) 目标代码生成,38,4. 中间代码生成,中间代码:一种抽象的机器程序(与机器无关) 中间代码应具有两个重要的特点: 易于产生 易于翻译成目标代码 中间代码有多种形式: 三

12、地址代码具有的特点: 每条指令除了赋值号之外,最多还有一个运算符。 编译程序必须生成临时变量名,以便保留每条指令的计算结果。 有些“三地址”指令少于三个操作数,39,total:=total+rate*4 的三地址代码,temp1:=inttoreal(4) temp2:=id2*temp1 temp3:=id1+temp2 id1:=temp3,40,5. 代码优化,对代码进行改进(加工变换),使之占用的空间少、运行速度快。,什么是代码优化?,代码优化首先是在中间代码上进行的。,temp1:=id2*4.0 temp2:=id1+temp1 id1:=temp2,temp1:=inttore

13、al(4) temp2:=id2*temp1 temp3:=id1+temp2 id1:=temp3,41,6. 目标代码生成,将中间代码变换成特定机器上的目标代码。 依赖于硬件系统结构和机器指令的含义。 生成的目标代码一般是可以重定位的机器代码或汇编语言代码。 涉及到的两个重要问题: 对程序中使用的每个变量要指定存储单元(即,分配具体的存储地址) 对变量进行寄存器分配(即,使用实际机器的寄存器),42,total:=total+rate*4 的目标代码,MOVF id2, R2 MULF #4.0, R2 MOVF id1, R1 ADDF R2, R1 MOVF R1, id1,43,te

14、mp1:=inttoreal(4) temp2:=id2*temp1 temp3:=id1+temp2 id1:=temp3,temp1:=id2*4.0 temp2:= id1+trmp1 id1:= temp2,MOVF id2, R2 MULF #4.0, R2 MOVF id1, R1 ADDF R2, R1 MOVF R1, id1,44,total:=total+rate*4 的翻译过程,total:=total+rate*4,temp1:=inttoreal(4) temp2:=id2*temp1 temp3:=id1+temp2 id1:=temp3,temp1:=id2*4.

15、0 temp2:= id1+trmp1 id1:= temp2,MOVF id2, R2 MULF #4.0, R2 MOVF id1, R1 ADDF R2, R1 MOVF R1, id1,id1:=id1+id2*4,45,三、符号表管理,编译程序的一项重要工作: 记录源程序中使用的标识符 收集每个标识符的各种属性信息 符号表是由若干记录组成的数据结构 每个标识符在表中有一条记录 记录的域是标识符的属性 对符号表结构的要求: 应允许快速地找到标识符的记录 可在其中存取数据 标识符的各种属性是在编译的各个不同阶段填入符号表的。,46,声明语句:float total, rate;,词法分析

16、器: float是关键字 total、rate是标识符 在符号表中创建这两个标识符的记录 语法分析器: total、rate都表示变量 float表示这两个变量的类型 可以把这两种属性及存储分配信息填入符号表。 在语义分析和生成中间代码时,还要在符号表中填入对这个float型变量进行存储分配的信息。,47, ,管理各种符号表(常数、标号、变量、过程、结构。),查、填(登记、查找)源程序中出现的符号和编译程序生成的符号,为编译的各个阶段提供信息。 辅助语法检查、语义检查 完成静态绑定、管理编译过程 Hash表、链表等各种表的查、填技术。“数据结构与算法”课程的应用。,48,四、错误处理,在编译的

17、每个阶段都可能检测到源程序中存在的错误 词法分析程序可以检测出非法字符错误。 语法分析程序能够发现记号流不符合语法规则的错误。 语义分析程序试图检测出具有正确的语法结构,但对所涉及的操作无意义的结构。 代码生成程序可能发现目标程序区超出了允许范围的错误。 由于计算机容量的限制,编译程序的处理能力受到限制而引起的错误。 处理与恢复 判断位置和性质 适当的恢复,49,Error classification,按照发现时翻译器所处的阶段进行分类: Lexical: character-level error, such as illegal character (hard to distinguis

18、h from syntax). Syntax: error in structure (e.g., missing semicolon or keyword). Static semantic: non-syntax error prior to execution (e.g., undefined vars, type errors). Dynamic semantic: non-syntax error during execution (e.g., division by 0). Logic: programmer error,50,Notes on error reporting,A

19、compiler will report lexical, syntax, and static semantic errors. It cannot report dynamic semantic errors. An interpreter will often only report lexical and syntax errors when loading the program. Most interpreted languages (e.g. Lisp, Smalltalk) do not define any static semantic errors. No transla

20、tor can report a logic error.,51,Sample Errors (Java):,public int gcd ( int v# ) int z = 5 y = v; while ( y = 0 ) int t = y; y = z % y; z = t;return y; ,/ lexical syntax / syntax - missing ; / static semantic - y undefined / dynamic semantic - division by 0/ logic - should return z,52,1.3 编译有关的其他概念,

21、一、前端和后端二、“遍”,53,一、前端和后端,前端主要由与源语言有关而与目标机器无关的那些部分组成 词法分析、语法分析、符号表的建立、语义分析和中间代码生成 与机器无关的代码优化工作 相应的错误处理工作和符号表操作 后端由编译程序中与目标机器有关的部分组成 与机器有关的代码优化、目标代码的生成 相应的错误处理和符号表操作,54,把编译程序划分成前端和后端的优点: 便于移植、便于编译程序的构造。 例如: 将某一编译程序的前端加上相应不同的后端,则可以为不同的机器构成同一源语言的编译程序。 将不同语言编译的前端生成同一种中间语言,再使用一个共同的后端,则可以为同一机器生成几个语言的编译程序。,5

22、5,二、遍,一“遍”是指对源程序或其中间形式从头到尾扫描一遍,并作相关的加工处理,生成新的中间形式或目标程序。 根据系统资源的状况、运行目标的要求等,可以将一个编译程序设计成多遍(Pass)扫描的形式,在每一遍扫描中,完成不同的任务。如:首遍构造语法树,二遍处理中间表示,56,一遍扫描的编译程序 多遍编译程序,遍可以和阶段相对应,也可以和阶段无关 单遍代码不太有效 编译程序的结构受“遍”的影响 遍数 分遍方式,57,一遍扫描的编译程序 书12页,语法分析器,词法分析器,语义分析及代码生成,控制流 信息流,开始,结束,整理目标程序,58,多遍编译程序,59,编译程序分遍的优缺点,分遍的主要好处:

23、 可以减少对主存容量的要求 可使各遍编译程序功能独立、单纯,相互联系简单,编译程序结构清晰。 能够实现更充分的优化工作,获得高质量目标程序。 通过分遍将编译程序的前端和后端分开,可以为编译程序的移植创造条件。分遍的缺点: 增加了不少重复性的工作。,60,1.4 编译程序的伙伴工具,61,一、预处理器 二、汇编程序 三、连接装配程序,编译程序的前后处理器,62,一、预处理器,预处理器的主要功能: 1.宏处理 2.文件包含 3.语言扩充,63,1. 宏理器,预处理器允许用户在源程序中定义宏。 C语言源程序中的一个宏定义:#define prompt(s) fprintf(stderr, s) 宏处

24、理器处理两类语句,即宏定义和宏调用。 宏定义通常用统一的字符或关键字表示,如define或macro,宏定义由宏名字及宏体组成,通常宏处理器允许在宏定义中使用形参。宏调用由调用宏的命令名(宏名)和所提供的实参组成。宏处理器用实参代替宏体中的形参,再用变换后的宏体替换宏调用本身。,64,2. 文件包含,预处理器把文件的包含声明扩展为程序正文。C语言程序中的“头文件”包含声明行:#include 预处理器处理到该语句时,就用文件stdio.h的内容替换此语句。,65,3. 语言扩充,有些预处理器用更先进的控制流和数据结构来增强原来的语言。例如: 预处理器可以将类似于while或if-then-el

25、se语句结构的内部宏提供给用户使用,而这些结构在原来的程序设计语言中是没有的。 当程序中使用了这样的结构时,由预处理器通过宏调用实现语言功能的扩充。,66,二、汇编程序,汇编语言用助记符表示操作码,用标识符表示存储地址。 赋值语句b:=a+2相应的汇编语言程序为:MOV a, R1ADD #2, R1MOV R1, b 最简单的汇编程序对输入作两遍扫描。,67,第一遍,找出标志存储单元的所有标识符,并将它们存储到汇编符号表中。 汇编符号表独立于编译程序的符号表 在符号表中指定该标识符所对应的存储单元地址,此地址是在首次遇到该标识符时确定的。假定一个字包括4个字节,每个变量占一个字,完成第一遍扫

26、描后,得到汇编符号表:标识符 地址 a 0 b 4,68,第二遍,把每个用助记符表示的操作码翻译为二进制表示的机器代码。 把用标识符表示的存储地址翻译为汇编符号表中该标识符所对应的地址。 输出通常是可重定位的机器代码。 起始地址为0,各条指令及其所访问的地址都是相对于0的逻辑地址。 当装入内存时,可以指定任意的地址L作为开始单元。 输出中要对那些需要重定位的指令做出标记 标记供装入程序识别,以便计算相应的物理地址。,69,举例:可重定位机器代码,假定:0001 代表 MOV S, R0011 代表 ADD0010 代表 MOV R, D 假定机器指令的格式为:操作符 寄存器 寻址模式 地址第二

27、遍输出的可重定位机器代码:0001 01 00 00000000*0011 01 10 000000100010 01 00 00000100*,b:=a+2的汇编代码 MOV a, R1ADD #2, R1MOV R1, b,70,绝对机器代码,假如装入内存的起始地址为L=00001111 则a和b的地址分别是15和19 则装入后的机器代码为:0001 01 00 000011110011 01 10 000000100010 01 00 00010011,可重定位机器代码:0001 01 00 00000000*0011 01 10 000000100010 01 00 00000100*

28、,b:=a+2的汇编代码 MOV a, R1ADD #2, R1MOV R1, b,71,三、连接装配程序,装入 读入可重定位的机器代码 修改重定位地址 把修改后的指令和数据放在内存的适当地方或形成可执行文件连接 把几个可重定位的机器代码文件连接成一个可执行的程序,72,1.5 编译原理的应用,语法制导的结构化编辑器 程序格式化工具 软件测试工具 程序理解工具 高级语言的翻译工具,73,语法制导的结构化编辑器,具有通常的正文编辑和修改功能 能像编译程序那样对源程序进行分析,把恰当的层次结构加在程序上。 可以保证源程序 无语法错误 有统一的可读性好的程序格式 结构化编辑器能够执行一些对编制源程序

29、有用的附加任务,如: 检查用户的输入是否正确 自动提供关键字 从BEGIN或左括号跳到与其相匹配的END或右括号,74,程序格式化工具,读入并分析源程序 使程序结构变得清晰可读,如: 用缩排方式表示语句的嵌套层次结构 用一种专门的字型表示注释等,75,软件测试工具,静态测试动态测试,动态测试器,静态测试器,读入源程序 在不运行该程序的情况下对其进行分析,以发现程序中潜在的错误或异常。不可能执行到的死代码 未定义就引用的变量 试图使用一个实型变量作为指针等。,利用测试用例实际执行程序 记录程序的实际执行路线 将实际运行结果与期望结果进行比较,以发现程序中的错误或异常。,76,程序理解工具,对源程

30、序进行分析 确定各模块间的调用关系 记录程序数据的静态属性和结构属性 画出控制流程图,77,高级语言的翻译工具,将用某种高级语言开发的程序翻译为另一种高级语言表示的程序,78,小 结,什么是编译 翻译程序: 编译程序(编译程序、汇编程序)、解释程序 二者的异同 编译系统(编译环境) 编译程序的伙伴工具、功能及工作原理 预处理器 汇编程序 连接装配程序,汇编语言的源程序 汇编语言程序,汇编程序,目标程序=目标代码,机器码的目标程序,源语言与源程序,目标语言与目标语言程序,79,小 结(续),编译程序的各组成部分及其功能 词法分析 语法分析 语义分析 中间代码生成 代码优化 目标代码生成 前端和后端 遍 编译程序的设计涉及到的知识,本章结束,81,补充知识;,目标代码三种形式: 绝对指令代码: 具有绝对地址的机器指令,可直接运行 可重新定位指令代码: 模块结构的机器指令,需要连接装配 汇编指令代码: 汇编语言形式的目标程序,需要进行汇编,返回,82,中间代码:sum=(10+20)*(num+square);,返回,83,致谢 PPT参考资料:,编译原理与技术 李文生 清华大学出版社 编译原理 国防科技大学 计算机系王挺 编译原理 哈工大 计算机科学与技术系姜守旭,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报