第1章 编译系统概述
第1章 概述-编译原理及实践教程(第3版)-黄贤英-清华大学出版社

《编译原理实践及应用》
1.1 程序设计语言及翻译程序
为什么要使用编译程序?
• 机器语言 (machine language)
C7 06 0000 0002
• 汇编语言 (assembler language)
MOV X , 2
为该语言编译程序能够识别的形式加入到标准源程序中。 在VC++6.0中,通过预处理后,将.c的源程序变为了.i的文 本文件。
《编译原理实践及应用》
编译
标准的C语言程序由编译程序翻译为对应于某个计算机 上的汇编语言程序。汇编语言是和机器语言一一对应的易于 阅读的文本形式的语言。编译的结果是某种机器上汇编语言 书写的程序。如在VC++6.0中,编译这一步将.i的文本文件 生成了.cod的文本文件,这就是汇编代码。有的编译器生成 .s或.asm后缀的文件。
• 解释程序:将高级程序设计语言写的源程序作为输入,
边解释边执行源程序本身,而不产生目标程序的翻译程序。
• 其他概念:
– 诊断编译程序 – 优化编译程序 – 交叉编译程序 – 可变目标编译程序
宿主机 目标机
《编译原理实践及应用》
对编译程序的一些说明
• 编译程序实质上是一个翻译程序,要注意等价变 换
• 高级语言 (high-level language)
X=2
《编译原理实践及应用》
语言层次和翻译程序大家族
翻译程序:能够将某种语言写的程序转换成另一
种语言的程序,而且后者与前者在逻辑上是等价的。
转换
高级语言层 高级语言1
程序
高级语言2
高级语言3 高级语言4
(完整版)高级语言与编译程序概述自测题

第一章高级语言与编译程序概述一、单项选择题1.将编译程序分成若干个“遍”是为了____。
A. 提高程序的执行效率B. 使程序的结构更加清晰C. 利用有限的机器内存并提高机器的执行效率D. 利用有限的机器内存但降低了机器的执行效率2.构造编译程序应掌握____。
A. 源程序B. 目标语言C. 编译方法D. 以上三项都是3.编译程序绝大多数时间花在____上。
A. 出错处理B. 词法分析C. 目标代码生成D. 管理表格4. ____不可能是目标代码。
A. 汇编指令代码B. 可重定位指令代码C. 绝对指令代码D. 中间代码5.使用____可以定义一个程序的意义。
A. 语义规则B. 词法规则C. 产生规则D. 左结合规则6.词法分析器的输入是____。
A. 单词符号B. 源程序C. 语法单位D. 目标程序7.中间代码生成时所遵循的是____。
A. 语法规则B. 词法规则C. 语义规则D. 等价变换规则8.编译程序是对____。
A. 汇编程序的翻译B. 高级语言程序的解释执行C. 机器语言的执行D. 高级语言的翻译9.词法分析应遵循____。
A. 语义规则B. 语法规则C. 构词规则D. 等价变换规则10.若源程序是高级语言编写的程序,目标程序是____,则称它为编译程序。
A. 汇编语言程序或高级语言程序B. 高级语言程序或机器语言程序C. 汇编语言程序或机器语言程序D. 连接程序或运行程序11.编译过程中,词法分析阶段的任务是____。
A.识别表达式B. 识别语言单词C. 识别语句D. 识别程序二、多项选择题:1.编译程序各阶段的工作都涉及到____。
A. 语法分析B. 表格管理C. 出错处理D. 语义分析E. 词法分析2.如果编译程序生成的目标程序是机器代码程序,则源程序的执行分为两大阶段:____和____。
A. 编译阶段B. 汇编阶段C. 运行阶段D. 置初值阶段3.编译程序工作时, 通常有____阶段。
编译技术复习题答案

