460 likes | 715 Views
编 译 原 理. 郑 剑 Zhengji25@163.com. 课程简介. 先行课程 :高等数学、C (PASCAL) 、离散数学、 汇编语言、数据结构. 编译原理课程应用领域 编译器的设计 一般的软件设计. 例如: 文本编辑器、信息检索系统、模式识别器 排版、绘图系统 程序验证器. 考试成绩. 平时成绩 + 上机成绩 + 考卷成绩. 第一章 引 论 1.1 什么叫编译程序 1. 编译程序的定义. 将高级程序设计语言 ( 源语言 ) 翻译成逻辑上等价的低级语言(目标语言诸如汇编语言 , 机器语言 ) 的翻译程序.
E N D
编 译 原 理 郑 剑 Zhengji25@163.com
课程简介 先行课程:高等数学、C (PASCAL)、离散数学、 汇编语言、数据结构 编译原理课程应用领域 • 编译器的设计 • 一般的软件设计 例如: • 文本编辑器、信息检索系统、模式识别器 • 排版、绘图系统 • 程序验证器
考试成绩 平时成绩 + 上机成绩 + 考卷成绩
第一章 引 论1.1 什么叫编译程序1.编译程序的定义 • 将高级程序设计语言(源语言)翻译成逻辑上等价的低级语言(目标语言诸如汇编语言,机器语言)的翻译程序 编译程序 源程序 目标程序 (*.C / *.PAS) (*.OBJ / *.EXE)
编译程序源语言是高级语言,目标语言是机器语言/汇编语言,则翻译程序称为编译程序。编译程序源语言是高级语言,目标语言是机器语言/汇编语言,则翻译程序称为编译程序。 • 汇编程序源语言是汇编语言,目标语言是机器语言,则翻译程序称为汇编程序。 • 解释程序解释程序是另一类翻译程序,它同时处理源程序和数据,对源程序解释执行而不生成目标程序。
源程序 2.程序的执行过程 编译程序 • 步骤: 1。用一个编译程序把高级语言翻译成机器语言程序; 2。运行所得的机器语言程序求得计算结果。 机器语言 汇编语言 目标程序 运行系统 输入数据 计算结果
3.程序的翻译 程序的翻译通常有两种方式: 编译方式和解释方式. • 解释方式是边解释边执行,完成解释工作的程序称为解释程序. • 编译方式是先将源程序翻译成目标程序,然后再执行目标程序,执行翻译工作的程序称为编译程序.编译过程可由一遍或多遍完成. • 在解释方式下,最终并不生成目标代码,这是编译方式和解释方式的根本区别.
解释程序和编译程序的区别 解释程序和编译程序的根本区别: 是否生成目标代码
4.编译程序的分类 • 根据不同的用途和侧重,编译程序还可进一步分类: • 专门用于帮助程序开发和调试的编译程序称为诊断编译程序(Diagnostic Compiler) • 着重于提高目标代码效率的编译程序叫优化编译程序(Optimizing Compiler). • 现在很多编译程序同时提供了调试,优化等多种功能.
4.编译程序的分类 • 运行编译程序的计算机称宿主机,运行编译程序所产生目标代码的计算机称目标机. • 如果一个编译程序产生不同于其宿主机的机器代码,则称为交叉编译程序(Cross Compiler). • 如果不需要重写编译程序中与机器无关的部分就能改变目标机,则称该编译程序为可变目标编译程序(Retargetable Compiler) • 本书主要介绍设计和构造编译程序的基本原理和方法
1.2编译过程概述1.自然语言的翻译过程 • 步骤: • I wish you success • 主语 谓语 间接宾语 直接宾语 1)识别单词(拼写正确); 2)语法检查:分析句子的语法结构; 3)语义理解:根据句子的含义进行初步翻译; 4)修饰:对译文进行修饰; 5)组织译文:写出最后的译文。
2.编译程序的工作过程 • 编译程序的工作过程一般划分为五个阶段: • 词法分析 • 语法分析 • 语义分析与中间代码产生 • 优化 • 目标代码生成
例:For I:=1 to 100 do 1. 词法分析 结果 基本字: for 标识符: I 赋值号: := 整常数: 1 基本字: to 整常数: 100 基本字: do • 词法分析的任务: • 输入源程序,对构成源程序的字符串进行扫描和分解,识别出一个个的单词(亦称单词符号或简称符号),如基本字(begin,end,if, for,while等),标识符,常数,算符和界符(标点符号,左右括号等). • 单词符号是语言的基本组成部分,是人们理解和编写程序的基本要素。识别和理解这些要素无疑也是翻译的基础。 • 在词法分析阶段的工作中所依循的是语言的词法规则。描述词法规则的有效工具是正规式和有限自动机。
语法分析的任务: 在词法分析的基础上,根据语言的语法规则,把单词符号串分解成各类语法单位(语法范畴),如“短语”,“子句”,“句子”(“语句”),“程序段”和“程序”等。通过语法分析,确定整个输入串是否构成语法上正确的“程序”。 语法分析所依循的是语言的语法规则。 语法规则通常用上下文无关文法描述。 词法分析是一种线性分析,而语法分析是一种层次结构分析。 2. 语法分析 例:Z:= X + 0.618 * Y 结果: 识别出X + 0.618 * Y为算术表达式,而整个符号串属于赋值语句。
3. 语义分析与中间代码生成 • 任务: • 对语法分析所识别出的各类语法范畴,分析其含义,并进行初步翻译(产生中间代码) • 这一阶段通常包括两方面的工作: • 首先,对每种语法范畴进行静态语义检查,如:变量是否定义,类型是否正确等。 • 如语义正确,进行中间代码的翻译。 • 这一阶段依循语言的语义规则 • 通常使用属性文法描述语义规则。
4.中间代码 • 所谓“中间代码”是一种含义明确,便于处理的信号系统,它通常独立于具体的硬件。许多编译程序采用四元式作为中间代码。这种记号系统或者与现代计算机的指令形式有某种程度的接近,或者能够比较容易地把它变换成现代计算机的机器指令。例如:许多编译程序采用了一种与“三地址指令”非常近似的“四元式”作为中间代码。这种四元式的形式是: 它的意义是:对“左、右操作数”进行某种运算,把运算所得的值作为“结果”保留下来。在采用四元式作为中间代码的情形下,中间代码产生的任务就是按语言的语义规则把各类语法范畴翻译成四元式序列。
例 赋值句:Z:=(X+0.418)*Y/W 可被翻译成如下的四元式: 中间代码 • 一般而言,中间代码是一种独立于具体硬件的记号系统。常用的中间代码除了四元式外,还有三元式,间接三元式,逆波兰记号和树型表示等等。
4.优化 • 优化的任务: • 对前阶段产生的中间代码进行加工变换,以期在最后阶段能产生出更为高效(省时间和空间)的目标代码。 • 优化的主要方面: • 公共子表达式的提取,循环优化,删除无用代码等。 例如:有程序片断,其中间代码见下页 for k:=1 to 100 do begin M:=I + 10*K; N:=J + 10*K end
乘法 (共200次) 加法 (共300次) 等价代码 加法 (共300次)
5.目标代码生成 • 任务: • 将中间代码(或经优化处理之后)变换成特定机器上的低级语言代码(汇编指令代码或机器指令代码). • 这阶段实现了最后的翻译,它的工作依赖于硬件系统结构和机器指令含义。 MOV R0, #12, ADD R0, #4 MUL R0, R2 汇编指令代码 (需汇编后执行) 10000001 0001 1100 10000010 0001 0100 11000100 0001 0010 机器指令代码 (可立即执行)
1.3编译程序的结构1.编译程序总框 语法单位 中间代码 目标代码 源程序 单词符号 中间代码
2.总框说明1 • 词法分析器: • 又称扫描器 • 输入源程序,进行词法分析,输出单词符号。 • 语法分析器: • 又称分析器 • 对单词符号串进行语法分析(根据语法规则进行推导或归约),识别出各类语法单位,最终判断输入串是否构成语法上正确的“程序”。
总框说明2 • 词义分析器与中间代码产生器: • 按照语义规则对语法分析器归约出(或推导出)的语法单位进行语义分析并把它们翻译成一定形式的中间代码. • 优化器: • 对中间代码进行优化处理 • 目标代码生成器: • 把中间代码翻译成目标程序。
总框说明3 • 表格与表格管理 • 编译程序在工作过程中需要保持一系列的表格,以登记源程序的各类信息和编译各阶段的进展情况。 • 合理地设计和使用表格是编译程序构造的一个重要问题。 • 在编译程序使用的表格中,最重要的是符号表。当扫描器识别出一个名字(标识符)后,它把该名字及它的各种属性填入到符号表中。 • 编译各阶段都涉及到构造,查找或更新有关的表格。
总框说明4 • 出错处理 • 在编译过程中对源程序中的错误进行处理的一组专门程序叫做出错处理程序。 • 编译过程的每一阶段都可能检测出错误,绝大多数错误在编译前三段检测出来。 • 源程序中的错误通常分为语法错误和语义错误两大类。
3.编译程序的结构 • 遍(趟,趟程) • 把编译的一个或几个不同阶段的工作组合成遍. • 所谓一遍或一趟是指一个编译程序在编译时把源程序或中间语言程序从头到尾扫描一遍并完成相应工作的全过程. • 每一遍的工作从前一遍获得的工作结果开始(对于第一遍而言,是从源程序开始).
单遍扫描与多遍扫描 根据编译程序在完成翻译任务的过程中需要对源程序或其中间语言程序扫描的遍数,可以把编译程序分为: • 单遍扫描:只扫描一遍 • 多遍扫描:需扫描多遍
关于单遍扫描 • 在单遍扫描的编译程序中,往往以语法分析程序为中心,词法分析程序作为语法分析的一个子程序,当语法分析需要一个新单词时,便调用词法分析程序,当它识别出一个语法成分时,就调用语义分析程序.
多遍扫描 把前端组织成多遍扫描:( 多遍:上一遍的输出是下一遍的输入。)
遍数的划分标准 • 处理过程中,既可以将几个不同阶段合为一遍,也可以把一个阶段的工作分为若干遍。 • 一个编译程序究竟应分成几遍,如何划分,是与源程序、设计要求、硬件设备等诸因素有关的,因此难于统一划定。遍数多一点有个好处,即整个编译程序的逻辑结构可能清晰一点。但遍数多势必增加输入/输出所消耗的时间。因此,在主存可能的前提下,一般还是遍数尽可能少一点为好。 • 分遍原则: ①目标质量高低(高则多遍)。 ②机器内存大小(小则多遍)。 ③源语言简繁(繁则多遍)。 ④设计人员多少(多则多遍)。
4.编译前端与后端 • 概念上,有时把编译程序分为编译前端和编译后端. • 编译前端主要由与源语言有关但与目标机无关的那些部分组成.通常包括词法分析、语法分析、语义分析与中间代码产生,有的代码优化工作也可包括在前端。 • 编译后端包括编译程序中与目标机有关的那些部分。如与目标机有关的代码优化和目标生成等。通常后端不依赖于源语言而仅依赖于目标语言。
前端和后端的关系 • 可以取编译程序的前端,改写其后端以生成不同目标机上的相同语言的编译程序。这样就可以实现编译程序的目标机改变。 • 也可以设想将几种源语言编译成相同的中间语言,然后为不同的前端配上相同的后端,这样就可为同一台机器生成不同语言的编译程序。 • 例如:在Java语言环境中,为了使编译后的程序从一个平台移到另一个平台执行,Java定义一种虚拟机代码——Bytecode。只要实际使用的操作平台上实现了执行Bytecode的Java解释器,这个操作平台就可以执行各种Java程序。这就是所谓Java语言的操作平台无关性。
5.编译程序与程序设计环境 • 程序设计环境:编译程序与一些程序设计工具(如编辑程序、连接程序、测试工具等)一起构成的环境。 • 集成化的程序设计环境的特点:它将相互独立的程序设计工具集成起来,以便为程序员提供完整的、一体化的支持,从而进一步提高程序开发效率,改善程序质量。 • 一个好的集成化程序设计环境中,不仅包含丰富的程序设计工具,而且还支持程序设计方法学,支持程序开发的全生命周期。
T S I 6.编译程序的生成 以前人们构造编译程序大多是用机器语言或汇编语言做工具的,但现在为了充分发挥各种硬件系统的效率,现在越来越多的用高级语言做工具来编译程序,这样可以大大节省程序设计时间,而且所构造出来的编译程序易于阅读、维护和移置。 为便于说明,常用T形图来表示 源语言S、目标语言T和编译程序 实现语言I之间的关系,如右图。 T形图
A代码 A代码 A代码 L2语言 L1语言 L2语言 L1语言 A代码 A代码 用L1语言编写另一种高级L2的编译程序 在这里可以将L1语言看做是C语言,L2语言可以看 做是另一高级语言,例如:VB • 如果A机器上已有 一个用A机器代码 实现的某高级语言 L1的编译程序,则 我们可以用L1语言编写另一种高级L2的编译程序,把写好的L2编译程序经过L1编译程序编译后就可得到A机器代码实现的L2编译程序,如上图所示。
B代码 B代码 A代码 B代码 B代码 L语言 L语言 L语言 L语言 L语言 B代码 L语言 A代码 A代码 L语言 能产生B机器代码的L编译程序源程序 编译程序“移植” • 所谓“移植”方法,就是利用A机器上已有的高级语言L编写一个能够在B机器上运行的高级语言L的编译程序。做法是: • 1)先用L语言编写出在A机器上运行的产生B机器代码的L编译程序源程序(实现该功能的源程序); • 2)然后把该源程序经过A机器上的L编译程序编译后得到能在A机器上运行的产生B机器代码的编译程序(编译程序); • 3)用这个编译程序再一次编译上述编译程序源代码就得到了能在B机器上运行的产生B机器代码的编译程序(通过编译程序对源程序的编译产生目标代码)。用T形图表示如上图。 能在A机器上运行的产生B机器代码的编译程序(运行环境)
编译程序的自展,移植与自动化 • 高级语言具有自编译性。 • 具有自编译性的高级语言可采用自展技术构造自身的编译程序。 • 具有自编译性的高级语言也可用来编写其它语言的编译程序。 • 一个具有自编译性的高级语言在宿主机上的编译程序可以移植到目标机上。
8.编译程序的设计目标 • 目标程序小,执行速度快。 • 编译程序小,执行速度快。 • 诊断能力强,可靠性强。 • 可移植性,可扩充性。
疑点与难点(一) • 关于编译程序的理解 • 编译程序的翻译是一种功能上等价的翻译. • 编译程序生成的目标是机器语言或汇编语言. • 编译程序与具体的机器和语言有关. • 对编译程序而言, 源程序是输入数据,目标程序是输出结果. • 在编译方式下,源程序的执行需要分阶段.如生成的目标程序是机器代码程序,则执行分两个阶段(编译—运行); 如生成的目标程序是汇编程序,则执行分三个阶段(编译—汇编—运行).
疑点与难点(二) • 编译方式与解释方式的比较 • 编译方式相当于笔译. • 解释方式相当于口译. • 二者的区别在于是否生成目标代码.
疑点与难点(三) • 关于编译程序的组成 • 词法分析,语法分析,语义分析和代码生成是必须完成的. • 中间代码生成和代码优化可省略.
疑点与难点(四) • 关于单遍扫描与多遍扫描 • 多遍扫描的优点:节省内存空间,提高目标程序的质量等. • 多遍扫描的缺点:延长编译时间,降低了编译效率.
疑点与难点(五) • 关于编译程序的结构 • 不同的编译程序的结构不一定相同.采用哪种执行方式,将随语种,机型等因素而不同. • 关于优化 • 优化是从目标代码生成的角度而言,不包括对源程序中算法的改进.
习题 1.编译程序是一种常用的____ 软件. A. 应用 B. 系统 2.编译程序必须完成的工作有____ A.词法分析 B.语法分析 C.语义分析 D. 代码生成 E.中间代码生成 F.代码优化 3.汇编程序是将_____ 翻译成____;编译程序是将____ 翻译成_____. A.汇编语言程序 B.机器语言程序 C.高级语言程序