第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章 绪论

译程序。
高级语言程序 (源程序 )
编译程序 计算机
低级语言程序 (目标程序 )
图1
编译程序的功能
编译器的作用 提高编程效率:与任何机器都无关
提高计算机性能:处理器性能在很大程度上
取决于编译器的质量 要求现代编译器也能够识别源代码中的并行 性
编译过程概述
骨架程序
预处理器
源程序
编译器
目标汇编程序
mulf #60.0,R2 movf id2,R1 addf R2,R1 movf R1,id1
(*, id3,60.0,t1 )
(+, id2,t1,id1 )
符号表管理 记录源程序中使用的标识符
收集每个标识符的各种属性
存储分配、类型和作用域信息
出错处理 发现一个错误便停下来的编译器是没有尽到
与编译程序的不同
1)不生成目标代码
2)能支持交互环境 (同增量式编译系统)
源 程 序
解释程序
初始数据
计算ቤተ መጻሕፍቲ ባይዱ果
编译阶段和运行阶段存储结构
源程序缓冲区
名字表 目标代码区
目标代码缓冲区
数据区 编译用源程序中 间表示各种表格
编译时
运行时
解释系统存储结构
解释系统 源程序 工作单元 名字表 标号表
缓冲区 (输入输出)
WHY (一) 专业基础课
软件技术的基础
主干课
WHY (二) 加深对程序内部执行过程的理解 从软件工程看,编译器是一个很好的实例 形式化系统 本课程的知识与计算机应用中很多领域有紧 密联系与广泛应用 有助于提高对这些语言的设计水平
什么是编译程序? 从功能上看,一个编译程序就是一个语言翻
编译第1章

1.2.1编译过程概述 1.词法分析
词法分析程序又称扫描程序。 任务
– 输入源程序,对构成源程序的字符串进行扫 描和分解,识别出一个个的单词。
单词
– 是高级语言中有实在意义的最小单位,它由 字符构成。
1.2.1编译过程概述 1.词法分析
举例说明
– 有一个C语言程序,对它进行编译 Void jisuan() 保留字: { 标识符: int y,c,d; 常数: float x,a,b; 运算符: x=a+b*10; y=c+)d*(x+b; 界符: }
第一章 引论
【课前思考】 ◇ 什么是编译程序? ◇ 编译过程和编译程序的结构? 【学习目标】 ◇ 明确编译程序的功能及其在计算机系统中 的作用。 ◇ 了解源语言程序被编译为目标程序的整个 过程,这个过程一般划分为哪些阶段?
1.1什么是编译程序
程序设计语言
– 高级语言 – 汇编语言 – 机器语言
id1:=id2+id3*10 的语法树
id1:=id2+id3*10的语法树的另一种 形式
1.2.1编译过程概述 3.语义分代码生成阶 段收集类型信息。 – 语义分析进行类型审查,审查每个算符是否 具有语言规范允许的运算对象,如有的编译 程序对实数用作数组下标的情况报告错误, 二目运算施于一整型和一实型时,强制转换, 并不认为是源程序的错误。
高级语言程序的执行方式
高级语言程序通常采用两种方式执行:编译方 式和解释方式 解释方式:逐个语句地分析和执行,如Basic, Prolog
– 优点:直观易懂,结构简单,易于查错 – 缺点:效率低,运行速度慢
编译方式:对整个程序进行分析,编译成等价 机器语言程序后执行,如Pascal,Fortran,C
编译原理教案

编译原理教案说明:一、参考书:1、陈意云、张昱:《编译原理》,高等教育出版社,2003年。
2、陈意云、张昱:《编译原理习题精选》,中国科技大学出版社,2003年。
3、吕映芝、张素琴、蒋维杜:《编译原理》,清华大学出版社,1998年第二版。
4、王生原、吕映芝、张素琴:《编译原理课程辅导》,清华大学出版社,2007年。
5、伍春香:《编译原理习题与解析》,清华大学出版社,2001年。
6、Andrew W.Appel:《现代编译原理—C语言描述》,人民邮电出版社,2005年。
7、Noam Nison等:《计算机系统要素》,电子工业出版社,2007年。
8、Randall Hyde:《编程卓越之道(第二卷)》,电子工业出版社,2007年。
二、教学目的:通过学习形式语言与自动机理论、词法分析、语法分析、语义分析、代码优化和生成等内容使学生掌握构造编译程序的基本原理和基本方法,并通过上机实习使学生进一步掌握开发应用程序的基本方法,为深入理解计算机系统、程序设计语言与开发大型应用程序打下良好的基础。
三、教学时数:课堂教学51学时,上机实验30学时。
四、授课内容:第一章编译程序概述第二章 PL/0编译程序的实现第三章文法和语言第四章词法分析第五章自顶向下语法分析方法第六章自底向上优先分析方法第七章 LR分析方法第八章语法制导翻译和中间代码生成第九章符号表第一○章目标程序运行时的存储组织第一一章代码优化第一二章代码生成第一章概述一、说明:1、教学目的与要求:了解编译程序的概念、结构以及工作流程。
2、主要内容:什么是编译程序、编译过程概述、编译程序的结构、编译阶段的组合、编译技术和软件工具以及实例分析。
3、教学重点:编译程序的结构以及每一阶段的任务。
4、教学难点:理解编译程序各模块的判错功能、编译方式和解释方式执行速度上的不同。
二、教学内容第一节编译程序1、机器语言:直接用计算机能够识别的二进制代码指令来编写程序的语言。
《编译原理课程教案》第1章编译原理概述精品PPT课件

