《编译原理课件 第一章(精品).ppt》由会员分享,可在线阅读,更多相关《编译原理课件 第一章(精品).ppt(48页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、编译原理编译原理主讲:汤浪平1课程信息教学目的与要求:教学目的与要求:编译程序是现代计算机系统的基本组成部分之一。编译程序是现代计算机系统的基本组成部分之一。本课程重点讲述编译程序的设计原理和常用实现本课程重点讲述编译程序的设计原理和常用实现技术。通过课程的学习和实验的完成,技术。通过课程的学习和实验的完成,应该应该清楚清楚的理解一个编译程序是如何工作的;如果在以后的理解一个编译程序是如何工作的;如果在以后遇到了任何一个程序设计语言,遇到了任何一个程序设计语言,应该应该知道如何实知道如何实现这个语言的编译机制;现这个语言的编译机制;应应具有一定的使用编译具有一定的使用编译构造工具开发编译程序的
2、经验;构造工具开发编译程序的经验;会会将所学的常用将所学的常用技术和算法应用于类似的软件的设计和实现中。技术和算法应用于类似的软件的设计和实现中。2教材及主要参考书教材:教材:编译原理及实现编译原理及实现孙悦红编,孙悦红编,清华出版社清华出版社参考书参考书:程序设计语言程序设计语言 编译原理编译原理(第(第3版),陈火旺、刘春林等,国防工业出版),陈火旺、刘春林等,国防工业出版社版社 2000编译原理编译原理 吕映芝编,清华出版社吕映芝编,清华出版社3教学内容1 编译程序概述编译程序概述编译程序是现代计算机系统的基本组成部编译程序是现代计算机系统的基本组成部分之一。它一般由词法分析程序,语法分
3、分之一。它一般由词法分析程序,语法分析程序,中间代码生成程序,目标代码生析程序,中间代码生成程序,目标代码生成程序,代码优化程序,符号表管理程序成程序,代码优化程序,符号表管理程序和错误处理程序等成分构成。和错误处理程序等成分构成。4教学内容2 高级语言的认识高级语言的认识 要学习和构造编译程序,理解和定义程序设计语言是要学习和构造编译程序,理解和定义程序设计语言是必不可少的。每个程序设计语言都有一定的规则用以规定必不可少的。每个程序设计语言都有一定的规则用以规定合适程序的语法结构,也需要有对一个程序的含义的描述。合适程序的语法结构,也需要有对一个程序的含义的描述。上下文无关文法给出程序设计语
4、言的精确的、易于理解的上下文无关文法给出程序设计语言的精确的、易于理解的语法说明。尚没有公认的形式系统描述程序含义,但也有语法说明。尚没有公认的形式系统描述程序含义,但也有流行的描述语义规则的方法流行的描述语义规则的方法属性文法。属性文法。3 词法分析程序的自动构造词法分析程序的自动构造 词法分析程序是编译程序的一个构成部分,它的主要词法分析程序是编译程序的一个构成部分,它的主要任务是扫描源程序,按构词规则识别单词,并报告发现的任务是扫描源程序,按构词规则识别单词,并报告发现的词法错误。正则表达式和有穷状态自动机分别作为单词的词法错误。正则表达式和有穷状态自动机分别作为单词的描述工具和识别机制
5、,成为词法分析程序的自动构造原理。描述工具和识别机制,成为词法分析程序的自动构造原理。5教学内容4 语法分析程序的构造语法分析程序的构造n自顶向下的语法分析。可以看作是为一个输入串寻找自顶向下的语法分析。可以看作是为一个输入串寻找一个最左推导的过程一个最左推导的过程,也等价于从根开始也等价于从根开始,按前序生成按前序生成结点,为输入串构造分析树的过程。讨论一种有效的结点,为输入串构造分析树的过程。讨论一种有效的无回溯的自顶向下分析程序无回溯的自顶向下分析程序,这种分析程序称为预测分这种分析程序称为预测分析程序。析程序。n自底向上(自下而上)语法分析方法,也称移进自底向上(自下而上)语法分析方法
6、,也称移进-归约归约分析法。它的实现思想是对输入符号串自左向右进行分析法。它的实现思想是对输入符号串自左向右进行扫描,并将输入符逐个移入一个后进先出栈中,边移扫描,并将输入符逐个移入一个后进先出栈中,边移进边分析,一旦栈顶符号串形成可归约串,就用相应进边分析,一旦栈顶符号串形成可归约串,就用相应非终结符代替可归约串,这称为一步归约,重复这一非终结符代替可归约串,这称为一步归约,重复这一过程,直到归约到栈中只剩文法的开始符号时,则为过程,直到归约到栈中只剩文法的开始符号时,则为分析成功,并确认输入串是文法的句子。分析成功,并确认输入串是文法的句子。6教学内容5 语义分析和中间代码生成语义分析和中
7、间代码生成 在词法分析和语法分析之后,编译程序下一个逻在词法分析和语法分析之后,编译程序下一个逻辑阶段的任务是语义分析和生成中间代码。引入辑阶段的任务是语义分析和生成中间代码。引入属性文法和语法制导的翻译的概念,介绍中间代属性文法和语法制导的翻译的概念,介绍中间代码的形式,针对一些语法成分讨论相应语义处理码的形式,针对一些语法成分讨论相应语义处理工作的描述。工作的描述。6 符号表符号表 介绍符号表的一般组织和使用方法,讨论分程序介绍符号表的一般组织和使用方法,讨论分程序结构语言的名字作用域分析及符号表设计方案。结构语言的名字作用域分析及符号表设计方案。7教学内容7 运行时的存储组织和管理运行时
8、的存储组织和管理 编译的最终目标是生成目标程序。在目标编译的最终目标是生成目标程序。在目标代码生成前,编译程序必须对目标程序运代码生成前,编译程序必须对目标程序运行时的数据空间进行组织和安排行时的数据空间进行组织和安排。介绍目介绍目标程序运行时的数据空间的存储分配策略,标程序运行时的数据空间的存储分配策略,说明程序设计语言本身关于名称的作用域说明程序设计语言本身关于名称的作用域和生存期的规则与存储分配策略的关系,和生存期的规则与存储分配策略的关系,重点讨论栈式动态存储方案。重点讨论栈式动态存储方案。8教学内容8 代码优化和目标代码生成代码优化和目标代码生成 代码优化是对代码作一些等价变换,以使
9、代码优化是对代码作一些等价变换,以使得最后生成的目标代码更为高效。介绍优得最后生成的目标代码更为高效。介绍优化技术,优化分类以及优化工作的基础化技术,优化分类以及优化工作的基础控制流和数据流分析问题。控制流和数据流分析问题。编译的最后一个逻辑阶段是目标代码生成。编译的最后一个逻辑阶段是目标代码生成。目标代码生成程序的设计细节要考虑目标目标代码生成程序的设计细节要考虑目标语言和操作系统的特点。讨论目标代码生语言和操作系统的特点。讨论目标代码生成程序设计的一般问题,包括指令选择,成程序设计的一般问题,包括指令选择,寄存器分配和计算顺序选择。寄存器分配和计算顺序选择。9教师联系信息教师联系信息汤浪平
10、Email:langping_Tel:15920136696QQ:4305134410第第1章章 编译系统概述编译系统概述1.1 程序设计语言的发展程序设计语言的发展 1.2 基本术语解释基本术语解释1.3 编译程序的组成编译程序的组成1.4 编译程序的结构编译程序的结构1.5 编译程序的前端和后端编译程序的前端和后端1.6 TEST语言与编译器语言与编译器11编译程序概述编译程序概述1程序设计语言之所以能由专用的机器语言发展到程序设计语言之所以能由专用的机器语言发展到现今通用的多种高级语言,就是因为有了编译技现今通用的多种高级语言,就是因为有了编译技术。术。编译技术是计算机专业人员必须具备的
11、专业编译技术是计算机专业人员必须具备的专业基础知识基础知识,它涉及它涉及程序设计语言、形式语言与自程序设计语言、形式语言与自动机、计算机体系结构、数据结构、算法分析与动机、计算机体系结构、数据结构、算法分析与设计、操作系统以及软件工程设计、操作系统以及软件工程等各个方面。程序等各个方面。程序员大多数使用各种员大多数使用各种高级语言高级语言编写程序,而计算机编写程序,而计算机只能识别用只能识别用二进制数二进制数表示的指令和数所构成的机表示的指令和数所构成的机器语言程序,用高级语言编写的程序不能直接在器语言程序,用高级语言编写的程序不能直接在机器上运行,要想运行它并得到预期的结果,必机器上运行,要
12、想运行它并得到预期的结果,必须将源程序转换成等价的目标程序,这个转换过须将源程序转换成等价的目标程序,这个转换过程就是所谓的程就是所谓的编译编译。121.1 程序设计语言的发展程序设计语言的发展汇编语言汇编语言(Assemble Language)机器语言机器语言(Machine Language)程序设计语言程序设计语言(Programming Language)13 计算表达式计算表达式计算表达式计算表达式3*16+23*16+2的值,实现该计算的机器语言程序、的值,实现该计算的机器语言程序、的值,实现该计算的机器语言程序、的值,实现该计算的机器语言程序、汇编语言程序和程序设计语言(汇编语
13、言程序和程序设计语言(汇编语言程序和程序设计语言(汇编语言程序和程序设计语言(C C语言)程序如下所示。语言)程序如下所示。语言)程序如下所示。语言)程序如下所示。2203220382108210260226026101610110001000f000f000Load R0,3Load R0,3MulMul R0,10 R0,10Load R1,2Load R1,2Add R0,R1Add R0,R1Write R0Write R0HaltHaltvoid main(void)void main(void)coutcout3*16+2;3*16+2;注:注:注:注:1010表示表示表示表示16
14、 16 14机器语言机器语言 机器指令集合称为机器语言。机器指令即二进制数,通常由若机器指令集合称为机器语言。机器指令即二进制数,通常由若机器指令集合称为机器语言。机器指令即二进制数,通常由若机器指令集合称为机器语言。机器指令即二进制数,通常由若干字节构成。干字节构成。干字节构成。干字节构成。优点优点优点优点计算机可直接识别执行计算机可直接识别执行计算机可直接识别执行计算机可直接识别执行可充分利用硬件特性可充分利用硬件特性可充分利用硬件特性可充分利用硬件特性缺点缺点缺点缺点可读性差可读性差可读性差可读性差指令系统随机种而异指令系统随机种而异指令系统随机种而异指令系统随机种而异由于机器指令直接或
15、间接含有绝对地址,增加或减少一条由于机器指令直接或间接含有绝对地址,增加或减少一条由于机器指令直接或间接含有绝对地址,增加或减少一条由于机器指令直接或间接含有绝对地址,增加或减少一条指令,可能会引起多条指令的修改。指令,可能会引起多条指令的修改。指令,可能会引起多条指令的修改。指令,可能会引起多条指令的修改。编程者需协调内存的使用编程者需协调内存的使用编程者需协调内存的使用编程者需协调内存的使用 所以,机器语言形式的程序编制和维护困难,限制了计算机的所以,机器语言形式的程序编制和维护困难,限制了计算机的所以,机器语言形式的程序编制和维护困难,限制了计算机的所以,机器语言形式的程序编制和维护困难
16、,限制了计算机的推广和应用。推广和应用。推广和应用。推广和应用。15汇编语言汇编语言 用记忆符取代二进制位,存储地址和汇编语句的序号可用符号用记忆符取代二进制位,存储地址和汇编语句的序号可用符号用记忆符取代二进制位,存储地址和汇编语句的序号可用符号用记忆符取代二进制位,存储地址和汇编语句的序号可用符号名表示。名表示。名表示。名表示。优点优点优点优点用符号取代二进制数,提高了程序的可理解性。用符号取代二进制数,提高了程序的可理解性。用符号取代二进制数,提高了程序的可理解性。用符号取代二进制数,提高了程序的可理解性。性能较好的汇编语言,可用符号名来表示存储地址和汇编语性能较好的汇编语言,可用符号名
17、来表示存储地址和汇编语性能较好的汇编语言,可用符号名来表示存储地址和汇编语性能较好的汇编语言,可用符号名来表示存储地址和汇编语句序号,这样避免了在汇编语句中绝对地址的出现。句序号,这样避免了在汇编语句中绝对地址的出现。句序号,这样避免了在汇编语句中绝对地址的出现。句序号,这样避免了在汇编语句中绝对地址的出现。可充分利用硬件特性可充分利用硬件特性可充分利用硬件特性可充分利用硬件特性 所以,汇编语言在一定程度上降低了程序编制和维护的难度。所以,汇编语言在一定程度上降低了程序编制和维护的难度。所以,汇编语言在一定程度上降低了程序编制和维护的难度。所以,汇编语言在一定程度上降低了程序编制和维护的难度。
18、缺点缺点缺点缺点汇编语句和机器指令基本上是一对一的汇编语句和机器指令基本上是一对一的汇编语句和机器指令基本上是一对一的汇编语句和机器指令基本上是一对一的,所以汇编语言的编,所以汇编语言的编,所以汇编语言的编,所以汇编语言的编程效率并没有质的提高。程效率并没有质的提高。程效率并没有质的提高。程效率并没有质的提高。和机器语言一样,汇编语言依附于目标计算机。和机器语言一样,汇编语言依附于目标计算机。和机器语言一样,汇编语言依附于目标计算机。和机器语言一样,汇编语言依附于目标计算机。需需需需汇编汇编汇编汇编程序,将程序,将程序,将程序,将汇编语言译成机器语言汇编语言译成机器语言汇编语言译成机器语言汇编
19、语言译成机器语言。16程序设计语言程序设计语言 程序设计语言又称高级语言。程序设计语言接近于英语,相程序设计语言又称高级语言。程序设计语言接近于英语,相程序设计语言又称高级语言。程序设计语言接近于英语,相程序设计语言又称高级语言。程序设计语言接近于英语,相当于工程语言。目前计算机系统一般含有多个程序设计语言的当于工程语言。目前计算机系统一般含有多个程序设计语言的当于工程语言。目前计算机系统一般含有多个程序设计语言的当于工程语言。目前计算机系统一般含有多个程序设计语言的翻译程序(例翻译程序(例翻译程序(例翻译程序(例VCVC、VBVB等),甚至对同一个程序设计语言配备了等),甚至对同一个程序设计
20、语言配备了等),甚至对同一个程序设计语言配备了等),甚至对同一个程序设计语言配备了多个不同性能的翻译程序,供用户选择使用。多个不同性能的翻译程序,供用户选择使用。多个不同性能的翻译程序,供用户选择使用。多个不同性能的翻译程序,供用户选择使用。优点优点优点优点独立于具体计算机,面向过程(函数)或对象。独立于具体计算机,面向过程(函数)或对象。独立于具体计算机,面向过程(函数)或对象。独立于具体计算机,面向过程(函数)或对象。程序设计语言接近于英语,可理解性好。程序设计语言接近于英语,可理解性好。程序设计语言接近于英语,可理解性好。程序设计语言接近于英语,可理解性好。数据类型丰富,各种功能的语句齐
21、备,一条语句至少相当数据类型丰富,各种功能的语句齐备,一条语句至少相当数据类型丰富,各种功能的语句齐备,一条语句至少相当数据类型丰富,各种功能的语句齐备,一条语句至少相当于几十条汇编语句。于几十条汇编语句。于几十条汇编语句。于几十条汇编语句。所以,程序设计语言极大地提高了编程效率,大幅度地降低所以,程序设计语言极大地提高了编程效率,大幅度地降低所以,程序设计语言极大地提高了编程效率,大幅度地降低所以,程序设计语言极大地提高了编程效率,大幅度地降低了编程难度。了编程难度。了编程难度。了编程难度。缺点缺点缺点缺点需需需需翻译程序,将高级语言译成机器语言或汇编语言翻译程序,将高级语言译成机器语言或汇
22、编语言翻译程序,将高级语言译成机器语言或汇编语言翻译程序,将高级语言译成机器语言或汇编语言。对硬件操作困难,高级语言通常提供汇编语言接口。对硬件操作困难,高级语言通常提供汇编语言接口。对硬件操作困难,高级语言通常提供汇编语言接口。对硬件操作困难,高级语言通常提供汇编语言接口。171.2 基本术语解释基本术语解释源语言和源程序源语言和源程序(Source Language and Source Program)用程序设计语言书写的程序,称为源程序,该程序设计语言称用程序设计语言书写的程序,称为源程序,该程序设计语言称用程序设计语言书写的程序,称为源程序,该程序设计语言称用程序设计语言书写的程序,
23、称为源程序,该程序设计语言称为源语言。源程序通常用编缉程序输入,用字符为源语言。源程序通常用编缉程序输入,用字符为源语言。源程序通常用编缉程序输入,用字符为源语言。源程序通常用编缉程序输入,用字符(ASCII(ASCII码码码码)表示,表示,表示,表示,以文本文件形式存储。以文本文件形式存储。以文本文件形式存储。以文本文件形式存储。文本文件文本文件(Text File)文本文件的内容由文本文件的内容由文本文件的内容由文本文件的内容由9494个图形字符个图形字符个图形字符个图形字符!-(33-126)!-(33-126)和和和和4 4个个个个控制字符换行控制字符换行控制字符换行控制字符换行(10
24、)(10)、回车、回车、回车、回车(13)(13)、空格、空格、空格、空格(32)(32)、TAB(9)TAB(9)构成,文本文构成,文本文构成,文本文构成,文本文件又称为件又称为件又称为件又称为ASCIIASCII码文件,扩展名通常为码文件,扩展名通常为码文件,扩展名通常为码文件,扩展名通常为TXTTXT,文件尾用控制字符文件尾用控制字符文件尾用控制字符文件尾用控制字符EOF(26)EOF(26)指示。当换行和回车二个控制字符从文本文件读入内存,指示。当换行和回车二个控制字符从文本文件读入内存,指示。当换行和回车二个控制字符从文本文件读入内存,指示。当换行和回车二个控制字符从文本文件读入内存
25、,在在在在C C语言中是用一个字符(换行)表示。语言中是用一个字符(换行)表示。语言中是用一个字符(换行)表示。语言中是用一个字符(换行)表示。18目标语言和目标程序目标语言和目标程序(Target Language and Target Program)目标语言可以是机器语言目标语言可以是机器语言目标语言可以是机器语言目标语言可以是机器语言(二进制数二进制数二进制数二进制数),也可以是汇编语言,也可以是汇编语言,也可以是汇编语言,也可以是汇编语言(字字字字符符符符),或者是其它中间语言,或者是其它中间语言,或者是其它中间语言,或者是其它中间语言(字符字符字符字符),但最终结果必定是机器语言。
26、,但最终结果必定是机器语言。,但最终结果必定是机器语言。,但最终结果必定是机器语言。机器语言程序用二进制文件存储,汇编语言或中间语言程序用文机器语言程序用二进制文件存储,汇编语言或中间语言程序用文机器语言程序用二进制文件存储,汇编语言或中间语言程序用文机器语言程序用二进制文件存储,汇编语言或中间语言程序用文本文件存储。本文件存储。本文件存储。本文件存储。目标程序是经目标程序是经目标程序是经目标程序是经翻译程序翻译程序翻译程序翻译程序加工后用目标语言表示的程序。加工后用目标语言表示的程序。加工后用目标语言表示的程序。加工后用目标语言表示的程序。二进制文件二进制文件(Binary File)二进制
27、文件由机器指令即二进制数构成,因二进制数可能是二进制文件由机器指令即二进制数构成,因二进制数可能是二进制文件由机器指令即二进制数构成,因二进制数可能是二进制文件由机器指令即二进制数构成,因二进制数可能是2626,故文件尾用文件长度,故文件尾用文件长度,故文件尾用文件长度,故文件尾用文件长度(文件的字节数文件的字节数文件的字节数文件的字节数)指示,扩展名通常为指示,扩展名通常为指示,扩展名通常为指示,扩展名通常为EXEEXE。19翻译程序翻译程序(Translator)将源程序译成逻辑上等价的目标程序的程序。翻译程序有二种将源程序译成逻辑上等价的目标程序的程序。翻译程序有二种将源程序译成逻辑上等
28、价的目标程序的程序。翻译程序有二种将源程序译成逻辑上等价的目标程序的程序。翻译程序有二种工作方式:工作方式:工作方式:工作方式:编译和解释编译和解释编译和解释编译和解释。解释程序解释程序解释程序解释程序 InterpreterInterpreter 源源源源程程程程序序序序结结结结果果果果输入数据输入数据输入数据输入数据解释、执行解释、执行解释、执行解释、执行 解释方式主要特点是:用户程序是消极的。用户程序运行时,解释方式主要特点是:用户程序是消极的。用户程序运行时,解释方式主要特点是:用户程序是消极的。用户程序运行时,解释方式主要特点是:用户程序是消极的。用户程序运行时,控制点在解释程序,即
29、用户程序的执行离不开解释程序。控制点在解释程序,即用户程序的执行离不开解释程序。控制点在解释程序,即用户程序的执行离不开解释程序。控制点在解释程序,即用户程序的执行离不开解释程序。解释方式解释方式解释方式解释方式(Interpret)(Interpret)以源程序作为输入,输入一句解释执行一句,不产生完整的目以源程序作为输入,输入一句解释执行一句,不产生完整的目以源程序作为输入,输入一句解释执行一句,不产生完整的目以源程序作为输入,输入一句解释执行一句,不产生完整的目标程序,相应的翻译程序称为解释程序标程序,相应的翻译程序称为解释程序标程序,相应的翻译程序称为解释程序标程序,相应的翻译程序称为
30、解释程序(Interpreter)(Interpreter)。工作方式如下图所示:工作方式如下图所示:工作方式如下图所示:工作方式如下图所示:20编译方式编译方式编译方式编译方式(Compile)(Compile)将源程序全部译为目标程序,该目标程序可在操作系统环境下将源程序全部译为目标程序,该目标程序可在操作系统环境下将源程序全部译为目标程序,该目标程序可在操作系统环境下将源程序全部译为目标程序,该目标程序可在操作系统环境下直接执行,相应的翻译程序称为编译程序直接执行,相应的翻译程序称为编译程序直接执行,相应的翻译程序称为编译程序直接执行,相应的翻译程序称为编译程序(Compiler)(Co
31、mpiler),工作方式工作方式工作方式工作方式如下图所示:如下图所示:如下图所示:如下图所示:编译程序编译程序编译程序编译程序CompileCompile连接程序连接程序连接程序连接程序LinkLink装入运行装入运行装入运行装入运行RunRun编辑程序编辑程序编辑程序编辑程序EditEditASCIIASCII码码码码二进制二进制二进制二进制(整体未定位整体未定位整体未定位整体未定位)二进制二进制二进制二进制(整体定位整体定位整体定位整体定位)源程序源程序源程序源程序结果结果结果结果输入数据输入数据输入数据输入数据21编辑程序的工作结果是编辑程序的工作结果是编辑程序的工作结果是编辑程序的工
32、作结果是ASCIIASCII码形式的源程序。码形式的源程序。码形式的源程序。码形式的源程序。编译程序以编译程序以编译程序以编译程序以ASCIIASCII码形式的源程序为输入,它的工作结果是二进码形式的源程序为输入,它的工作结果是二进码形式的源程序为输入,它的工作结果是二进码形式的源程序为输入,它的工作结果是二进制形式的目标程序,但并未包括用户程序中所使用的系统函数的制形式的目标程序,但并未包括用户程序中所使用的系统函数的制形式的目标程序,但并未包括用户程序中所使用的系统函数的制形式的目标程序,但并未包括用户程序中所使用的系统函数的目标代码。从整体上来看,程序是不完整的,程序中的部分地址目标代码
33、。从整体上来看,程序是不完整的,程序中的部分地址目标代码。从整体上来看,程序是不完整的,程序中的部分地址目标代码。从整体上来看,程序是不完整的,程序中的部分地址尚未确定(例系统函数的调用)。尚未确定(例系统函数的调用)。尚未确定(例系统函数的调用)。尚未确定(例系统函数的调用)。将二进制形式的用户程序和系统函数目标代码连接成一个程序,将二进制形式的用户程序和系统函数目标代码连接成一个程序,将二进制形式的用户程序和系统函数目标代码连接成一个程序,将二进制形式的用户程序和系统函数目标代码连接成一个程序,对未确定的地址进行定位。对未确定的地址进行定位。对未确定的地址进行定位。对未确定的地址进行定位。
34、由操作系统将用户程序装入内存后运行。程序在运行过程中读由操作系统将用户程序装入内存后运行。程序在运行过程中读由操作系统将用户程序装入内存后运行。程序在运行过程中读由操作系统将用户程序装入内存后运行。程序在运行过程中读入数据,经处理加工后输出计算结果。入数据,经处理加工后输出计算结果。入数据,经处理加工后输出计算结果。入数据,经处理加工后输出计算结果。编译方式主要特点是:用户程序是积极的。用户程序执行时,编译方式主要特点是:用户程序是积极的。用户程序执行时,编译方式主要特点是:用户程序是积极的。用户程序执行时,编译方式主要特点是:用户程序是积极的。用户程序执行时,控制点在用户程序自身。除操作系统
35、外,程序运行无需其它支撑控制点在用户程序自身。除操作系统外,程序运行无需其它支撑控制点在用户程序自身。除操作系统外,程序运行无需其它支撑控制点在用户程序自身。除操作系统外,程序运行无需其它支撑软件。软件。软件。软件。22二种翻译方式比较二种翻译方式比较二种翻译方式比较二种翻译方式比较 解释方式和编译方式的主要区别是:目标代码的执行方式不同,解释方式和编译方式的主要区别是:目标代码的执行方式不同,解释方式和编译方式的主要区别是:目标代码的执行方式不同,解释方式和编译方式的主要区别是:目标代码的执行方式不同,基本原理和方法没有本质上的区别。基本原理和方法没有本质上的区别。基本原理和方法没有本质上的
36、区别。基本原理和方法没有本质上的区别。1 1)解释方式的优点)解释方式的优点)解释方式的优点)解释方式的优点提供一种直接的交互调试功能,容易获得较好的动态调试效提供一种直接的交互调试功能,容易获得较好的动态调试效提供一种直接的交互调试功能,容易获得较好的动态调试效提供一种直接的交互调试功能,容易获得较好的动态调试效果。果。果。果。使用变量可不预先定义。使用变量可不预先定义。使用变量可不预先定义。使用变量可不预先定义。变量性质可动态修改。变量性质可动态修改。变量性质可动态修改。变量性质可动态修改。2 2)解释方式的缺点)解释方式的缺点)解释方式的缺点)解释方式的缺点在执行时需动态地对程序进行分析
37、翻译,开销大,其执行速在执行时需动态地对程序进行分析翻译,开销大,其执行速在执行时需动态地对程序进行分析翻译,开销大,其执行速在执行时需动态地对程序进行分析翻译,开销大,其执行速度相当于编译方式的度相当于编译方式的度相当于编译方式的度相当于编译方式的1/101/10至至至至1/1001/100。解释方式占用内存大解释方式占用内存大解释方式占用内存大解释方式占用内存大 显然解释程序的优点就是编译程序的缺点,反之亦然,对于编显然解释程序的优点就是编译程序的缺点,反之亦然,对于编显然解释程序的优点就是编译程序的缺点,反之亦然,对于编显然解释程序的优点就是编译程序的缺点,反之亦然,对于编译程序的优缺点
38、不再重复叙述。译程序的优缺点不再重复叙述。译程序的优缺点不再重复叙述。译程序的优缺点不再重复叙述。对任何一种高级语言,既可采用编译方式,也可采用解释方式,对任何一种高级语言,既可采用编译方式,也可采用解释方式,对任何一种高级语言,既可采用编译方式,也可采用解释方式,对任何一种高级语言,既可采用编译方式,也可采用解释方式,包括汇编语言在内(包括汇编语言在内(包括汇编语言在内(包括汇编语言在内(MASMMASM方式和方式和方式和方式和DEBUGDEBUG方式)。方式)。方式)。方式)。23分类软件:计算机系统中的程序及其文档。软件:计算机系统中的程序及其文档。系统软件:居于计算机系统中最靠近硬件的
39、一层,系统软件:居于计算机系统中最靠近硬件的一层,其他软件一般都通过系统软件发挥作用。他和具其他软件一般都通过系统软件发挥作用。他和具体的应用领域无关,如编译系统和操作系统等。体的应用领域无关,如编译系统和操作系统等。语言处理系统:把软件语言书写的各种程序处理语言处理系统:把软件语言书写的各种程序处理成可在计算机上执行的程序。成可在计算机上执行的程序。软件语言:用于书写软件的语言。它主要包括需软件语言:用于书写软件的语言。它主要包括需求定义语言,功能性语言,设计性语言,程序设求定义语言,功能性语言,设计性语言,程序设计语言以及文档语言。计语言以及文档语言。24术语编译程序编译程序(compil
40、er)编译程序的源语言编译程序的源语言(源程序源程序)(source language)(source program)编译程序的目标语言编译程序的目标语言(目标程序目标程序)(object or target language)(object or target program)编译程序的实现语言编译程序的实现语言(implementation language)语言处理程序语言处理程序(language processor)语言转(变)换语言转(变)换(language transformation)251.3 编译程序的组成编译程序的组成 按照编译程序的执行过程和所完成的任务,编译分成前
41、后两个阶按照编译程序的执行过程和所完成的任务,编译分成前后两个阶段:段:分析阶段和综合阶段分析阶段和综合阶段。分析阶段分析阶段根据根据源语言的定义源语言的定义,分析源程序的,分析源程序的结构结构,检查源程序是,检查源程序是否符合语言的规定,确定源程序所表示的对象和规定的操作,并否符合语言的规定,确定源程序所表示的对象和规定的操作,并以某种中间代码形式表示出来。以某种中间代码形式表示出来。综合阶段综合阶段根据分析根据分析结果结果构造所要求的构造所要求的目标代码程序目标代码程序。符号表符号表用来记录分析过程中识别出的标识符及有关信息。如果在用来记录分析过程中识别出的标识符及有关信息。如果在编译过程
42、中发现源程序有错误,不仅要报告错误、还要进行错误编译过程中发现源程序有错误,不仅要报告错误、还要进行错误处理,使编译能继续进行。处理,使编译能继续进行。词法词法分析分析 语法语法分析分析 语义语义分析分析 代码代码优化优化目标代码目标代码生成生成分析阶段分析阶段综合阶段综合阶段 错误处理错误处理符号表符号表261.3.1词法分析程序词法分析程序 词法分析又称词法分析又称扫描器扫描器。词法分析依次读入源程。词法分析依次读入源程序中的每个字符,依据语言的构词规则,序中的每个字符,依据语言的构词规则,识别识别出一个个具有独立意义的最小语法单位,即出一个个具有独立意义的最小语法单位,即“单词单词”,并
43、用某个单词符号来表示每个单词的,并用某个单词符号来表示每个单词的词性是词性是标识符标识符、还是、还是分界符分界符、还是、还是数数等等。表等等。表示单词词性的单词符号可采用整数码或有意义示单词词性的单词符号可采用整数码或有意义的记号来表示。例如,表达式的记号来表示。例如,表达式a=10+c*20经词经词法分析其结果如图法分析其结果如图1.4所示。所示。词法分析就好比在自然语句中挑出句子中的各词法分析就好比在自然语句中挑出句子中的各种词汇并给出词性。如猴子吃香蕉,分析结果种词汇并给出词性。如猴子吃香蕉,分析结果为:猴子(名词)、吃(动词)、香蕉(名词)为:猴子(名词)、吃(动词)、香蕉(名词)。而
44、在编译程序的词法分析中,同样是识别各种而在编译程序的词法分析中,同样是识别各种单词,只是单词的词性用某中记号或整数类码单词,只是单词的词性用某中记号或整数类码来表示。来表示。符号符号 记号记号 单词单词100IDa21=200NUM 1022+100IDc25*200NUM 20图图1.4词法分析结果词法分析结果 271.3.2.语法分析程序语法分析程序 语法分析:语法分析:将词法分析的结将词法分析的结果,根据语言规则,将一个果,根据语言规则,将一个个单词符号个单词符号组成语言的各种组成语言的各种语法类语法类。如发现有不合语法。如发现有不合语法规则的,要把这些出错点及规则的,要把这些出错点及错
45、误性质报告程序员。错误性质报告程序员。语法分析与语文中分析句子语法分析与语文中分析句子成分类似,根据句子由主语、成分类似,根据句子由主语、谓语组成,谓语由动词、宾谓语组成,谓语由动词、宾语组成等语言规则,分析过语组成等语言规则,分析过程常用语法树来表示句子。程常用语法树来表示句子。如如“猴子吃香蕉猴子吃香蕉”的语法分的语法分析树如图析树如图1.5。句子句子 谓语谓语 主语主语 宾语宾语 动词动词(吃吃)名词名词(猴子猴子)名词名词(香蕉香蕉)图图1.5句句子子“猴猴子子吃吃香香蕉蕉”的的语语法分析树法分析树281.3.2.语法分析程序语法分析程序语语法法分分析析中中,按按同同样样的的方方式式依
46、依据据程程序序设设计计语语言言的的语语法法规规则则进进行行语语法法归归类类。如如表表达达式式a=10+c*20,经经词词法法分分析析可可得得出出a为为标标识识符符、10为为整整数数等等等等,其其语语法法树树如如图图1.6所所示示。如如果果在在分分析析过过程程中中,无无法法将将某某个个单单词词符符号号进进行行语语法法归归类类,则表示该表达式有语法错误。则表示该表达式有语法错误。表达式表达式 =ID(a)项项 +表达式表达式项项图图1.6表达式表达式a=10+c*20的语法树的语法树表达式表达式 NUM(20)ID(c)NUM(10)因子因子 *因子因子 因子因子项项291.3.3语义分析及中间代
47、码生成程序语义分析及中间代码生成程序 语义分析:语义分析:确定源程序的语义是否正确。确定源程序的语义是否正确。“小明打篮球小明打篮球”语义正确语义正确“篮球打小明篮球打小明”语义错误语义错误在程序设计中,语义错误有很多,编译程序不能都在程序设计中,语义错误有很多,编译程序不能都识别出来。识别出来。语义分析主要能识别的语义错误有变量没声明就使语义分析主要能识别的语义错误有变量没声明就使用、变量重复声明、运算对象类型是否匹配等等。用、变量重复声明、运算对象类型是否匹配等等。例如分析表达式例如分析表达式A+B时,当分析到时,当分析到+操作时,语义分析程序操作时,语义分析程序就要分析就要分析A、B是否
48、已经声明、是否具有兼容的类型、是否是否已经声明、是否具有兼容的类型、是否已经有值。为了识别出这些语义错误,语义分析要使用编译已经有值。为了识别出这些语义错误,语义分析要使用编译程序中建立的许多表。语义分析程序通常将源程序生成一种程序中建立的许多表。语义分析程序通常将源程序生成一种中间表示形式,即中间代码。中间代码具有易于产生、易于中间表示形式,即中间代码。中间代码具有易于产生、易于翻译成目标程序的特点,可看成是一种抽象机的指令代码翻译成目标程序的特点,可看成是一种抽象机的指令代码 30例如表达式例如表达式 (a+b)*(c+d)翻译成四元的中间翻译成四元的中间代码如下:代码如下:(+,a,b,
49、t1)(+,c,d,t2)(*,t1,t2,t3)1.3.3语义分析及中间代码生成程序语义分析及中间代码生成程序 LOAD a 将将a的内容加载到操作数栈的内容加载到操作数栈LOAD b 将将a的内容加载到操作数栈的内容加载到操作数栈ADD 将操作数栈顶的两个单元的内容相加将操作数栈顶的两个单元的内容相加STO t1 将操作数栈顶的内容存入单元将操作数栈顶的内容存入单元t1LOAD c 将将c的内容加载到操作数栈的内容加载到操作数栈LOAD d 将将d的内容加载到操作数栈的内容加载到操作数栈ADD 将操作数栈顶的两个单元的内容相加将操作数栈顶的两个单元的内容相加STO t2 将操作数栈顶的内容
50、存入单元将操作数栈顶的内容存入单元t2LOAD t1 将将t1的内容加载到操作数栈的内容加载到操作数栈LOAD t2 将将t2的内容加载到操作数栈的内容加载到操作数栈MULT 将操作数栈顶的两个单元的内容相乘将操作数栈顶的两个单元的内容相乘STO t3 将累加器的内容存入单元将累加器的内容存入单元t3 翻译成某个抽象机的翻译成某个抽象机的汇编指令代码:汇编指令代码:311.3.4.代码优化代码优化 代码进行优化的目的:提高目标程序的执行效率。代码优化首先代码进行优化的目的:提高目标程序的执行效率。代码优化首先在中间代码上进行。在局部范围可能做的优化有常数表达式的计在中间代码上进行。在局部范围可