编译原理复习资料

合集下载

编译原理复习资料

编译原理复习资料

(1) 简述规范归约的基本思想。

(第五章课件第5张)用一个寄存符号的先进后出栈,把输入符号一个一个地移进到栈里,当栈顶形成某个产生式的候选式时,即把栈顶的这一部分替换成(归约为)该产生式的左部符号。

(2) 阐述编译程序各个组成部分主要完成的工作。

(课本P2~P4)词法分析的任务:输入源程序,对构成源程序的字符串进行扫描和分解,识别出一个个的单词。

语法分析:在词法分析的基础上,根据语言的语法规则,把单词符号串分解成各类语法单位。

语义分析与中间代码产生:对语法分析所识别出的各类语法范畴,分析其含义,并进行初步翻译。

优化:在于对前段产生的中间代码进行加工变换,以期在最后阶段能产生出更为高效的目标代码。

目标代码生成:把中间代码变换成特定机器上的低级语言代码。

(3) 什么是编译器的前端和后端,这样划分有何意义?(课本P7)编译器粗略分为词法分析,语法分析,类型检查,中间代码生成,代码优化,目标代码生成,目标代码优化。

把中间代码生成及之前阶段划分问编译器的前端,那么后端与前端是独立的。

后端只需要一种中间代码表示,可以是三地址代码或四元式等,而这些都与前端生成的方式无关。

也就是不论你前端是用fortran 还是c/c++,只要生成了中间代码表示就可以了,后端是不管你是用哪种语言生成的。

(4) 乔姆斯基把文法分为哪几种类型?对这几种类型文法作简要说明。

(课本P34)把文法分成四种类型:0,1,2,3型。

与上下文无关文法一样,它们都由四部分组成,但对产生式的限制有所不同。

0型(短语文法,图灵机):产生式形如:α→β其中:∈α (VT ⋃ VN)*且至少含有一个非终结符;∈β (VT ⋃ VN)*1型(上下文有关文法,线性界限自动机):产生式形如:α→β其中:|α| ≤ |β|。

仅Sε→例外,但此时S不得出现在任何产生式的右部。

2型(上下文无关文法,非确定下推自动机):产生式形如: A →β其中:A∈ VN;∈β (VT ⋃ VN)*。

编译原理复习材料