----
《编译原理实践及应用》
教材及主要参考资料
• 教材:编译原理实践及应用,黄贤英,清华大
学出版社
• 主要参考资料: • (1) 编译原理,陈火旺,国防工业出版社 • (2)程序设计语言编译方法,肖军模,大连理工
大学出版社
• (3)编译原理,张素琴,吕映芝,清华大学出版社 • (4)编译原理,alfred V.Aho等著,李建中等译,人民
2020/10/9
《编译原理实践及应用》
第10页
第一章
引论
《编译原理实践及应用》
本章要求
• 主要内容:各种翻译程序的概念,编译 过程和阶段划分,编译程序的组成和结 构,编译程序的构造方法
• 重点掌握:编译程序工作的基本过程及 其各阶段的基本任务,编译程序总框。
2020/10/9
《编译原理实践及应用》
• (2) 学习数据结构,建立“算法”的概念,对编程有更深入的 理解。遇到问题的时候,能够寻找相应的数据结构模型,设计 适当的算法来解决问题;
• (3) 学习汇编语言,这门课程是我们真正深入了解计算机内部 工作的第一门课程。通过学习了解汇编语言如何变为机器语言, 如何对应于一条指令;
• (4) 计算机组成原理课程的学习使我们了解到计算机的硬件组 成,以及机器指令程序如何在计算机中运行的过程。
❖ 编译程序(Compiler)——将高级程序设计语言 程序翻译成逻辑上等价的低级语言(汇编语言,机 器语言)程序的翻译程序。
❖ 功能 源程序
编译程序
目标程序
2020/10/9
输入数据 计算机运行
《编译原理实践及应用》
结果
第14页
计算机中的语言层次和转换关系
编译原理课件(刘铭)第1章

语法分析程序
语义分析和中间代码生成程序
理
序
1.3 编译程序的生成方法
编译程序是一个复杂的系统程序,要 生成一个编译程序一般要考虑以下几方面: 对源语言和目标语言认真分析 设计编译算法 选择语言编制程序 调试编译程序 提交相关文档资料
编译程序的自动生成
随着编译技术和自动机理论的发展, 近 年来已研制出了一些编译程序的自动生成 系统。 如目前已广为使用词法分析程序的自 动生成系统LEX和语法分析程序自动生成 系统YACC等,此外, 还有可用来自动产 生整个编译程序的软件工具:编译程序产 生器, 它的功能是将任一语言的词法规则、 语法规则和语义解释的描述作为输入,自 动生成该语言的编译程序。
表格管理和错误处理
一个好的编译程序在编译过程中, 应具有广泛的程序查错能力,并能准确 地报告错误的种类及出错位置,以便用 户查找和纠正,因此,在编译程序中还 必须有一个出错处理程序。
编译程序的结构
源程序 ( 字符串) 表 格 管 词法分析程序 出 错 处 理 代码优化程序 程 目标代码生成程序 程 序 目标程序
翻译程序是指这样一个程序,它把 一种语言(称作源语言)所写的程序(源 程序)翻译成等价的另一种语言(称作 目标语言)的程序(目标程序)。
1.1 翻译程序与编译程序
源程序 高级语言程序 编译程序 目标程序 汇编语言或者 机器语言程序
编译程序是一种翻译程序,它将 高级语言所写的源程序翻译成等价的 机器语言或汇编语言的目标程序。
编译程序的自动生成
生成编译程序的方法还常采用自编译 方式和移植方式。
随着并行技术和并行语言的发展,处 理并行语言的并行编译技术和将串行程序 转换成并行程序的自动并行编译技术正在 深入研究之中。
第一章编译程序基本概念

