当前位置:文档之家› 第1章 编译系统概述

第1章 编译系统概述

第1章 编译系统概述
1.1 程序设计语言的发展 1.2 基本术语解释 1.3 编译过程概述 1.4 出错处理 1.5 编译程序的前端和后端 1.6 编译程序的实现方式
1.1 程序设计语言的发展
机器语言(Machine Language)
汇编语言(Assemble Language)
程序设计语言(Programming Language)
③二种翻译方式比较 解释方式和编译方式的主要区别是:目标代码的执行方式不 同,基本原理和方法没有本质上的区别。 1)解释方式的优点 提供一种直接的交互调试功能,容易获得较好的动态调试效 果。 使用变量可不预先定义。 变量性质可动态修改。 2)解释方式的缺点 在执行时需动态地对程序进行分析翻译,开销大,其执行速 度相当于编译方式的1/10至1/100。 解释方式占用内存大 显然解释程序的优点就是编译程序的缺点,反之亦然,对于编 译程序的优缺点不再重复叙述。 ④对任何一种高级语言,既可采用编译方式,也可采用解释方 式,包括汇编语言在内(MASM方式和DEBUG方式)。
1.5 编译程序的前端和后端
由于在编译程序的内部引入了中间代码,这样可将编译程序 分为二个相互独立部分。 ㈠编译程序前端(The Front End) 组成:词法分析器、语法分析器和中间代码产生器 特点:依赖于被编译的源语言,输出结果用中间代码描述, 和目标机器无关。 ㈡编译程序后端(The Back End) 组成:目标代码生成器 特点:和源语言无关,以中间代码形式的源程序为输入进行 处理,输出结果依赖于目标机器。 为一个源语言构造好前端,若要在某一个特定计算机上构造该 源语言的编译程序,只要构造这个目标机器的后端即可。相反, 若已构造了一个高质量的后端,若要在同一台目标机器上为另一 源语言构造编译程序时,只要构造该源语言的前端即可。
1.3 编译过程概述
典型的编译程序工作过程是:输入源程序,对它进行加工处 理,最后输出目标程序(机器语言或汇编语言形式)。整个过 程相当复杂,从数据加工的角度来看,可将其分成4个逻辑阶 段,它们是: 词法分析 语法分析 语义分析(中间代码产生) 目标代码生成 图示如下: 源 程 序 词法 分析 语法 分析 语义分析 (中间代码产生) 目标代码 生成 目 标 程 序
㈡汇编语言
用记忆符取代二进制位,存储地址和汇编语句的序号可用符号 名表示。 ①优点 用符号取代二进制数,提高了程序的可理解性。 性能较好的汇编语言,可用符号名来表示存储地址和汇编 语句序号,这样避免了在汇编语句中绝对地址的出现。 可充分利用硬件特性 所以,汇编语言在一定程度上降低了程序编制和维护的难度。 ②缺点 汇编语句和机器指令基本上是一对一的,所以汇编语言的编 程效率并没有质的提高。 和机器语言一样,汇编语言依附于目标计算机。 需汇编程序,将汇编语言译成机器语言。
㈡语法分析(Parsing)
执行语法分析任务的程序称为语法分析器。 任务:检查源程序的语法结构是否正确 依据:语言的语法规则 在语法分析时,算术表达式3+abc*128的语法结构应表示为 x+i*x,语法分析器最终应识别出这是一个算术表达式。识别过程 相当于建立一棵语法树 <算术表达式>
<算术表达式> <项> <因子> x(整常数) + <项> <因子> i(标识符) <项> * <因子> x(整常数)
1.4 出错处理(Error Handle)
编译程序在工作过程中可发现源程序中各种错误,错误类型 及错误处理对策简述如下: ㈠错误类型 词法错误(可在词法分析阶段发现) 语法错误(可在语法分析阶段发现) 语义错误(可在语义分析阶段发现) ㈡出错处理 一旦发现错误,暂停编译程序工作,指出错误的地点和类 型。 在发现错误后,不中断编译程序工作。采取某些措施(例 错误局部化、错误校正等),使得源程序的编译工作可继续 下去,尽可能发现源程序中比较多的错误。
编译程序基本上是按照这个流程来设计的。
以算术表达式 3+abc*128 为例,来说明编译程序工作过程。
㈠词法分析(Lexical Analysis)
执行词法分析任务的程序称为词法分析器。 任务:字符串形式单词 编码形式单词内部码(二元式) 依据:语言的构词规则 ①二元式(Pair) (单词种别,单词值) 单词种别:用整数码表示(为直观起见用字符表示),语法 分析时用。 单词值:在本书中用字符串表示,语义分析时用。当一个单 词种别中可能有多个单词时,单词的值才有意义。为了便于输 入处理,无意义的单词值用"NUL"表示。
②二元式编码
单词 + * / ( ) … 标识符 整常数 实常数 … 单词种别 + * / ( ) … i x y … 单词值 NUL NUL NUL NUL NUL NUL … 字符串形式号名 字符串形式整常数 字符串形式实常数 …
经词分析,算术表达式3+abc*128的单词内部码(二元式) 为:('x',"3") ('+',"NUL") ('i',"abc") ('*', "NUL") ('x',"128")
㈢目标语言和目标程序(Target Language and Target Program)
目标语言可以是机器语言(二进制数),也可以是汇编语言(字 符),或者是其它中间语言(字符),但最终结果必定是机器语言。 机器语言程序用二进制文件存储,汇编语言或中间语言程序用文 本文件存储。 目标程序是经翻译程序加工后用目标语言表示的程序。
㈢程序设计语言
程序设计语言又称高级语言。程序设计语言接近于英语,相 当于工程语言。目前计算机系统一般含有多个程序设计语言的 翻译程序(例VC、VB等),甚至对同一个程序设计语言配备 了多个不同性能的翻译程序,供用户选择使用。 ①优点 独立于具体计算机,面向过程(函数)或对象。 程序设计语言接近于英语,可理解性好。 数据类型丰富,各种功能的语句齐备,一条语句至少相当 于几十条汇编语句。 所以,程序设计语言极大地提高了编程效率,大幅度地降低 了编程难度。 ②缺点 需翻译程序,将高级语言译成机器语言或汇编语言。 对硬件操作困难,高级语言通常提供汇编语言接口。
注:10表示16
㈠机器语言
机器指令集合称为机器语言。机器指令即二进制数,通常由若 干字节构成。 ①优点 计算机可直接识别执行 可充分利用硬件特性 ②缺点 可读性差 指令系统随机种而异 由于机器指令直接或间接含有绝对地址,增加或减少一条 指令,可能会引起多条指令的修改。 编程者需协调内存的使用 所以,机器语言形式的程序编制和维护困难,限制了计算机 的推广和应用。
编辑程序 Edit
编译程序 Compile
连接程序 Link
装入运行 Run
ASCII 码
二进制(整体定位)
编辑程序的工作结果是ASCII码形式的源程序。 编译程序以ASCII码形式的源程序为输入,它的工作结果是二 进制形式的目标程序,但并未包括用户程序中所使用的系统函数 的目标代码。从整体上来看,程序是不完整的,程序中的部分地 址尚未确定(例系统函数的调用)。 将二进制形式的用户程序和系统函数目标代码连接成一个程 序,对未确定的地址进行定位。 由操作系统将用户程序装入内存后运行。程序在运行过程中读 入数据,经处理加工后输出计算结果。 编译方式主要特点是:用户程序是积极的。用户程序执行时, 控制点在用户程序自身。除操作系统外,程序运行无需其它支撑 软件。
㈢语义分析(Semantic Analysis)
执行语义分析任务的程序称为语义分析器或中间代码产生器。 任务:建立符号表和常数表,记录源程序中标识符属性和常数 值,根据语言的语义规定生成中间代码。 依据:语言的语义内涵 语义分析(中间代码产生)主要工作为: 语义正确性检查 语义翻译 ①语义正确性检查 例2:begin real A;integer B;B=A+B; end 语法正确,不同的语言有不同的语义解释。 标准Fortran语言认为是错误的,其不允许不同类型的量进行 混合运算。 C语言认为是正确的,允许混合运算,但需转换成相同类型 的量,然后再进行运算。 Pascal语言认为是错误的,虽允许混合运算,但不允许将实 型量赋值于整型量。
②语义翻译 1)说明语句的翻译 将标识符及其属性填入符号表。 2)执行语句的翻译 根据不同语句的语义,生成逻辑上等价的中间代码。 中间代码 结构简单、意义明确的记号系统,非常接近机器指令,又独立 于具体机器。常用的中间代码有三元式和四元式。 表达式3+abc*128可译成如下四元式: (*,&abc,&128,&T1) (+,&3,&T1,&T2) 其中, &abc表示标识符abc在符号表中入口(即地址); T1和T2是在翻译过程中由编译程序引入的临时变量,&T1和 &T2分别表示T1和T2在符号表中入口; 而&128表示常数128在常数表中的地址。
解释、执行 源 程 序 解释程序 Interpreter 输入数据
解释方式主要特点是:用户程序是消极的。用户程序运行时, 控制点在解释程序,即用户程序的执行离不开解释程序。
结 果
②编译方式(Compile) 将源程序全部译为目标程序,该目标程序可在操作系统环境下 直接执行,相应的翻译程序称为编译程序(Compiler) ,工作方式 如下图所示: 源程序 二进制(整体未定位) 输入数据 结果
常数表(Constant Table) 常数表用于记录在源程序中出现的常数。假定,每个整常数在 常数表中占2个字节,每个实常数在常数表中占4个字节。 常数表的结构示意如下: 常数的二进制值 00000000-00000011(3) 00000000-01000000(128)
相关主题