编译原理复习材料
a+b=5 a=7 x=5 y=3 b=3 z=7
(4) 所谓传名是在进入调用段之前不对实在参数预先进行计值,而 是过程中每当使用到相应的形参时才对它实行计值。因序),每当过程体中使用到相应 形参时就调用这个子程序。 因此,过程体执行y:=y+1;语句,实现时处理成为: a=a+1; 过程体执行z:=z+x;语句,实现时处理成为: a=a+(a+b); 执行上述两语句后,a的值是 9。因此,程序执行后输出 a的值是 9。 综上所述程序执行时a的输出: (1)传值:2 (2)传地址:8 (3)得结果:7 (4)传名:9 5、几个基本概念 考虑一个有穷字母表∑字符集,其中每一个元素称为一个符号,∑上的
程序是由函数或过程构成的,程序的任务是通过函数或过程之间的 协作(相互调用)l来完成的,函数或过程的调用有以下4种方式:传地 址(call-by-reference)、得结果(call by result)、传值(call-byvalue)和传名(call by name)。 定义函数Swap,其中M、N是形式参数,简称形参。 Void Swap(int M,int N) { int t; t=N; N=M; M=t; } 函数调用: Swap(I,J);其中I和J是实在参数,简称实参。下面我们以下面的 程序为例分别讨论4种参数传递的方式。
(2)这种类型的数据对象可以具有的值; (3)可以作用于这种类型的数据对象的操作。 一个程序语言必须提供一定的初等数据类型,包括这些数据类型上能 进行的运算的定义。不同的语言含有不同的初等数据成分。常见的初等 数据类型有: (1)数值类型:整型、实型、复数、双精度, 运算:+,-,*,/等 (2)逻辑类型:布尔运算:∨,∧,┑ (3)字符类型:符号处理 (4)指针类型:指针式把内存地址作为其值的数据类型,通过指针可 以操作内存空间。 程序语言中的各种名字都是用标识符表示的。标识符是指由字母、 下划线和数字组成的,以字母或下划线为开头的一个字符串。名字和标 识符在形式上难于区别,标识符是一个没有意义的的字符序列,而名字 则有明确的意义和属性。用计算机术语来说,每个名字可看成是代表一 个抽象的存储单元,这个单元可含有一位、一字节或相继的多个字节。 该单元的内容则被认为是名字的值。仅把名字看成代表一定的存储单元 还是不够的,我们还必须同时指出它的属性(数据类型)。只有指定了 属性的存储单元,其值才是可以理解的。 一个名字的属性包括类型和作用域。名字的类型决定了它能具有什 么样的值, 值在计算机内部的表示方式,以及对它能施加什么运算。 名字的作用域规定了它的值的存在范围。 除了初等数据类型外,有些语言还提供了由初等数据构造复杂数据 的手段。常见的复杂数据类型有: (1)数组。一个数组是由同一类型数据所组成的某种n维矩形结 构。数组在内存中占有一块连续的空间,系统采用基地址加偏移量的方 式来访问数组元素。 (2)记录。从逻辑上讲,记录是由已知的数据组合起来的一种结 构。一个记录通常含有若干个分量,每个分量称为记录的一个栏(或域 field)。每个分量都是一个确定类型的数据,不同的分量的数据类型可 以不同。 (3)字符串、表格、栈和队列。 (4)抽象数据类型。抽象数据类型封装了数据和操作,在面向对象 程序设计语言中,Ada通过程序包(package)提供了数据封装的支持, Smalltalk、C++和Java语言则通过类(class)对抽象数据类型提供支 持。 4、函数调用的方式

编译原理复习重点含答案

编译原理复习重点含答案

编译原理复习重点含答案编译原理复习重点编译原理是计算机科学中的一门重要课程,它研究的是如何将高级语言程序转化为机器语言的过程。

在编译原理的学习中,我们需要掌握一些重要的概念和技术,以便能够理解和应用编译器的工作原理。

本文将重点介绍编译原理的几个重要主题,并提供相应的答案供参考。

一、词法分析词法分析是编译器的第一个阶段,它的任务是将输入的字符序列划分为一个个有意义的词素(token)。

词法分析器通常使用有限自动机(DFA)来实现,其工作原理是将输入字符序列逐个读入,并根据事先定义好的词法规则进行匹配和识别。

常见的词法单元包括关键字、标识符、常量、运算符等。

常见的词法规则包括:1. 关键字:例如if、while、for等。

2. 标识符:由字母、数字和下划线组成,且以字母或下划线开头。

3. 常量:包括整数常量、浮点数常量、字符常量和字符串常量等。

4. 运算符:例如加法运算符+、减法运算符-等。

5. 分隔符:例如逗号、分号等。

词法分析的结果是一个个词法单元,每个词法单元包含一个词素和对应的词法单元类型。

例如,对于输入程序"int a = 10;",词法分析的结果可能是[("int", "关键字"), ("a", "标识符"), ("=", "运算符"), ("10", "整数常量"), (";", "分隔符")]。

二、语法分析语法分析是编译器的第二个阶段,它的任务是将词法分析器输出的词法单元序列转化为抽象语法树(AST)。

语法分析器通常使用上下文无关文法(CFG)来描述语言的语法结构,并使用递归下降、LL(1)分析、LR分析等算法进行分析。

常见的语法规则包括:1. 表达式:例如算术表达式、布尔表达式等。

编译原理复习资料

编译原理复习资料

第1部分一简答题1.编译程序按功能分为哪几个阶段?各个阶段的主要功能?2.实现高级语言程序的途径有哪几种?它们之间的区别?3.给出描述非0数字作为开始符的奇数字符串的正则表达式或正则式。