构建标识符的语义辞典---符号表:
b:=a+2*5;
符号表
名字 类型 种类
a
i
v
b
i
v
地址
数据区
a 的值 b 的值
构造语句的语义树---中间语言;
如: b := a+2*5
:=
b
+
a
*
2
5
或 ⑴ ( * 2 5 t1 ) ⑵ ( + a t1 t2 )
⑶ ( := t2 _ b )
4. 优化 :提高目标程序质量的工作 ;
目 标 语 言
符号表管理 图 1.4 编 译 程 序 总 体 结 构 框 图
※ 编译程序执行过程预演:
五个阶段 流程:
错误处理
源 语 言
词法 分析
语法 分析
语义 分析
优化 处理
代码 生成
目 标 语 言
符号表管理 编 译 程 序 执 行T语语单优O过义法义词K化树树E串程N 图 解
※ 编译程序及外文翻译的类比 :
第一遍 :词法分析 、语法分析和语义分析; 第二遍 :目标代码生成和目标代码优化。 每遍中的各阶段的工作是穿插进行的, 例如:
使语法分析器处于核心位置,而把词法分析器作为子 程序;当语法分析需要下一个单词时,就调用词法分析器, 识别一个单词。
1.4 编译过程实例
例:Pascal程序片段 :
var a,b:integer; ...
数据
源语句
解释程序
结果
图 1.3 解释程序的执行过程
编译程序及解释程序的主要区别: ⑴ 前者有目标程序而后者无目标程序; ⑵ 前者运行效率高而后者便于人机对话。
1.2 编译程序结构
第一章 编译程序基本概念

4. 优化 :提高目标程序质量的工作 ;
例: b := a+2*5 := b a 2 := b a + 10 + * 5 ⑴( * 2 5 t1 _ t1 ) t2 ) b)
经 常数合并,可分别获得优化后的中间代码如下图所示: 常数合并,可分别获得优化后的中间代码如下图所示:
⑵( + a ⑶ ( := t2
编译程序与解释程序的主要区别: 编译程序与解释程序的主要区别: 的主要区别 前者有目标程序而后者 目标程序; 而后者无 ⑴ 前者有目标程序而后者无目标程序; ⑵ 前者运行效率高而后者便于人机对话。 前者运行效率高而后者便于人机对话 运行效率高而后者便于人机对话。
1.2
编译程序结构
编译程序总体结构如图1.4所示。 编译程序总体结构如图1.4所示。 1.4所示
错 误 处 理 错 误 处 理 源 语 言 词法 分析 语法 分析 语义 分析 优化 优化 处理 处理
编译程序的 五个阶段: 五个阶段:
代码 生成
目 标 语 言
单词串 TOKEN
语法树
符 号 表 管 理
语义树
优化 语义树
图 1.4
编 译 程 序 总 体 结 构 框 图
※ 编译程序与机器翻译的类比 : 编译程序与机器翻译的类比
它特指把某种高级程序设计语言翻译成具 体计算机上的低级程序设计语言。 体计算机上的低级程序设计语言。
高级语言的执行过程 --两个阶段: 两个阶段:
源语言 编译程序 编译阶段 图 1.2 目标语言 数据 运 行 程 序 运行阶段 结果
高级语言的执行过程
※ 什么是 解释程序? 解释程序?
解释程序(interpreter)也是一种翻译程序, 解释程序(interpreter)也是一种翻译程序,将某高 级语翻译成具体计算机上的低级程序设计语言; 级语翻译成具体计算机上的低级程序设计语言;解释程序 的执行过成如图1.3 所示。 的执行过成如图1.3 所示。 数据 一条源语句 图 1.3 解释程序 解释程序的执行过程 结果
第1章 编译系统概述

1.3 编译过程概述
典型的编译程序工作过程是:输入源程序,对它进行加工处 理,最后输出目标程序(机器语言或汇编语言形式)。整个过 程相当复杂,从数据加工的角度来看,可将其分成4个逻辑阶 段,它们是: 词法分析 语法分析 语义分析(中间代码产生) 目标代码生成 图示如下: 源 程 序 目 标 程 序
㈡汇编语言
用记忆符取代二进制位,存储地址和汇编语句的序号可用符号 名表示。 ①优点 用符号取代二进制数,提高了程序的可理解性。 性能较好的汇编语言,可用符号名来表示存储地址和汇编 语句序号,这样避免了在汇编语句中绝对地址的出现。 可充分利用硬件特性 所以,汇编语言在一定程度上降低了程序编制和维护的难度。 ②缺点 汇编语句和机器指令基本上是一对一的,所以汇编语言的编 程效率并没有质的提高。 和机器语言一样,汇编语言依附于目标计算机。 需汇编程序,将汇编语言译成机器语言。
00000000-00000011(3) 00000000-01000000(128)
……
㈣目标代码生成(Code Generation)
执行目标代码生成的程序称为目标代码生成器。 任务:中间代码 目标代码(机器指令或汇编语言) 依据:目标机器的系统结构 假设模型机器的指令格式为: op Ri , M (Ri)op(M)→ Ri op Ri , Rj (Ri)op(Rj)→ Ri op Ri , C (Ri)op C → Ri 其中Ri表示寄存器,M表示内存地址(可用符号表示),C表 示常数。 表达式3+abc*128最终形成的汇编语言程序示意如下: Load R0,abc Mul R0,128 Store R0,T1 Load R0,3 Add R0,T1 Store R0,T2
㈡语法分析(Parsing)
- 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)