第一章:编译系统概述一.单项选择题1.编译程序前三个阶段完成的工作是〔C〕。
A.词法分析, 语法分析和代码优化B.代码生成, 代码优化和词法分析C.词法分析, 语法分析, 语义分析和中间代码生成D.词法分析, 语法分析和代码优化2.编译程序绝大多数时间花在〔D〕上。
A.出错处理 B.词法分析 C.目标代码生成D.表格管理3.编译程序是对〔C〕。
A.汇编程序的翻译 B.高级语言程序的说明执行C.高级语言的翻译 D.机器语言的执行4.在运用高级语言编程时,首先可通过编译程序发觉源程序的全部〔A〕错误。
A.语法 B.语义 C.语用 D.运行二.填空题1.编译程序首先要识别出源程序中每个(单词),然后再分析每个(句子)并翻译其意义。
2.通常把编译过程分为分析前端及后端两大阶段。
词法, 语法和语义分析是对源程序的(分析),中间代码生成, 代码优化及目标代码的生成那么是对源程序的(综合)。
3.对编译程序而言,输入数据是(源程序),输出结果是(目标程序)。
4.对以下错误信息,请指出可能是编译的哪个阶段〔词法分析, 语法分析, 语义分析,代码生成〕报告的。
〔1〕 else 没有匹配的if 〔语法分析〕〔2〕数组下标越界〔语义分析〕〔3〕运用的函数没有定义〔语法分析〕〔4〕在数中出现非数字字符〔词法分析〕5.假如编译程序生成的目标程序是机器代码程序,那么源程序的执行分为两大阶段:〔编译阶段〕和〔运行阶段〕。
假如编译程序生成的目标程序是汇编语言程序,那么源程序的执行方式分成三个阶段:〔编译阶段〕〔汇编阶段〕和〔运行阶段〕。
6.编译程序在其工作过程运用最多的数据构造是〔表〕,它记录着源程序中各种信息,以便查询或修改,在这些〔表〕中,尤以〔符号表〕最重要,它的生存期最长,运用也最频繁。
三.简述题:1.编译程序的工作分为那几个阶段答:词法分析, 语法分析和语义分析是对源程序进展的分析(称为编译程序的前端),而中间代码生成, 代码优化和代码生成三个阶段合称为对源程序进展综合(称为编译程序的后端),它们从源程序的中间表示建立起和源程序等价的目标程序。
编译原理

代码优化器
temp1 = id3 * 60.0 id1 = id2 + temp1
衡量目标程序质量 高低主要标准: 1. 空间指标; 2. 时间指标。
第一章 编译器概述
27
代码生成(target code generator)
符号表 temp1 = id3 * 60.0 id1 = id2 + temp1 1 2 代码生成器 3 position initial rate ... ... ...
第一章 编译器概述
10
由于计算机硬件只懂得自己的指令系 统,因此对于高级程序设计语言编写的程 序无法直接识别。 为解决这个问题,我们需要对所编写 的程序进行改进,改进的方法有两种:翻
译和解释。
第一章 编译器概述
11
翻译:把一种语言编写的程序(源程序)通
过一个翻译器翻译成为与之等价的另一种语言的 程序(目标程序)。
第一章 编译器概述
表达式
数 (60)
22
语法分析(parsing / syntax analysis, hierarchical analysis) id1 = id2 + id3 * 60 1 语法分析器 2 3 := id1 id2 id3
第一章 编译器概述
符号表 position initial rate ... ... ...
第一章 编译器概述
21
语法分析(parsing / syntax analysis, hierarchical analysis) 任何一个标识符都是表 initial + rate * 60 达式; 表达式 任何一个数都是表达 式; 表达式 + 如 果 e1 和 e2 都 是 表 达 表达式 式,那么 表达式 标识符 e1 + e2 * (initial) e1 * e2 标识符 (e1) (rate) 也都是表达式
编译原理第二版课后习答案

《编译原理》课后习题答案第一章第?1?章引论第?1?题解释下列术语:(1)编译程序(2)源程序(3)目标程序(4)编译程序的前端(5)后端(6)遍答案:(1)?编译程序:如果源语言为高级语言,目标语言为某台计算机上的汇编语言或机器语言,则此翻译程序称为编译程序。
(2)?源程序:源语言编写的程序称为源程序。
(3)?目标程序:目标语言书写的程序称为目标程序。
(4)?编译程序的前端:它由这样一些阶段组成:这些阶段的工作主要依赖于源语言而与目标机无关。
通常前端包括词法分析、语法分析、语义分析和中间代码生成这些阶段,某些优化工作也可在前端做,也包括与前端每个阶段相关的出错处理工作和符号表管理等工作。
(5)?后端:指那些依赖于目标机而一般不依赖源语言,只与中间代码有关的那些阶段,即目标代码生成,以及相关出错处理和符号表操作。
(6)?遍:是对源程序或其等价的中间语言程序从头到尾扫视并完成规定任务的过程。
第?2?题一个典型的编译程序通常由哪些部分组成?各部分的主要功能是什么?并画出编译程序的总体结构图。
答案:一个典型的编译程序通常包含?8?个组成部分,它们是词法分析程序、语法分析程序、语义分析程序、中间代码生成程序、中间代码优化程序、目标代码生成程序、表格管理程序和错误处理程序。
其各部分的主要功能简述如下。
词法分析程序:输人源程序,拼单词、检查单词和分析单词,输出单词的机内表达形式。
语法分析程序:检查源程序中存在的形式语法错误,输出错误处理信息。
语义分析程序:进行语义检查和分析语义信息,并把分析的结果保存到各类语义信息表中。
中间代码生成程序:按照语义规则,将语法分析程序分析出的语法单位转换成一定形式的中间语言代码,如三元式或四元式。
中间代码优化程序:为了产生高质量的目标代码,对中间代码进行等价变换处理。
目标代码生成程序:将优化后的中间代码程序转换成目标代码程序。
表格管理程序:负责建立、填写和查找等一系列表格工作。
编译原理:第一章 引论