4.判断字符串a n b n(n >0)是否可用确定自动机识别?如果能,则画出自动机,否则说明原因5.对如下文法:G[S]:S → a b S | a a B | a dB → b b B | b分别给出句子abaabbb和ad的句柄6.有如下文法,给出每个产生式的Predict集。

P → begin S endS → id := E ; S |E → n | id7.什么是可规约活前缀?举一例说明。

8.通过合并LR(1)文法中的同心状态得到的LALR(1)文法可能会产生哪些冲突?一定不会产生哪些冲突?9.设对偶表(L,N)分别表示程序在当前位置的层数和偏移量,确定下面程序段中括号部分的内容。

假设系统规定整型(int)变量占1个单元,实型(real)变量占2个单元。

(L, N) Type at = array of [1..10] of int;(①) var x :real;(②) function f ( ( ?,M) var a: at,(③) b: at,(④) var x: real ) : int10.给出活动记录空间结构?并给出各部分的存储对象?11.有如下文法:G[S]:S → ( L ) | aL → S PP → , S P |给出该文法的动作文法打印每个a的嵌套深度。

例如(a,(a),(a))打印1,2,2。

12.文法可分为几类;各举一例。

13.Display表的作用?14.如下是当前执行某个过程时的活动记录,设变量x的层数和偏移量分别为L和Off,说明如何访问变量x。

15.当实参为变量,形参分别为变参和值参时,传参的区别。

二、说明如下文法是否是LL(1)文法,若不是,将其转换为LL(1)文法。

编译原理总复习概要

编译原理总复习概要

11
第5章 自顶向下语法分析方法
1、SELECT集的求法 SELECT集的求法
对给定的上下文无关文法的产生式A→α, 对给定的上下文无关文法的产生式A→α,A∈VN, A→α α∈V*, α∈V*, 若α≠>*ε, 则 SELECT(A→α)=FIRST(α) 若α=>*ε, 则 SELECT(A→α) =(FIRST(α)=(FIRST(α)-{ε})∪FOLLOW(A)
19
LR分析法 第7章 LR分析法
1、LR分析法 LR分析法
基本思想:根据当前分析栈中的符号串( 基本思想:根据当前分析栈中的符号串(通常 以状态表示)和向右顺序查看输入串的K 以状态表示)和向右顺序查看输入串的K个 K>=0)符号就可唯一地确定句柄 可唯一地确定句柄。 (K>=0)符号就可唯一地确定句柄。 LR分析是一种规范归约。 分析是一种规范归约 LR分析是一种规范归约。 LR分析法每次归约的是句柄。 分析法每次归约的是句柄 LR分析法每次归约的是句柄。
18
注意:分析到最后分析栈和剩余输入串均为#才接受! 注意:分析到最后分析栈和剩余输入串均为#才接受!
第6章 自底向上优先分析法
1、算符优先分析法的思想
基本思想:只定义文法中终结符之间的优先关 基本思想:只定义文法中终结符之间的优先关 终结符 不考虑非终结符), ),并由这种关系指导分 系(不考虑非终结符),并由这种关系指导分 析过程。 析过程。 算符优先法每次归约最左素短语而不是句柄。 最左素短语而不是句柄 算符优先法每次归约最左素短语而不是句柄。
6
第3章 文法和语言
3、句型、句子、短语、直接短语、句柄的含义 句型、句子、短语、直接短语、
表现在语法树中: 表现在语法树中:

编译原理期末总结复习

编译原理期末总结复习

编译原理期末总结复习编译原理期末总结复习篇一:一、简答题1.什么是编译程序?答:编译程序是一种将高级语言程序(源程序)翻译成低级语言(目标程序)的程序。

将高级程序设计语言程序翻译成逻辑上等价的低级语言(汇编语言,机器语言)程序的翻译程序。

