编译原理作业集第一章修订版
- 格式:doc
- 大小:51.50 KB
- 文档页数:6
编译原理作业标准答案第一章引言一、解释下列各词源语言:编写源程序的语言(基本符号,关键字),各种程序设计语言都可以作为源语言。
源程序: 用接近自然语言(数学语言)的源语言(基本符号,关键字)编写的程序,它是翻译程序处理的对象。
目标程序: 目标程序是源程序经过翻译程序加工最后得到的程序。
目标程序(结果程序)一般可由计算机直接执行。
低级语言:机器语言和汇编语言。
高级语言:是人们根据描述实际问题的需要而设计的一个记号系统。
如同自然语言(接近数学语言和工程语言)一样,语言的基本单位是语句,由符号组和一组用来组织它们成为有确定意义的组合规则。
翻译程序: 能够把某一种语言程序(源语言程序)改变成另一种语言程序(目标语言程序),后者与前者在逻辑上是等价的。
其中包括:编译程序,解释程序,汇编程序。
编译程序: 把输入的源程序翻译成等价的目标程序(汇编语言或机器语言),然后再执行目标程序(先编译后执行),执行翻译工作的程序称为编译程序。
解释程序: 以该语言写的源程序作为输入,但不产生目标程序。
按源程序中语句动态顺序逐句的边解释边执行的过程,完成翻译工作的程序称为解释程序。
二、什么叫“遍”?指对源程序或源程序的中间形式(如单词,中间代码)从头到尾扫描一次,并作相应的加工处理,称为一遍。
三、简述编译程序的基本过程的任务。
编译程序的工作是指从输入源程序开始到输出目标程序为止的整个过程,整个过程可以划分5个阶段。
词法分析:输入源程序,进行词法分析,输出单词符号。
语法分析:在词法分析的基础上,根据语言的语法规则把单词符号串分解成各类语法单位,并判断输入串是否构成语法正确的“程序”。
中间代码生成:按照语义规则把语法分析器归约(或推导)出的语法单位翻译成一定形式的中间代码。
优化:对中间代码进行优化处理。
目标代码生成:把中间代码翻译成目标语言程序。
四、编译程序与解释程序的区别?编译程序生成目标程序后,再执行目标程序;然而解释程序不生成目标程序,边解释边执行。
第1章编译概述1.判断下面的陈述是否正确。
(1)编译器生成的目标程序都是可执行的程序。
(2)汇编器将高级语言程序翻译成汇编语言程序。
(3)编译程序和解释程序的根本区别在于解释程序对源程序并没有真正进行翻译。
(4)因为编译程序和解释程序具有不同的功能,所以它们的实现技术也完全不同。
(5)编译程序的五个组成部分缺一不可。
(6)许多编译程序在识别出语法单位后并不真正构造语法树。
(7)高级语言程序到低级语言程序的转换是基于语义的等价变换。
(8)含有优化部分的编译程序的执行效率高。
(9)优化的任务在于对中间代码进行加工和变换,以使其能产生运行结果更为准确的目标代码。
(10)编译前端主要由与源语言和目标机相关的那些部分组成。
(11)无论一遍扫描的编译器还是多遍扫描的编译器都要对源程序至少扫描一遍。
(12)在编译过程中,既可以将几个不同的阶段合为一遍,也可以把一个阶段的工作分为若干遍。
(13)取编译程序前端改写其后端以生成不同机器上的目标代码,目前技术上还难以实现。
(14)支持程序设计人员进行程序计开发的工具,除了编译程序以外,还需要编辑程序、链接程序和调试程序等其他一些工具。
2. 指出下列错误信息是编译的哪个阶段报告的A. 词法B. 语法C. 语义(1)else没有匹配的if(2)使用的标识符没有定义(3)标识符中出现?号(4)赋值语句写成:x+y=1;(5)float a=1.1, b=2, c ; c=a%b;(6)数组下标越界3. 阅读教材第1章,回答以下问题:(1)计算机执行用高级语言编写的程序有哪些途径?它们之间的主要区别是什么?(2)画出编译程序的总体逻辑结构图,以语句“Area=3.14*r*r”编译过程为例,简述编译各个阶段的主要任务。
习题答案1.(1) × (2) × (3) × (4) × (5) × (6) √ (7) √(8) × (9) × (10) × (11) √ (12) √ (13) × (14) √2.BCABCC。
第一章引论本章要点:1. 正确理解什么是编译程序;2. 了解编译程序工作的基本过程及各阶段的基本任务;3. 熟悉编译程序的总体结构框图;4. 了解编译程序的构造过程和构造工具。
本章目标:1. 掌握本章的“编译程序”、“交叉编译程序”、“编译前端与编译后端”等基本概念,并能在以后的学习熟练运用;2. 掌握T形图表示。
本章重点:1. 概念比较:①编译程序、解释程序;②诊断编译程序、优化编译程序;③交叉编译程序、可变目标编译程序;④编译前端与编译后端;2. 编译工作过程的五个阶段;3. 编译程序总框;4. 编译程序“移植”。
本章难点1. 编译程序“移植”;作业题及参考答案一、单项选择题:(按照组卷方案,至少8道小题)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. 编译程序处理的对象是源语言。
14秋《编译原理》作业1
一,单选题
1. ( )是把中间代码进行变换或者进行改造,目的是使生成的目标代码更为高效,即省时间和省空间。
A. 语法分析
B. 语义分析
C. 中间代码生成
D. 代码优化
E. 目标代码生成
?
正确答案:D
2. 编译程序是将高级语言程序翻译成( )。
A. 高级语言程序
B. 机器语言程序
C. 汇编语言程序
D. 汇编语言或机器语言程序
?
正确答案:D
3. 文法G 所描述的语言是_____的集合。
A. 文法G 的字母表V 中所有符号组成的符号串
B. 文法G 的字母表V 的闭包V* 中的所有符号串
C. 由文法的开始符号推出的所有终极符串
D. 由文法的开始符号推出的所有符号串
?
正确答案:C
4. 下列______优化方法不是针对循环优化进行的。
A. 强度削弱
B. 删除归纳变量
C. 删除多余运算
D. 代码外提
?
正确答案:C
5. 文法分为四种类型,即0型、1型、2型、3型。
其中0型文法是_____。
A. 短语文法
B. 正则文法
C. 上下文有关文法
D. 上下文无关文法
?。
第一章习题解答1.解:源程序是指以某种程序设计语言所编写的程序。
目标程序是指编译程序(或解释程序)将源程序处理加工而得的另一种语言(目标语言)的程序。
翻译程序是将某种语言翻译成另一种语言的程序的统称。
编译程序与解释程序均为翻译程序,但二者工作方法不同。
解释程序的特点是并不先将高级语言程序全部翻译成机器代码,而是每读入一条高级语言程序语句,就用解释程序将其翻译成一段机器指令并执行之,然后再读入下一条语句继续进行解释、执行,如此反复。
即边解释边执行,翻译所得的指令序列并不保存。
编译程序的特点是先将高级语言程序翻译成机器语言程序,将其保存到指定的空间中,在用户需要时再执行之。
即先翻译、后执行。
2.解:一般说来,编译程序主要由词法分析程序、语法分析程序、语义分析程序、中间代码生成程序、代码优化程序、目标代码生成程序、信息表管理程序、错误检查处理程序组成。
3.解:C语言的关键字有:auto break case char const continuedefault do double else enum extern float for goto if int longregister return short signed sizeof static struct switch typedef union unsigned void volatile while。
上述关键字在C语言中均为保留字。
4.解:C语言中括号有三种:{},[],()。
其中,{}用于语句括号;[]用于数组;()用于函数(定义与调用)及表达式运算(改变运算顺序)。
C语言中无END关键字。
逗号在C语言中被视为分隔符和运算符,作为优先级最低的运算符,运算结果为逗号表达式最右侧子表达式的值(如:(a,b,c,d)的值为d)。
5.略第二章习题解答1.(1)答:26*26=676(2)答:26*10=260(3)答:{a,b,c,...,z,a0,a1,...,a9,aa,...,az,...,zz,a00,a01,...,zzz},共26+26*36+26*36*36=34658个2.构造产生下列语言的文法(1){a n b n|n≥0}解:对应文法为G(S) = ({S},{a,b},{ S→ε| aSb },S)(2){a n b m c p|n,m,p≥0}解:对应文法为G(S) = ({S,X,Y},{a,b,c},{S→aS|X,X→bX|Y,Y→cY|ε},S)(3){a n # b n|n≥0}∪{c n # d n|n≥0}解:对应文法为G(S) = ({S,X,Y},{a,b,c,d,#}, {S→X,S→Y,X→aXb|#,Y→cYd|# },S)(4){w#w r# | w?{0,1}*,w r是w的逆序排列}解:G(S) = ({S,W,R},{0,1,#}, {S→W#, W→0W0|1W1|# },S)(5)任何不是以0打头的所有奇整数所组成的集合解:G(S) = ({S,A,B,I,J},{-,0,1,2,3,4,5,6,7,8,9},{S→J|IBJ,B→0B|IB|e, I→J|2|4|6|8, Jà1|3|5|7|9},S)(6)所有偶数个0和偶数个1所组成的符号串集合解:对应文法为S→0A|1B|e,A→0S|1C B→0C|1S C→1A|0B3.描述语言特点(1)S→10S0S→aAA→bAA→a解:本文法构成的语言集为:L(G)={(10)n ab m a0n|n, m≥0}。
第一章习题解答1.1 简述计算机程序设计语言的发展过程。
1.2 高级程序设计语言有哪些特点?1.3 高级程序设计语言为何需要翻译程序?1.4 高级程序设计语言有哪两种翻译方式?分别介绍它们的特点。
1.5 编译程序具有哪些特点?1.6 编译程序包括哪几个主要组成部分?分别阐述各个组成部分的主要任务。
1.7 试叙述编译程序的结构和组织方式。
1.8 简述编译程序的自展技术、移植、自动化以及可再入性。
1.9 何谓翻译程序的编写系统?1.10 并行编译程序有什么特点?参考答案1.1 答:最早的计算机程序设计语言是机器语言(指令系统),机器语言中的指令都是用二进制代码直接表示的。
随后出现了符号语言和汇编语言等程序设计语言,它们比机器语言虽前进了一步,但仍属计算机低级语言,编写程序效率很低。
程序设计语言发展的第三阶段是计算机高级程序设计语言的诞生。
随着1954年第一种高级语言FORTRAN I语言的问世,计算机高级程序设计语言从此以后如雨后春笋,不断涌现。
作为高级程序设计语言的一种发展,目前流行的面向对象程序设计语言是对传统的面向过程程序设计语言的一种挑战。
1.2 答:高级程序设计语言具有以下的特点:独立于机器、接近自然语言、编写效率高、编写出的程序易读、易理解、易修改、易移植等。
1.3 答:由于计算机不能直接执行用高级语言编写的程序,只能直接执行机器语言程序。
所以,用高级语言编写的程序必须由一个翻译程序翻译成机器语言程序。
1.4答:翻译有两种方式,一种是编译方式,另一种是解释方式。
编译方式是先将源程序翻译成汇编语言程序或机器语言程序(称为目标程序),然后再执行它。
它一般包括词法分析程序、语法分析程序、语义分析程序、中间代码生成程序、代码优化程序、目标代码生成程序、表格处理程序和出错处理程序。
编译过程可由一遍或多遍完成。
和编译方式不同,解释方式并不先产生目标程序然后再执行之,而是对源程序边翻译边执行。
二者的根本区别在于是否生成目标代码,而不是是否进行翻译。
第一章引论
本章要点:
1. 正确理解什么是编译程序;
2. 了解编译程序工作的基本过程及各阶段的基本任务;
3. 熟悉编译程序的总体结构框图;
4. 了解编译程序的构造过程和构造工具。
本章目标:
1. 掌握本章的“编译程序”、“交叉编译程序”、“编译前端与编译后端”等基本概念,并能在以后的学习熟练运用;
2. 掌握T形图表示。
本章重点:
1. 概念比较:
①编译程序、解释程序;
②诊断编译程序、优化编译程序;
③交叉编译程序、可变目标编译程序;
④编译前端与编译后端;
2. 编译工作过程的五个阶段;
3. 编译程序总框;
4. 编译程序“移植”。
本章难点
1. 编译程序“移植”;
作业题及参考答案
一、单项选择题:
(按照组卷方案,至少8道小题)
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. Lex是语法分析自动生成器
d. 解释程序属于编译程序
7. 目标代码生成阶段所生成的目标代码的形式不可能是。
a. 绝对指令代码
b. 可充定位的指令代码。
c. 汇编指令代码
d. 三地址代码
8. 语义错误是指源程序中不符合语义规则的错误,不包括:
a. 非法字符错误
b. 类型不一致错误。
c. 作用域错误
d. 说明错误
一.答案:1. c; 2. b;3. c; 4. c;5. b;6. d;7. d;8.a;
二、填空题:
(按照组卷方案,至少8道小题)
1.我们有时把编译程序划分为编译前端和编译后端。
前端主要由与有关但与
无关的那些部分组成。
2.对编译程序而言,输入数据是;输出数据是。
3. 编译后端通常不依赖于源语言而仅仅依赖于。
4. 如果不需改写编译程序中与机器无关的部分就可以把编译程序移植到另外一个目标机上,则称该编译程序是。
5. 描述程序设计语言词法的有效工具是。
6. 编译过程的每一个阶段都能检测出错误,其中,绝大多数错误在_______ 阶段检测出来的。
7. 为了使编译后的Java程序从一个平台移到另外一个平台上执行,Java定义了一种称为ByteCode的虚拟机代码。
只要实际使用的操作平台上实现了执行ByteCode的Java解释器,这个操作平台就可以执行各种Java程序。
这就是所谓Java语言的。
8.在一个程序设计环境中,起着中心作用。
连接程序、调试程序、程序分析等工具的工作直接依赖于它所产生的结果。
二.答案:1. 源程序,目标机;2. 源程序,目标程序;3. 中间语言;4. 可变目标编译程序;5. 正规式和有限自动机;6. 词法分析、语法分析和语义分析;7. 操作平台无关性;8.编译程序。
三、判断题:
(按照组卷方案,至少8道小题)
1. 在编译过程中,既可以将几个不同的阶段合为一遍,也可以把一个阶段的工作分为若干遍。
()
2. 编译程序生成的目标程序都是可执行的程序。
()
3. 编译前端主要由与源语言和目标机相关的那些部分组成。
()
4. 优化的任务在于对前端编译所产生的中间代码进行加工和变换,以其能产生运行结果更为准确的目标代码。
()
5. 为了让编译程序可改变目标机,通常需要一种良好定义的中间语言支持。
()
6. 汇编器将高级语言程序翻译成汇编语言程序。
()
7. 许多编译程序在识别出语法单位后并不真正构造语法树。
()
8. 取编译程序前端改写其后端以生成不同机器上的目标代码,目前技术上还难以实现。
()三.答案 1. √;2. ×;3. ×;4. ×;5. √;6. ×;7. √;8. ×;
四、名词解释:、
(按照组卷方案,至少3道小题)
1. 诊断编译程序、优化编译程序;
2. 交叉编译程序、可变目标编译程序;
3. 编译程序的“遍”
4. 程序设计环境
四.答案:
1.诊断编译程序:专门用于帮助程序开发和调试的编译程序。
优化编译程序:着重于提高目标代码效率的编译程序。
2.交叉编译程序:能产生不同于其宿主机的机器代码的编译程序。
可变目标编译程序:不需重写编译程序中与机器无关的部分就能改变目标机的编译程序。
3. 编译程序的“遍”:就是对源程序或者中间结果从头到尾的一次扫描,并做有关的加工处理,生成新的中间结果或者目标程序。
4. 程序设计环境:支持程序设计人员进行程序设计开发所需要的如编辑程序、编译程序、连接程序和调试程序等软件工具,一起构成程序设计环境。
五、简答题:
(按照组卷方案,至少3道小题)
1. 什么是编译程序的“遍”?
2. 什么编译程序、解释程序?编译程序和解释程序有什么区别?
3. 前端编译和后端编译是如何划分的?
4. 什么是标识符,什么是名字,它们的区别是什么?
5. 如果机器A上已有一个用A机器代码实现的某高级语言L1的编译程序,则可以用L1编写另一种高级语言L2的编译程序,画出这个实现过程的T形图表示。
6. 如何采用“移植”的办法,利用A机器上已有的高级语言L编写能够在B机器上运行的高级语言L的编译程序?画出T形图表示。
五.答案:
1. 编译程序的“遍”,就是对源程序或者中间结果从头到尾的一次扫描,并做有关的加工处理,生成新的中间结果或者目标程序。
既可以将几个不同阶段合为一遍,也可以把一个阶段的工作分为若干遍。
当一遍中包含若干阶段时,各阶段的工作是穿插进行的。
一个编译程序究竟应分为几遍、如何划分,是与源语言、设计要求、硬件设备等诸因素有关的,难以统一规定。
2. 编译程序:把某一种高级语言源程序转换成汇编语言程序或机器语言程序的程序。
解释程序:对高级语言源程序并不生成汇编程序或机器语言程序,而是边解释边执行的程序。
编译程序把源语言程序翻译成目标代码,然后由操作系统加载执行;而解释程序则是边。