常见的表格:符号名表,常数表,标号表,入 口名表,过程引用表。 格式:
名字
信息
合肥工业大学 计算机与信息学院软件所
例: PASCAL程序段:
PROCEDURE INCWAP(M,N:INTEGER); LABEL START; VAR K:INTEGER; BEGIN START: K:=M+1; M:=N+4; N:=K; END.
合肥工业大学 计算机与信息学院软件所
5. 目标代码产生
任务: 把中间代码变换成特定机器上的目标 代码。 依赖于硬件系统结构和机器指令的含义 目标代码三种形式:
绝对指令代码: 可直接运行 可重新定位指令代码: 需要连接装配 汇编指令代码: 需要进行汇编
合肥工业大学 计算机与信息学院软件所
合肥工业大学 计算机与信息学院软件所
4. 优化
任务:对于前阶段产生的中间代码进行加工变 换,以期在最后阶段产生更高效的目标代码。 主要包括:公共子表达式提取、合并已知量、 删除无用语句、循环优化等。 依循的原则:程序的等价变换规则
FOR K:=1 TO 100 DO BEGIN X:=I+1; M := I + 10 * K; N := J + 10 * K; END
合肥工业大学 计算机与信息学院软件所
语法分析举例说明
C语言程序 Void jisuan() { int y,c,d; float x,a,b; x=a+b*50; y=c+)d*(x+b; } 现在我们对x=a+b*50; 进行语 法分析。
赋值语句的语法 规则: A V=E E T|E+T T F|T*F F V|(E)|C V 标识符 C 常数
编译原理第1章 概述

1.3 编译程序的生成
一、基本方法 1. 对源程序文本进行
认真分析(语法语 义理解) 2. 设计编译算法(前后 端、遍、算法等) 3. 选择语言,编制程序 4. 调试编译程序(测试) 5. 整理资料、形成文本
二.移植:将别的语言的编译移植过来 三. 自展:L0→L1+L0 →L2+L1+L0 → … →L 四. 编译程序的自动生成 1. 词法分析程序生成器----LEX 2. 语法分析程序生成器----YACC 3. 自动产生编译程序的工具 编译程序-编译程序 编译程序产生器 翻译程序脚本系统
随着并行技术和并行语言的发展,处理并行语言的并行 编译技术和将串行程序转换成并行程序的自动并行编译技术 正在深入研究之中。
优
码
程序
析
析
代 码
产
化
生 成
生
信息表管理程序
国防科技大学出版社 [3]杜淑敏著,编译程序设计原理、北京航空
航天大学出版社 [4]Aho ,编译原理技术工具(英文),1986 [5]形式语言与自动机理论(研究生教材)
第一章引论
1.1 什么是编译程序
编译程序是一种翻译程序,它将高级 语言所写的程序翻译成等价的机器语言 或汇编语言的目标程序。
源
编
其中的道理。 3、不得缺席:难学,自学花时间多 4、适当做笔记 5、意见反馈 6、作业:一定要独立完成
四、学时安排及评分标准
讲课42学时 12学时上机(词法、语法) 要交实验报告 考试占70% 平时占30%,{ 作业,考勤,实验} 只讲授部分章节
编译程序概述.ppt

→判断单词与图中匹配吗? →匹配→单元翻
译程序→下一个分析→程序结束符‘·’
2019-10-24
谢谢你的观看
21
5、PL/0语法调用关系图(见图2.7)
6、Block过程的流程图(见图2.8)
Block过程是处理说明部分和程序体部分
一起看Block的源代码
五、PL/0目标代码生成
1、PCODE代码
〈条件〉∷=〈表达式〉〈关系运算符〉〈表达式〉
|ODD〈表达式〉
2019-10-24
谢谢你的观看
9
PL/0语言文法的EBNF表示
〈表达式〉∷= [+|-]〈项〉{〈加法运算符〉〈项〉} 〈项〉∷=〈因子〉{〈乘法运算符〉〈因子〉} 〈 因 子 〉 ∷= 〈 标 识 符 〉 | 〈 无 符 号 整 数 〉 |‘ ( ’ 〈表达式〉‘)’ 〈加法运算符〉∷=+|〈乘法运算符〉∷=*|/ 〈关系运算符〉∷ =#|〈|〈=|〉|〉=|=
谢谢你的观看
5
PL/0语言语法图描述
分程序 const ident = number
,
;
var
ident
,
;
2019-10-24
;
procedure
ident
; 分程序
语句
P14 (c,d,e,f,g)
谢谢你的观看
6
PL/0语言文法的EBNF表示
EBNF 引入的符号(元符号): < > 用左右尖括号括起来的语法成分为非终结符 ∷= (→) ‘定义为’ ∷=(→) 的左部由右部定义
〈过程说明部分〉∷=〈过程首部〉〈分程序〉{; 〈过程说明部分〉};
〈过程首部〉∷=PROCEDURE〈标识符〉;
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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)