2.请写出文法的形式定义?答:一个文法G抽象地表示为四元组 G=(Vn,Vt,P,S)–其中Vn表示非终结符号– Vt表示终结符号,Vn∪Vt=V(字母表),Vn∩Vt=φ– S是开始符号,–P是产生式,形如:α→β(α∈V+且至少含有一个非终结符号,β∈V*)3.语法分析阶段的功能是什么?答:在词法分析的基础上,根据语言的语法规则,将单词符号串分解成各类语法短语(例:程序、语句、表达式)。

确定整个输入串是否构成语法上正确的程序。

4.局部优化有哪些常用的技术?答:优化技术1—删除公共子表达式优化技术2—复写传播优化技术3—删除无用代码优化技术4—对程序进行代数恒等变换(降低运算强度)优化技术5—代码外提优化技术6—强度削弱优化技术7—删除归纳变量优化技术简介——对程序进行代数恒等变换(代数简化)优化技术简介——对程序进行代数恒等变换(合并已知量)5.编译过程分哪几个阶段?答:逻辑上分五个阶段:词法分析、语法分析、语义分析与中间代码生成、代码优化、目标代码生成。

每个阶段把源程序从一种表示变换成另一种表示。

6. 什么是文法?答:文法是描述语言的语法结构的形式规则。

是一种工具,它可用于严格定义句子的结构;用有穷的规则刻划无穷的集合;文法是被用来精确而无歧义地描述语言的句子的构成方式;文法描述语言的时候不考虑语言的含义。

7. 语义分析阶段的功能是什么?答:对语法分析所识别出的各类语法范畴分析其含义,进行初步的翻译(翻译成中间代码);并对静态语义进行审查。

8.代码优化须遵循哪些原则?答:等价原则:不改变运行结果有效原则:优化后时间更短,占用空间更少合算原则:应用较低的代价取得较好的优化效果9.词法分析阶段的功能是什么?答:逐个读入源程序字符并按照构词规则切分成一系列单词任务:读入源程序,输出单词符号—滤掉空格,跳过注释、换行符—追踪换行标志,指出源程序出错的行列位置—宏展开,……10.什么是符号表?答:符号表在编译程序工作的过程中需要不断收集、记录和使用源程序中一些语法符号的类型和特征等相关信息。

编译原理总复习

编译原理总复习

中间代码生成的自动生成工具
工具介绍
自动生成工具是一种辅助编译器设计的软件工具,它可以自动生成中间代码,从而简化编 译器的设计和实现过程。
工具分类
根据生成中间代码的方式不同,自动生成工具可以分为解析型和抽象语法树型两类。解析 型工具将源代码直接翻译成中间代码;抽象语法树型工具则将源代码先转换为抽象语法树 ,然后再将抽象语法树转换为中间代码。
Antlr
一个强大的语法分析器生成器,支持多种语言和复杂 的文法规则。
GOLD
一个高效的语法分析器生成器,支持多种目标语言和 优化选项。
04 中间代码生成
中间代码生成的定义与任务
定义
中间代码生成是编译过程的一个阶段,将源代码转化为一种中间表示形式,这种中间表 示形式称为中间代码。
任务
其任务包括控制结构的抽象、语义的消除、代码优化等,以简化后续的代码优化和目标 代码生成阶段。
循环结构的优化
循环展开
将循环体中的代码复制到循环 外部,以减少循环次数。
循环合并
将多个循环合并为一个循环, 以减少循环次数。
循环嵌套
将一个循环嵌套在另一个循环 内部,以减少循环次数。
循环展开与循环合并的优 缺点
循环展开可以减少循环次数, 但会增加代码量;循环合并可 以减少代码量,但会增加循环 次数。在实际应用中,需要根 据具体情况选择合适的优化方 法。
算法优化
根据问题的特点,选择合适的算法,以提高程序 执行效率。
系统资源优化
根据系统资源的特点,合理分配和利用系统资源, 以提高系统运行效率。
循环优化
1 2
循环展开
将循环体中的操作展开,以减少循环次数和减少 循环开销。
循环合并
将多个循环合并为一个循环,以减少循环次数和 减少循环开销。

编译原理总复习

编译原理总复习

编译原理总复习总复习■第1章1、编译程序是⼀种翻译程序,它将⾼级语⾔所写的源程序翻译成等价的机器语⾔或者汇编语⾔的⽬标程序。

2、编译程序是计算机系统中重要的系统软件!3、解释程序与编译程序的主要区别是解释程序在执⾏过程中不产⽣⽬标程序。

4、编译的各个阶段。

答:整个编译过程可以分为5个阶段:词法分析,语法分析,语义分析及中间代码⽣成,代码优化和⽬标代码⽣成。

5、编译程序的结构框图或步骤。

6、遍(趟):是对源程序或源程序的中间结果从头到尾扫描⼀遍,并作有关加⼯处理,⽣成新的中间结果或⽬标程序的过程。

■第2章1、符号串的基本运算。

2、简单的说⽂法由产⽣式组成;产⽣式中的符号分为两类:终结符号和⾮终结符号。

3、推导(最左、最右)、句型、句⼦、短语、句柄4、乔姆斯基层次中:L3 ? L2 ? L1 ? L0■第2章例题已知⽂法G[E]:E→T|E+T|E-TT→F|T*F|T/FF→(E)|i(1)该⽂法的开始符号是什么?(2)请给出该⽂法的终结符号集合VT和⾮终结符号集合VN。

(3)找出句型T+T*F+i的所有短语、直接(简单)短语、句柄。

■第3章1、词法分析程序的输出是单词符号序列。

2、DFA的三种表⽰形式——状态转移图、状态转换表和五元组表⽰(Q, ∑, f, S, Z );3、正规式向DFA的转换:(1)正规式——NFA;(转换原则见下页)(2)NFA——DFA;(3)DFA的最⼩化。

4、DFA向正规式的转换。

正则式向NFA转换的原则:例:构造与正则表达式R=ba(a|b)*等价的状态最少的DFA,并写出该DFA的五元组形式或状态转换表。

■第4章1、语法分析⽅法的各种分类;2、LL(1)分析⽅法。

提⽰:在此算法中注意First集和Follow集的求法。

并且⼀定要注意分析过程中步骤要完整。

(分析步骤见下页总结)例:⽂法:S?a|^|(T) T?T,S|S试判断该⽂法是否是LL(1)⽂法。

习题4:P100 4.3 4.7 4.9■LL(1)分析⽅法相关知识总结1、消除⽂法中的左递归或提取左因⼦;(1)简单直接左递归的消除A →βA’A →Aα| β→A’ →αA’| ε(2)将⽂法G:A→αβ|αγ提取左因⼦。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

编译原理复习资料1、某操作系统下合法的文件名为:device:name.extension,其中第一部分(device:)和第三部分(.extension )可缺省,若device, name和extension都是字母串,长度不限,但至少为1,画出识别这种文件名的DFA。

用标记d表示任意字母。

d d图1接受文件名的DFA2、用两个不同最左推导来说明下面的文法是二义的。

S A S | bA S A | a答:句型aSAS的两个不同最左推导如下:S AS aS aAS aSASS AS SASASAS aSAS3、证明下面的文法S S A | AA a不是LL(1)文法,但是SLR(1)文法,并画出SLR(1)分析表。

答:该文法的第一个产生式表现出直接左递归,因此该文法不是LL(1)。

接受该文法的活前缀的DFA见下面右边;Follow( S) = {$},Follow( S) = {$, a},Follow( A)SLR(1)的。

5、下面是int i, j, k这样的类型声明的两种不同语法:T int | real TL L , id | id L如果用LL(1)分析方法,应该选择哪个文法?如果用某种简要说明理由。

答:对于LL(1)分析方法,两个文法都不合适,左边的文法是左递归的,右边文法有公共左因子。

修改右边文法来适应LL(1)分析的要求,相对来说比较容易一些,因为只要提公共左因子。

对于LR的各种分析方法,两个文法都适用,但是采用左边的文法更好一些。

用左边的文法时,分析器一边扫描一边归约,占用分析栈的空间较少。

而用右边的文法时,分析器要把所有的标识符都移进栈后才进行归约,因此使用较多的分析栈空间。

(结合语法制导的翻译,采用左边的文法还有好处:便于确定T的类型属性在栈中的位置。

) 6、在C语言中,3++和(id + id )++这样的表达式被编译时,编译器都会报告如下的错误:in valid lvalue in in creme nt说明左值不能为数值或表达式。

现有如下简化的C语言表达式文法: E E + E | (E ) | E ++ | id | num请写一个语法制导定义或翻译方案,检查++的运算对象是否合法。

答:给非终结符 E 一个综合属性v,其值可取lvalue或rvalue,分别表示E是左值标识符和右值表达式,那么语法制导定义如下(无输出则表示无错) :E id E.v := lvalueE num E.v := rvalueE E+T | TT num.num | num给出一个语法制导定义以确定每个子表达式的类型int/real 。

答:E E1+T { if ( E1.type=real or T.type=real )4、用SLR(1)文法能定义的语言集合、定义的语言集合之间有什么关系?答:用SLR⑴文法能定义的语言集合用LR(1)文法能定义的语言集合和用LALR(1)文法能用LALR(1)文法能定义的语言集合,用LALR⑴文法能定义的语言集合用LR(1)文法能定义的语言集合。

int | realid , L | idLR分析方法,选择哪个文法更好?E EE E i + E2 E ( E i ) E E i ++ E.v := rvalueE.v := E i.vif E i.v = rvalue then printf(E.v := rvaluein valid lvalue in in creme nt ”);7、then E.type=real else E.type=integer } E T { E.type = T.type;}T num .num {T.type = real;}T num {T.type = integer;}8、把下列 C 语言程序的可执行语句翻译为:main(){int i; int a[10];while (i<=10) a[i] = 0; }(a) 三地址代码(b) 后缀式答:(a) L0: if i<=10 goto L1goto L2L1: a[i]:=0goto L0L2:(b) 后缀式:i 10 <= a[i] 0 assign while9、试构造下面的程序的流图,并找出其中所有回边及循环。

read Px := 1 c := P * P if c < 100 goto L1 B := P * P x := x + 1 B := B + x write x halt L1: B:= 10x := x + 2 B := B + x write B if B < 100 goto L2 halt L2: x := x + 1goto L1答:程序的流图如下10、对本题中所示的流图,求出其各结点n 的控制结点集 D(n)、回边及循环(n o 为首结点) 答:各结点n 的控制结点集D(n)如下:D(n 0)= ={n o }D(n 1)= ={n 0, n 1}D(n 2)= ={n 0, n 1, n 2}D(n 3)= ={n 0, n 1, n 2, n 3} D(n 4)={n 0, n 1, n 2, n 4} D(n 5)= ={n 0, n 1, n 2, n 5}D(n 6)= ={n 0,n 1, n 2,n 5, n 6}D(n 7)={n 0, n 1, n 2, n 5, n 6, n 7}回边和循环:因为D(n 5) = {n o , n 1, n 2, n 5},且n 5 -> n 2,所以n 5 -> n 2为一条回边。

根据它 求出的循环 Li = {n 2, n 5, n 3, n 4}。

因为 D(n 6)= {n 0, n 1, n 2, n5, n 6},且 n 6 -> n 1,所以 n 6 -> n 1 为一条回边。

根据这条回边,求出的循环 L 2 = {n 6, n 1, n 5, n 3, n 4, n 2}。

11、考虑下面求矩阵 A B 成绩的程序片段:BEGINFOR i := 1 TO n DOFOR j := 1 TO n DOFOR k = 1 TO n DOc[i, j] := c[i, j] + A[i, k} * B[k, j]END (1)假定对数组A 、B 、C 采用静态存储分配,每个字占用 4个字节,存储器以字节为单位编址。

给出该程序的三地址代码序列。

(2) 构造该程序相应的流图。

(3) 删除流图中各基本块内的公共子表达式(4)指出流图中所有回边及其相应循环,并且进行循环优化。

答:(1)设数组元素按行存放,A、B C数组都是n*n的二维数组,各维的下界均为0,每个元素占一个字(4个字节),则数组元素(如A[i, j])的地址计算公式为:D(A[i, j]) = addr(A) + ((i - 0) * n + (j - 0)) * 4=addr(A) + 4 * ( i * n + j )该程序的三地址代码序列被划分成基本块后如下:(105) if k > 门ecrta 130Bp (130) J := J + 1(131)goto 103(3 )仅基本块B7中有公共子表达式,删除公共子表达式后基本块B7变换成:(106)鼻:二I 半n(107)T::二 J + J(108)T2 := addr (0(109)T t:= 4 + T”(110)T5:二T2[T t](111)T&:二几+ K(112)T r:二addr (A)(113)T e;= 4 * T6(114)T fi:二T?[t s] ill5) T, := K * n(116)Tg :二Tg + J(117)T lQ:二吕療r(B)(118)T?:二4 * T9(119)T lt - T®[TJ(120)T12:= T3加T n(121)T; T5十T12(122)T JTJ :二(123)K ;= K + 1(124)goto 105(4)根据(2)的程序流图,每个结点的控制结点集如下:D(B i) = { B i }D(B2) = { B 1, B2 }D(B3) = { B 1, B 2, B 3 }D(B4) = { B 1, B 2, B 3, B 4 }D(B5) = { B 1, B 2, B 3, B 4, B 5 }D(B6) = { B 1, B 2, B 3, B 4, B 5, B 6 }D(B7) = { B 1, B 2, B 3, B 4, B 5, B 6, B 7 } D(B8) = { B 1, B 2, B 3, B 4, B 5, B 6, B 8 } D(B9) = { B 1, B 2, B 3, B 4, B 9 }根据回边B7 -> B 6 ,循环L i为:L1 = { B 7, B 6 }根据回边B8 -> B 4 ,循环L2为:L2 = { B 8, B 6, B 7, B 5, B 4 }根据回边B9 -> B2, 循环:L3为:L3 = { B 9, B 4, B 5, B 6, B 7 , B 8, B 3, B 2 } 经循环优化后三地址代码序列变为Sy. 4(2)经理度削弱后的梳圈(3)删除归纳变量:变换循环控制条件,删除归纳变量 I 后的流图显示在图12、试求出如下四元式程序中的循环并进行循环优化 I := 1 read J, K L: A := K * I B := J * IC := A * B write C I := I + 1 if I < 100 goto Lhalt 答:把本题的三地址代码划分成基本块并画出其程序流图显示在图 9.4(1)中 其中有三个基本块B1, B2, B3,有一条回边 B2 -> B2,相应的循环是{B2}。

I 1Tead J, KE ;= J * [C - * 8WLL lU €I :二 I + 1i£ I < 各口丄口 Lhalt 国9. 4(1〕程序毓国 (1 )代码外提:由于循环中没有不变运算,故不做此项优化 (2)强度削弱: B2中A 和B都是 I 的归纳变量。

优化结果显示在图 9.4(2)中。

h 丹】t 9.4(3)中A 用静态分配存储单元,且下届为 0;/* 置初值*/4/* 第一个for 语句*/T 2[T 1] := true i := i + 1图9.4(3)删除归纳变量的程序流图 13、下面是应用筛法求 2到N 之间素数的程序: beginread N; for i := 2 to N do A[i] := true; /*置初值*/ 表幕乘*/ for i := 2 to N**0.5 do/*运算符**代T 2 := addr(A) T 1:= 2 * T 1 /* 数组A 的基地址*/the n/*i false/*j 可被i 除尽*/endif A[i]是一个素数*/for j := 2 * i to N by i doA[j]:=(1)试写出其四元式中间代码,假设对数组 (2 )作出流图并求出其中的循环; (3 )进行代码外提;(4)进行强度削弱和删除归纳变量;答:采用字节地址,两个字节作为一个机器字。

相关文档
最新文档