编译原理分知识点习题代码优化
编译原理复习题

编译原理复习题一、填空题1.编译程序的工作过程一般可以划分为词法分析,语法分析,语义分析,中间代码优化,代码优化等几个基本阶段。
2.若源程序是用高级语言编写的,目标程序是汇编程序或机器语言程序,则其翻译程序称为编译程序.3.编译方式与解释方式的根本区别在于是否生成目标代码.5.对编译程序而言,输入数据是源程序,输出结果是目标程序 .7.若源程序是用高级语言编写的,目标程序是机器语言程序或汇编程序,则其翻译程序称为编译程序。
8.一个典型的编译程序中,不仅包括词法分析、语法分析、中间代码生成、代码优化、目标代码生成等五个部分,还应包括表格管理和出错处理。
其中,词法分析器用于识别单词。
10.一个上下文无关文法所含四个组成部分是一组终结符号、一组非终结符号、一个开始符号、一组产生式。
12.产生式是用于定义语法成分的一种书写规则。
13.设G[S]是给定文法,则由文法G所定义的语言L(G)可描述为:L(G)={x|Sx,x∈VT*}。
14.设G是一个给定的文法,S是文法的开始符号,如果S*⇒x(其中x∈V*),则称x是文法的一个句型。
15.设G是一个给定的文法,S是文法的开始符号,如果S*⇒x(其中x∈V T*),则称x是文法的一个句子。
16.扫描器的任务是从源程序中识别出一个个单词符号。
17.语法分析最常用的两类方法是自顶向下和自底向上分析法。
18.语法分析的任务是识别给定的终结符串是否为给定文法的句子。
19.递归下降法不允许任一非终结符是直接左递归的。
20.自顶向下的语法分析方法的关键是如何选择候选式的问题。
21.递归下降分析法是自顶向下分析方法。
22.自顶向下的语法分析方法的基本思想是:从文法的开始符号开始,根据给定的输入串并按照文法的产生式一步一步的向下进行直接推导,试图推导出文法的句子,使之与给定的输入串匹配。
23.自底向上的语法分析方法的基本思想是:从给定的终结符串开始,根据文法的规则一步一步的向上进行直接归约,试图归约到文法的开始符号。
编译原理代码优化

(3) (+ R r t2 ) (4) (/ 6.28 t2 t3 ) (5) (= t3 _ A )
t4≡t1 t5≡t2 t6≡t3 B 没有引用! (9) (- R r t7 ) (10) (* t3 t7 t8 ) (11) (= t8 _ B )
※ 基本块内四元式的局部优化过程示例 优化的基本内容和方法:
※ 局部优化算法是以基本块为单位进行的,基本块 也是目标代码生成的基本单位。
【定义】基本块是程序中一段顺序执行的语 句序列,其中只有一个入口和一个出口。
基本块划分算法: 1.确定基本块的入口语句,它们是: (1) 程序的第一个语句或转向语句转移到的语句; (2) 紧跟在转向语句后面的语句。 2.确定基本块的出口语句,它们是: (1) 下一个入口语句的前导语句; (2) 转向语句(包括转向语句本身); (3) 停语句(包括停语句本身);
【开始】按结点编码顺序,依次读取每一结点 n1 信息: (1) 若 n1 为带有附加标记的叶结点: • 若 Ai 为非临时变量,则 生成: q1: Ai=B (i=1,2,…)
(2) 若 n1 为带有附加标记的非叶结点: ① 生成 q1: A=BC 或生成 q1: A=B ② 若Ai为非临时变量,则生成: q2: Ai=A (i=1,2,…) n1 B|A1,A2,… n1 A|A1,A2,… ni B|… nj C|… 以主标记 参加运算
删除 无用 赋值
常值 表达 式节 省
8.2.3 基于DAG的局部优化方法
(3) 若其它表达式 A = B C 或 A = B; ① 若在 n1 存在公共表达式: BC 或 B
n1 …
ni …B… nj …C…
则把A附加于n1上:
编译原理复习题有答案

编译原理复习题有答案编译原理复习题及答案一、选择题1. 编译器的主要功能是什么?A. 代码格式化B. 代码优化C. 将源代码转换为机器码D. 错误检测和修复答案:C2. 词法分析阶段的主要任务是什么?A. 语法分析B. 语义分析C. 识别源程序中的词法单元D. 代码生成答案:C3. 下列哪个不是编译原理中的常见数据结构?A. 栈B. 队列C. 哈希表D. 链表答案:D4. 语法分析通常采用哪种方法?A. 递归下降分析B. 动态规划C. 贪心算法D. 深度优先搜索答案:A5. 代码优化的目的是什么?A. 增加程序长度B. 减少程序运行时间C. 提高程序的可读性D. 增加程序的复杂性答案:B二、简答题1. 简述编译过程的主要阶段。
答案:编译过程主要分为四个阶段:词法分析、语法分析、语义分析和代码生成。
词法分析负责将源代码分解成词法单元;语法分析构建语法树,检查源代码的语法结构;语义分析检查程序的语义正确性;代码生成将源代码转换成目标代码或机器码。
2. 什么是自底向上的语法分析方法?答案:自底向上的语法分析方法是一种从叶子节点开始,逐步向上构建语法树的方法。
它通常使用移进-归约分析技术,通过将输入符号与栈顶符号进行匹配,不断地将它们归约成非终结符,直到整个输入被归约为起始符号。
3. 请解释什么是中间代码,并说明其作用。
答案:中间代码是一种介于源代码和目标代码之间的代码形式,通常用于代码优化和目标代码生成。
它具有高级语言的可读性,同时又能表达程序的控制流和数据流信息。
中间代码使得编译器可以在不同的阶段对程序进行优化,提高程序的执行效率。
三、论述题1. 论述编译原理中的错误处理机制。
答案:编译原理中的错误处理机制主要包括错误检测、错误恢复和错误报告。
错误检测是指在编译过程中识别出源代码中的语法或语义错误;错误恢复是指在检测到错误后,编译器采取的措施以继续编译过程,避免因单个错误而中断整个编译;错误报告则是向程序员提供错误信息,帮助其定位和修复错误。
编译原理课件 第八章 代码优化

计算机学院 辛明影
R=10; Pi=3.14
一个给定的程序,可以把 它划分为一系列的基本块
计算机学院
辛明影
删除无用赋值后
i=m-1 j=n t1=4*n v=a[t1]
B1
i=i+1 B2 t2=4*i t3=a[t2] if t3<v goto B2 j=j-1 B3 t4=4*j t5=a[t4] if t5<v goto B3 if i>=j goto B6 B4 B5 B6
a[t2]=t5 a[t4]=t3 goto B2
计算机学院 辛明影
中 间 代 码
① read x ② read y ③ r=x mod y ④ if r=0 goto ⑧ ⑤ x=y ⑥ y=r ⑦ goto ③ ⑧ write y ⑨ end
计算机学院
辛明影
入口语句: 入口语句: ① 、③、⑤、⑧ 基本块: 基本块: ①、②; ③、④;⑤、⑥、⑦; 、⑨; ⑧ 基本块内除可用: 基本块内除可用:删除公共子表达式 复写传播 删除无用赋值 还可用下面的变换: 还可用下面的变换:
2。临时变量改名 1。合并已知量 3。交换语句的位置 4。代数变换 代数变换
计算机学院 辛明影
二、程序流图 程序流图为一以基本块为结点的有向图; 含有程序中第一条语句的结点叫作首结点 含有程序中第一条语句的结点叫作首结点 程序流图构造方法: 程序流图构造方法: 条件或无条件语句从B1转到B2 B1转到 1。条件或无条件语句从B1转到B2 B2紧跟在B1后面 紧跟在B1后面( B1最后语句 2。B2紧跟在B1后面(且B1最后语句 不是无条件转移语句) 不是无条件转移语句) 此时称B2为 的后继 的后继, 为 的前驱 此时称 为B1的后继,B1为B2的前驱
编译原理课后第十一章答案

对假设(2) B:=3 D:=A+C E:=A*C F:=D+E K:=B*5 L:=K+F
计算机咨询网()陪着您
10
《编译原理》课后习题答案第十一章
第7题 分别对图 11.25 和 11.26 的流图: (1) 求出流图中各结点 n 的必经结点集 D(n)。 (2) 求出流图中的回边。 (3) 求出流图中的循环。
(1) (2) (3) (4) (5) (6) (7) (8) (9) (10) (11) (12) (13)
i:=m-1 j:=n t1:=4*n v:=a[t1] i:=i+1 t2:=4*i t3:=a[t2] if t3< v goto (5) j:=j-1 t5:=4*j t5:=a[t4] if t5> v goto (9) if i >=编译原理》课后习题答案第十一章
第 5 题: 如下程序流图(图 11.24)中,B3 中的 i∶=2 是循环不变量,可以将其提到前置结点吗? 你还能举出一些例子说明循环不变量外移的条件吗?
图 11.24 答案: 不能。因为 B3 不是循环出口 B4 的必经结点。 循环不变量外移的条件外有: (a)(I)s 所在的结点是 L 的所有出口结点的必经结点 (II)A 在 L 中其他地方未再定值 (III)L 中所有 A 的引用点只有 s 中 A 的定值才能到达 (b)A 在离开 L 之后不再是活跃的,并且条件(a)的(II)和(III)成立。所谓 A 在离开 L 后不再是活跃的是指,A 在 L 的任何出口结点的后继结点的入口处不是活跃的(从此点后 不被引用) (3)按步骤(1)所找出的不变运算的顺序,依次把符合(2)的条件(a)或(b)的 不变运算 s 外提到 L 的前置结点中。如果 s 的运算对象(B 或 C)是在 L 中定值的,则只有 当这些定值四元式都已外提到前置结点中时,才可把 s 也外提到前置结点。
编译原理一些习题答案

编译原理⼀些习题答案第2章形式语⾔基础2.2 设有⽂法G[N]: N -> D | NDD -> 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9(1)G[N]定义的语⾔是什么?(2)给出句⼦0123和268的最左推导和最右推导。
解答:(1)L(G[N])={(0|1|2|3|4|5|6|7|8|9)+} 或L(G[N])={α| α为可带前导0的正整数}(2)0123的最左推导:N ? ND ? NDD ? NDDD ? DDDD ? 0DDD ? 01DD ? 012D ? 0123 0123的最右推导:N ? ND ? N3 ? ND3 N23 ND23 N123 D123 0123268的最左推导:N ? ND ? NDD ? DDD ? 2DDD ? 26D ? 268268的最右推导:N ? ND ? N8 ? ND8 ? N68 ? D68 ? 2682.4 写⼀个⽂法,使其语⾔是奇数的集合,且每个奇数不以0开头。
解答:⾸先分析题意,本题是希望构造⼀个⽂法,由它产⽣的句⼦是奇数,并且不以0开头,也就是说它的每个句⼦都是以1、3、5、7、9中的某个数结尾。
如果数字只有⼀位,则1、3、5、7、9就满⾜要求,如果有多位,则要求第1位不能是0,⽽中间有多少位,每位是什么数字(必须是数字)则没什么要求,因此,我们可以把这个⽂法分3部分来完成。
分别⽤3个⾮终结符来产⽣句⼦的第1位、中间部分和最后⼀位。
引⼊⼏个⾮终结符,其中,⼀个⽤作产⽣句⼦的开头,可以是1-9之间的数,不包括0,⼀个⽤来产⽣句⼦的结尾,为奇数,另⼀个则⽤来产⽣以⾮0整数开头后⾯跟任意多个数字的数字串,进⾏分解之后,这个⽂法就很好写了。
N -> 1 | 3 | 5 | 7 | 9 | BNB -> 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | B02.7 下⾯⽂法⽣成的语⾔是什么?G1:S->ABA->aA| εB->bc|bBc G2:S->aA|a A->aS解答:B ? bcB ? bBc? bbccB ? bBc? bbBcc ? bbbccc……A ?εA ? aA ? aA ? aA ? aaA ? aa……∴S ? AB ? a m b n c n , 其中m≥0,n≥1即L(G1)={ a m b n c n | m≥0,n≥1} S ? a S ? aA ? aaS ? aaaS ? aA ? aaS ? aaaA ?aaaaS ? aaaaa ……∴S ? a2n+1 , 其中n≥0即L(G2)={ a2n+1 | n≥0}2.11 已知⽂法G[S]: S->(AS)|(b)A->(SaA)|(a)请找出符号串(a)和(A((SaA)(b)))的短语、简单短语和句柄。
编译原理练习题4答案

编译原理练习题4一、选择题1. 在编译过程中,词法分析器的任务是将()转换为单词符号。
A. 源程序B. 字符串C. 字符D. 代码A. 词法分析B. 语法分析C. 代码D. 程序调试3. 形式语言中的文法G[S]:S→aSb | ab,该文法产生的语言是()。
A. {a^n b^n | n≥0}B. {a^n b^n+1 | n≥0}C. {a^n b^n |n≥1} D. {a^n b^n1 | n≥1}A. 构造语法分析树B. 检查语法错误C. 中间代码D. 识别单词符号二、填空题1. 编译过程一般可以分为五个阶段,分别是______、______、______、______和______。
2. 在编译原理中,______分析是编译过程的第一个阶段,其任务是从源程序中识别出一个个单词符号。
3. 若文法G[S]:S→AB,A→a,B→b,则该文法的开始符号是______。
4. 在语法分析中,LL(1)分析法是一种______分析方法。
三、判断题1. 编译器的主要功能是将源程序翻译成目标程序。
()2. 词法分析器不会删除无用的空白字符和注释。
()3. 语法分析器负责检查源程序中的语法错误。
()4. 任何程序设计语言都可以通过编译器转换为机器语言。
()四、简答题1. 简述编译器的基本任务。
2. 什么是上下文无关文法?请举例说明。
3. 请简要介绍自顶向下分析和自底向上分析的区别。
4. 什么是LR分析法?它有什么优点?五、算法题2. 给定文法G[S]:S→AB,A→a,B→b,请使用递归下降分析法编写一个语法分析器。
x = y + z w;六、综合题(a, (a, a))(a, a, a)abababba4. 请描述如何使用 yacc 工具一个编译器的语法分析器部分。
七、代码阅读题int factorial(int n) {if (n == 0)return 1;elsereturn n factorial(n 1);}def print_numbers(n):if n == 0:returnprint_numbers(n 1)print(n)print_numbers(5)public static void swap(int arr, int i, int j) { int temp = arr[i];arr[i] = arr[j];arr[j] = temp;}function findMax(arr) {let max = arr[0];for (let i = 1; i < arr.length; i++) {if (arr[i] > max) {max = arr[i];}}return max;}八、设计题G[S]:S→E,E→E + T | T,T→T F | F,F→(E) | id a = b + c d e / f;x = 3y = x + 4z = y 2MOV R1, 3ADD R2, R1, 4MUL R3, R2, 2答案一、选择题1. C2. D3. A4. D二、填空题1. 词法分析、语法分析、语义分析、中间代码、代码优化2. 词法3. S4. 自顶向下三、判断题1. √2. ×3. √4. ×四、简答题1. 编译器的基本任务包括:词法分析、语法分析、语义分析、中间代码、代码优化和目标代码。
编译原理习题及答案(整理后)

第一章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.等价变换规则二、多项选择题1、编译程序各阶段的工作都涉及到。
a.语法分析b.表格管理c.出错处理d.语义分析e.词法分析2、编译程序工作时,通常有阶段。
a.词法分析b.语法分析c.中间代码生成d.语义检查e.目标代码生成三、填空题1、解释程序和编译程序的区别在于。
2、编译过程通常可分为5个阶段,分别是、语法分析、代码优化和目标代码生成。
3、编译程序工作过程中,第一段输入是,最后阶段的输出为程序。
4、编译程序是指将程序翻译成程序的程序。
单选解答1、将编译程序分成若干个“遍”是为了使编译程序的结构更加清晰,故选b。
2、构造编译程序应掌握源程序、目标语言及编译方法等三方面的知识,故选d。
3、对编译而言,变量既持有左值又持有右值,故选c。
4、编译程序打交道最多的就是各种表格,因此选d。
5、目标代码包括汇编指令代码、可重定位指令代码和绝对指令代码3种,因此不是目标代码的只能选d。
编译原理 第5章--代码优化

(2) 确定满足以下条件的出口语句: 确定满足以下条件的出口语句 出口语句: 下一个入口语句的前导语句 入口语句的前导语句; ① 下一个入口语句的前导语句; 转移语句 包括转移语句自身); 语句(包括转移语句自身 ② 转移语句 包括转移语句自身 ; 停语句 包括停语句自身 包括停语句自身)。 ③ 停语句(包括停语句自身 。
第5章
代码优化
(3) 图中各个结点上可能附加一个或多个标识符,表示这些 图中各个结点上可能附加一个或多个标识符 附加一个或多个标识符, 变量具有该结点所代表的值。 变量具有该结点所代表的值。
一个基本块由一个四元式 序列组成 四元式都可以用相应的 一个 基本块由一个四元式序列 组成 , 且 每一个 四元式都可以用 相应的 基本块 由一个四元式序列组成, 每一个四元式都可以用 DAG结点表示。 结点表示。 结点表示 给出了不同四元式和与其对应的DAG结点形式。图中,各结点圆圈 结点形式。 图5–1给出了不同四元式和与其对应的 给出了不同四元式和与其对应的 结点形式 图中, 中的ni是构造 构造DAG过程中各结点的编号, 过程中各结点的编号, 中的 过程中各结点的编号 而各结点下面的符号(运算符、标识符或常数)是各结点的标记, 是各结点的标记 而各结点下面的符号 运算符、标识符或常数 是各结点的标记,各结点右 运算符 边的标识符是结点上的附加标识符。 边的标识符是结点上的附加标识符。 附加标识符 除了对应转移语句的结点右边可附加一语句位置来指示转移目标外, 除了对应转移语句的结点右边可附加一语句位置来指示转移目标外,其余 对应转移语句的结点右边可附加一语句位置来指示转移目标外 各类结点的右边只允许附加标识符。 各类结点的右边只允许附加标识符。 除对应于数组元素赋值的结点 标记为 继外, 除对应于数组元素赋值的结点(标记为 ]=)有三个后继外,其余结点最多只 应于数组元素赋值的结点 标记为[ 有三个后继外 有两个后继。 两个后继。 后继
编译原理-清华大学-第10章1-代码优化

(1)P:=0 (2)I:=0 (4)T2:=addr(A) (7)T5:=addr(B) (3)T1:=0
(5)T3:=T2[T1] (6)T4:=T1 (8)T6:=T5[T4] (9)T7:=T3*T6 (10)P:=P+T7 (11)I:=I+1 (3‘)T1:=T1+4 (12)if I<=20 goto(5)
2、代码外提
目的:减少循环中代码总数。 方法:把循环不变运算,即其结果独立
于循环执行次数的表达式提到循环的前 面,使之只在循环外计算一次。
(1)P:=0 (2)I:=0
(3)T1:=4*I (4)T2:=addr(A) (5)T3:=T2[T1] (6)T4:=T1 (7)T5:=addr(B) (8)T6:=T5[T4] (9)T7:=T3*T6 (10)P:=P+T7 (11)I:=I+1 (12)if I&l经过变换循环的控制条件后,有些变 量不被引用,可以从循环中删除。
(1)P:=0 (2)I:=0 (4)T2:=addr(A) (7)T5:=addr(B) (3)T1:=4*I
(5)T3:=T2[T1] (6)T4:=T1 (8)T6:=T5[T4] (9)T7:=T3*T6 (10)P:=P+T7 (11)I:=I+1 (3’)T1:=T1+4 (12)if I<=20
2)在运行基本块时,只能从其入口进入, 从出口退出。
2、划分基本块算法
(1)求出各基本块的入口语句 1)程序的第一个语句 ; 2)能由条件转移语句和无条件转移语句转
移到达的语句; 3)紧跟在条件转移语句后面的语句。
(2) 对以上求出的每个入口语句,确定其所 属的基本块。它是由该入口语句到下一入 口语句(不包括该入口语句) 之间的语句序 列组成的。
编译原理练习题及答案

第一章练习题(绪论)一、选择题1.编译程序是一种常用的软件。
A) 应用B) 系统C) 实时系统D) 分布式系统2.编译程序生成的目标代码程序是可执行程序。
A) 一定B) 不一定3.编译程序的大多数时间是花在上。
A) 词法分析B) 语法分析C) 出错处理D) 表格管理4.将编译程序分成若干“遍”将。
A)提高编译程序的执行效率;B)使编译程序的结构更加清晰,提高目标程序质量;C)充分利用内存空间,提高机器的执行效率。
5.编译程序各个阶段都涉及到的工作有。
A) 词法分析B) 语法分析C) 语义分析D) 表格管理6.词法分析的主要功能是。
A) 识别字符串B) 识别语句C) 识别单词D) 识别标识符7.若某程序设计语言允许标识符先使用后说明,则其编译程序就必须。
A) 多遍扫描B) 一遍扫描8.编译方式与解释方式的根本区别在于。
A) 执行速度的快慢B) 是否生成目标代码C) 是否语义分析9.多遍编译与一遍编译的主要区别在于。
A)多遍编译是编译的五大部分重复多遍执行,而一遍编译是五大部分只执行一遍;B)一遍编译是对源程序分析一遍就立即执行,而多遍编译是对源程序重复多遍分析再执行;C)多遍编译要生成目标代码才执行,而一遍编译不生成目标代码直接分析执行;D)多遍编译是五大部分依次独立完成,一遍编译是五大部分交叉调用执行完成。
10.编译程序分成“前端”和“后端”的好处是A)便于移植B)便于功能的扩充C)便于减少工作量D)以上均正确第二章练习题(文法与语言)一、选择题1.文法 G 产生的 (1) 的全体是该文法描述的语言。
A.句型B. 终结符集C. 非终结符集D. 句子2.若文法 G 定义的语言是无限集,则文法必然是 (2) A递归的 B 上下文无关的 C 二义性的 D 无二义性的3. Chomsky 定义的四种形式语言文法中, 0 型文法又称为(A)文法;1 型文法又称为(C)文法;2 型语言可由(G) 识别。
A 短语结构文法B 上下文无关文法C 上下文有关文法D 正规文法E 图灵机F 有限自动机G 下推自动机4.一个文法所描述的语言是(A);描述一个语言的文法是(B)。
编译原理代码优化

ቤተ መጻሕፍቲ ባይዱ
*
*
中南大学软件学院 陈志刚
*
*
中南大学软件学院 陈志刚
*
*
中南大学软件学院 陈志刚
*
控制流程图
(流图):具有唯一首结点的有向图
G=
(
N
,
E
,
n
0
)
N
:结点集
基本块集
E
:有向边集
n
0
:首结点
包含程序第一个
op
n1
B
2
型
: A:=B op C(op, B, C
,A)
n3 A
op
n1
n2
B
C
n1
n2
n1
n3
n1
n2
*
中南大学软件学院 陈志刚
*
*
*
中南大学软件学院 陈志刚
*
!
添加标题
变换循环控制条件:目的是删除那些纯粹为控制循环而设立的语句,因此又称删除归纳变量。
!
添加标题
合并已知量:对于那些编译时便可静态确定的运算结果事先运算出来,不必等到运行程序时再执行。
!
添加标题
复写传播:某些变量的值并未被改变,便赋给其他变量,则可直接引用原值本身。
*
(1)P:=0 (2)I:=1 (4)T2:=addr(A)-4 (7)T5:=addr(B)-4 (5)T3:=T2[T1] (6)T4:=T1 (8)T6:=T5[T4] (9)T7:=T3*T6 (10)P:=P+T7 (11)I:=I+1 (12)if I<=20 goto(5)
*
优化技术简介 删除多余运算 循环不变代码外提 强度削弱 变换循环控制条件 合并已知量与复写传播 删除无用赋值 例: P:=0 for I:=1 to 20 do P:=P+A[I]*B[I]
编译原理-第十章--代码优化精选全文完整版

可编辑修改精选全文完整版第十章代码优化某些编译程序在中间代码或目标代码生成之后要对生成的代码进行优化。
所谓优化,实质上是对代码进行等价变换,使得变换后的代码运行结果与变换前代码运行结果相同,而运行速度加大或占用存储空间少,或两者都有。
优化可在编译的不同阶段进行,对同一阶段,涉及的程序范围也不同,在同一范围内,可进行多种优化。
一般,优化工作阶段可在中间代码生成之后和(或)目标代码生成之后进行。
中间代码的优化是对中间代码进行等价变换。
目标代码的优化是在目标代码生成之后进行的,因为生成的目标代码对应于具体的计算机,因此,这一类优化在很大程度上依赖于具体的机器,我们不做详细讨论。
另外依据优化所涉及的程序范围,又可分为局部优化、循环优化和全局优化三个不同的级别。
局部优化指的是在只有一个入口、一个出口的基本程序块上进行的优化。
循环优化对循环中的代码进行的优化。
全局优化是在整个程序范围内进行的优化。
本章重点:局部优化基本块的DAG表示第一节优化技术简介为了说明问题,我们来看下面这个例子,源程序是:P :=0For I :=1 to 20 doP :=P+A[I]*B[I];经过编译得到的中间代码如图10-1-1所示,这个程序段由B1和B2两个部分组成,B2是一个循环,假定机器按字节编址。
那么,对于这个中间代码段,可进行如下这些优化。
1、删除多余运算(删除公共子表达式)优化的目的在于使目标代码执行速度较快。
图10-1-1中间代码(3)和(6)中都有4*I的运算,而从(3)到(6)没有对I赋值,显然,两次计算机的值是相等的。
所以,(6)的运算是多余的。
我们可以把(6)变换成:T4 :=T1。
这种优化称为删除多余运算或称为删除公共子表达式。
2、代码外提减少循环中代码总数的一个重要办法是代码外提。
这种变换把循环不变运算,即其结果独立于循环执行次数的表达式,提到循环的前面。
使之只在循环外计算一次,上例中,我们可以把(4)和(7)提到循环外。
编译原理课后答案第五章代码优化

第五章 代码优化
A= 0 I= 1
B1
B= J+ 1 B′2
L1: C= B+ I
B2
A= C+ A
if I= 100 g2oto L
第五章 代码优化
所以d必有通路到达M中任一结点ni,而M中任一结 点又可以通过n到达d(n→d为回边),从而M中任意两个 结点之间必有一通路,L中任意两个结点之间亦必有一 通路。此外,由M中结点性质可知:d到M中任一结点ni 的通路上所有结点都应属于M,ni到n的通路上所有结 点也都属于M。因此,L中任意两结点间通路上所有结 点都属于L,也即,L是强连通的。
L1: E= B*B
B3
F= F+ 2
E= E+ F
write(E)
if E> 100 g2oto L
halt B4 L2: F= F- B15 goto1 L
图5-1 程序流图
第五章 代码优化
5.4 基本块的DAG如图5-2所示。若: (1) b在该基本块出口处不活跃; (2) b在该基本块出口处活跃; 请分别给出下列代码经过优化之后的代码: (1) a=b+c (2) b=a-d (3) c=b+c (4) d=a-d
if I= 100 g2oto L
F
T
I= I+ 1 B3 goto 1L
L2: write AB4 halt
图5-5 习题5.8的程序流图
第五章 代码优化
(2) 很容易看出,B3→B2是流图中的一条有向边, 并且有B2 DOM B3,故B3→B2为流图中的一条回边。循 环可通过回边求得,即找出由结点B2、结点B3以及有通 路到达B3但不经过B2的所有结点。所以,由回边组成的 B3→B2循环是{ B2,B3}。
编译原理习题

编译原理复习资料一、填空题.1.编译程序是一种程序,能够将某一种高级语言编写的源程序改造成另一种低级语言编写的目标程序,它们在逻辑上_等价__,完成_相同__的工作。
2.如果一个文法存在某个句子对应两棵不同的语法树,则称这个文法是___二义性的____。
3.词法分析程序的功能是从左到右扫描源程序字符串,根据语言的词法规则识别出各类单词符号,并以___单词符号或单词符号表示的源程序_____的形式输出。
4.编译程序一般划分为词法分析、语法分析、语义分析、中间代码生成、和_代码优化_目标代码生成六个阶段;除此以外,还有两个重要的基本工作,它们是_表格管理_和_出错处理_。
5.目前,语法分析方法有两大类,分别为自上向下的分析方法和__自下而上__分析方法。
自上而下的分析方法是从____文法的开始符号_____出发,根据文法规则正向推导出给定句子的方法。
6.属性文法是编译技术中用来说明程序设计语言的__语义___的工具。
7.若源程序是用高级语言编写的,_____目标程序 ____是机器语言程序或汇编程序,则其翻译程序称为__编译程序____。
8.扫描器(程序)的任务是从____字符串____中识别出一个个___单词符号___。
9.一个LR分析器包括三部分:总控程序、_分析表___和分析栈。
10.自顶向下的语法分析方法的基本思想是:从文法的___开始符号_____出发,根据给定的输入串并按照文法的产生式一步一步的向下进行____正向推导___,试图推导出文法的__给力句子__,使之与给定的输入串匹配。
11.按Chomsky分类法,文法被分成__4(0~3型文法)_类。
12.局部优化是在__基本块__范围内进行的一种优化。
13.编译程序是一种_翻译_程序,它将某一种高级语言编写的源程序改造成另一种低级语言编写的目标程序,源程序和目标程序在逻辑上等价,完成相同的工作。
14.编译程序与解释程序的根本区别为___解释程序在执行中不产生目标程序___。
编译原理第6章代码优化

合并已知量 删除公共子表达式(删除多余的运算)
删除无用赋值
第6部分 代码优化
循环优化
是指对循环中的代码进行优化。
循环优化包括:
代码外提 删除归纳变量 强度削弱
第6部分 代码优化
全局优化
是在整个程序范围内进行的优化, 需 进行数据流分析, 花费代价很高。
第6部分 代码优化
第6部分 代码优化
6.1.2 基本块的DAG表示
DAG(Directed Acyclic Graph)是一种有向图,
常常用来对基本块进行优化。 一个基本块的DAG是一种其结点带有下述标记 或附加信息的DAG:
第6部分 代码优化
(1) 图的叶结点(无后继的结点)以一标识符(变量名)或 常数作为标记,表示该结点代表该变量或常数的值。 如果叶结点用来表示一变量A的地址,则用addr(A) 作为该结点的标记。通常把叶结点上作为标记的标 识符加上下标0,以表示它是该变量的初值。 (2) 图的内部结点(有后继的结点)以一运算符作为标记, 表示该结点代表应用该运算符对其直接后继结点所 代表的值进行运算的结果。 (3) 图中各个结点上可能附加一个或多个标识符,表 示这些变量具有该结点所代表的值。 一个基本块由一个四元式序列组成,且每一个 四元式都可以用相应的DAG结点表示。
(1) G中四元式(2)和(6)都是已知量和已知量的 运算,G'已合并;
(2) G中四元式(5)是一种无用赋值,G'已将它 删除; (3) G中四元式(3)和(7)的R+r是公共子表达 式, G'只对它们计算了一次,即删除了多余的R+r 运算。 因此,G‘是对G实现上述三种优化的结果。
第6部分 代码优化
第6部分 代码优化
编译原理分知识点习题 代码优化

1.与机器有关的代码优化有那些种类,请分别举例说明。
解答:与机器有关的优化有:寄存器优化,多处理优化,特殊的指令优化,无用的指令消除等四类。
冗余指令删除假设源程序指令序列a:=b+c; c:=a-d;编译程序为其生成的代码很可能是下列指令序列:MOV b, R0ADD c, R0MOV R0,aSUB d, R0MOV R0,c假如第四条指令没有标号,上述两个赋值语句在一个基本块内,则第四条指令是多余的,可删除。
特殊指令的使用例如,如果目标机器指令系统包含增1指令INC,对于i:=i+1的目标代码MOV i, R0ADD #1, R0MOV R0, i便可被代之以1条指令Inc i说明:优化的特点是每个改进可能会引发新的改进机会,为了得到最好的改进,一般可能需要对目标代码重复扫描进行优化。
2.设有语句序列a:=20b:=a*(a+10);c:=a*b;试写出合并常量后的三元式序列。
解答:该语句序列对应的三元式序列为:(1)(:=, 20,a)(2)(+, a, 10)(3)(*, a, (2) )(4)(:=, a, b)(5)(* a, b)(6)(:=, (5), c)合并常量后的三元式序列为:(1)(:=, 20,a)(2)(:=, 600, b)(3)(:=, 12000, c)3、试写出算术表达式a+b*c-(c*b+a-e)/(b*c+d)优化后的四元式序列。
解答:该表达式的四元式序列为:(1)(*,b,c,T1)(2)(+,a,T1,T2)(3)(*,c,b,T3)(4)(+,T3,a,T4)(5)(-,T4,e,T5)(6)(*,b,c,T6)(7)(+,T6,d,T7)(8)(/,T5,T7,T8)(9)(-,T2,T8,T9)可对该表达式进行删除公共子表达式的优化。
优化后的四元式序列为:(1)(*,b,c,T1)(2)(+,a,T1,T2)(3)(-,T2,e,T5)(4)(+,T1,d,T7)(5)(/,T5,T7,T8)(6)(-,T2,T8,T9)4.设有算术表示式(a*b+c)/(a*b-c)+(c*b+a-d)/(a*b+c)试给出其优化后的三元式序列。
最新编译原理-第1-5章习题课答案精品课件

编译原理
chapter2
chapter1~5习题
1.写出C语言(yǔyán)和Java语言(yǔyán)的输入字母表。
C语言:0~9数字,大小写英文字母,键盘上可见(kějiàn)的字符
Java语言:Unicode可以包括(bāokuò)的所有字符。
6.文法G6为:
N →D|ND
Π:{2,3,a4,5} {0b,1}
b
{2,3,4,50}a={0,1,3,25} b 3 a
分属两区,所以(suǒyǐ)分a为{2,4} {3,5}
{0,1}a={1} {0,1}b={2,4}
所以(suǒyǐ) 0,1等价
{2,4}a={0,1} {2,4}b={3,5}
所以2,4等价
ri0ri1...ri9 P(0,1,2...,9)
(6)最多有一個重複出現的數字的數字符號串的全體
∑i ∑ri0ri1...ri9 i (0,1,2...,9) ri0ri1...ri9 P(0,1,2...,9)
(7)不包含字串abb的由a和b組成的符號串的全體 b*(a*|(ba)*)*
第十九页,共75页。
①.状态(zhuàngtài)转换图
a
1(0|1)*101
g
chapter1~5习题
a
1
(0|1)* b
d 101 g
0
1
ε
ε
a
b
c
1
1
d
0 e
f
1
g
第十二页,共75页。
编译原理
②.状态转换(zhuǎnhuàn)矩阵
a 1
b
ε
0 c
ε
1
编译原理 代码优化

B6 t11 := 4 * i x := a[t11] t13 := 4 * n t14 := a[t13]
a[t11] := t14 a[t13] := x
•优化举例
公共子表达式删除-基本块间
t2:=4 * i : B2 -- B5
t4:= 4 * j : B3 -- B5
B5 t6 := 4 * i x := a[t6] t8 := 4 * j t9 := a[t8] a[t6] := t9 a[t8] := x goto B2
•优化举例
快速排序程序片段如下, i = m 1; j = n; v = a[n]; while (1) { do i = i +1; while(a[i]<v);
do j =j 1;while (a[j]>v); if (i >= j) break;
x=a[i]; a[i]=a[j]; a[j]=x; }
- 代码外提 - 归纳变量删除 - 强度削弱
例:while (i <= limit 2 ) …
变换成 t = limit 2; //为什么提出循环? while (i <= t ) …
•优化举例
强度削弱和归纳变量删除
j和t4的值步伐一致地变化 这样的变量叫做归纳变量
在循环中有多个归纳变量时, 也许只需要留下一个 这个操作由归纳变量删除 过程来完成
do j =j 1;while (a[j]>v); if (i >= j) break;
x=a[i]; a[i]=a[j]; a[j]=x; }
x=a[i]; a[i]=a[n]; a[n]=x;
//B4 (13) if i >= j goto (23)
编译原理习题(含解答)_

5. 写出表达式(a+b*c)/(a+b)-d的逆波兰表示和三元式序列。 解:逆波兰表示: abc*+ab+/d- 三元式序列: ① (*,b,c) ② (+,a,①) ③ (+,a,b) ④ (/,②,③) ⑤ (-,④,d) 五、计算题(10分) 1.构造下述文法 G[S] 的自动机: S->A0 A->A0|S1|0 该自动机是确定的吗?若不确定,则对它确定化。 解:由于该文法的产生式S->A0,A->A0|S1中没有字符集VT的输入,所 以不是确定的自动机。 要将其他确定化,必须先用代入法得到它对应 的正规式。把S->A0代入产生式A->S1有: A=A0|A01|0=A(0|01)|0=0(0|01)*。 代入S->A0有该文法的正规式: * 0(0|01) 0,所以, 改写该文法为确定的自动机为:
由于状态A有3次输入0的重复输入,所以上图只是NFA,下可知DFA为: 1 0 0 C B A 0
综合练习二
一、选择题(请在前括号内选择最确切的一项作为答案划一个勾,多划 按错论)(每个4分,共40分) 1.通常一个编译程序中,不仅包含词法分析,语法分析,中间代码生 成,代码优化,目标代码生成等五个部分,还应包括_ C_ __。 A.模拟执行器 B.解释器 C.表格处理和出错处理 D.符号执行器 2.文法 G[N]=({b},{N,B},N ,{N→b│bB,B→bN}),该文法所 描述的语言是_ C_ __。 A.L(G[N])={bi│i≥0} B.L(G[N])={b2i│i≥0} C.L(G[N])={b2i+1│i≥0} D.L(G[N])={b2i+1│i≥1} 3.一个句型中的最左_ _B_ __称为该句型的句柄。 A.短语 B.简单短语 C.素短语 D. 终结符号 4.设 G 是一个给定的文法,S是文法的开始符号,如果 S->x( 其中 x∈V*), 则称 x 是文法 G 的一个__ B ___。 A.候选式 B.句型 C.单词 D.产生式 5.文法 G[E] : E→T∣E + T T→F∣T ﹡ F F→a∣ ( E ) 该文法句型 E + F ﹡ (E + T) 的简单短语是下列符号串中的__ B ___。 ① (E + T) ②E + T ③F ④ F ﹡ (E + T) A.① 和 ③ B.② 和 ③ C.③ 和 ④ D.( ) ③ 6.若一个文法是递归的,则它所产生的语言的句子__ A ___。 A.是无穷多个 B.是有穷多个 C.是可枚举的 D.个数是常量 7.词法分析器用于识别_ C____。 A.句子 B.句型 C.单词
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1.与机器有关的代码优化有那些种类,请分别举例说明。
解答:与机器有关的优化有:寄存器优化,多处理优化,特殊的指令优化,无用的指令消除等四类。
冗余指令删除假设源程序指令序列a:=b+c; c:=a-d;编译程序为其生成的代码很可能是下列指令序列:MOV b, R0ADD c, R0MOV R0,aSUB d, R0MOV R0,c假如第四条指令没有标号,上述两个赋值语句在一个基本块内,则第四条指令是多余的,可删除。
特殊指令的使用例如,如果目标机器指令系统包含增1指令INC,对于i:=i+1的目标代码MOV i, R0ADD #1, R0MOV R0, i便可被代之以1条指令Inc i说明:优化的特点是每个改进可能会引发新的改进机会,为了得到最好的改进,一般可能需要对目标代码重复扫描进行优化。
2.设有语句序列a:=20b:=a*(a+10);c:=a*b;试写出合并常量后的三元式序列。
解答:该语句序列对应的三元式序列为:(1)(:=, 20,a)(2)(+, a, 10)(3)(*, a, (2) )(4)(:=, a, b)(5)(* a, b)(6)(:=, (5), c)合并常量后的三元式序列为:(1)(:=, 20,a)(2)(:=, 600, b)(3)(:=, 12000, c)3、试写出算术表达式a+b*c-(c*b+a-e)/(b*c+d)优化后的四元式序列。
解答:该表达式的四元式序列为:(1)(*,b,c,T1)(2)(+,a,T1,T2)(3)(*,c,b,T3)(4)(+,T3,a,T4)(5)(-,T4,e,T5)(6)(*,b,c,T6)(7)(+,T6,d,T7)(8)(/,T5,T7,T8)(9)(-,T2,T8,T9)可对该表达式进行删除公共子表达式的优化。
优化后的四元式序列为:(1)(*,b,c,T1)(2)(+,a,T1,T2)(3)(-,T2,e,T5)(4)(+,T1,d,T7)(5)(/,T5,T7,T8)(6)(-,T2,T8,T9)4.设有算术表示式(a*b+c)/(a*b-c)+(c*b+a-d)/(a*b+c)试给出其优化后的三元式序列。
解答:该算术表达式的三元序列为:(1)(*,a,b)(2)(+,(1),c)(3)(*,a,b)(4)(-,(3),c)(5)(/,(2),(4))(6)(*,c,b)(7)(+,(6),a)(8)(-,(7),d)(9)(*,a,b)(10)(+,(9),c)(11)(/,(8),(10))(12)(+,(5),(11))可对其进行删除公共子表达式的优化。
优化后的三元式列为:(1)(*,a,b)(2) (+,(1),c)(3) (-,(1),c)(4) (/,(2),(3))(5) (*, c, b)(6) (+,(5),a)(7) (-,(6),d)(8) (/,(7),(2))(9) (+,(4),(8))5.试对以下基本块B1和B2应用DAG进行优化B1: A:=B*CD:=B/CE:=A+DF:=E*2G:=B*CH:=G*GF:=H*GL:=FM:=LB2: B:=3D:=A+CE:=A*CF:=D+EG:=B*FH:=A+CI:=A*CJ:=H+IK:=B*5L:=K+JM:=L并就以下两种情况分别写出优化后的四元式序列:(1)假设G、L、M在基本块后面要被引用;(2)假设只有L在基本块后面要被引用。
解答:一般应用DAG在一个基本块内可以进行三种优化:合并常量、删除无用赋值以及多余运算。
对于基本块B,其DAG如图7.1所示。
1(1) 若只有G、L、M在基本块后面要被引用G:=B*C 或 G:=B*CH:=G*G S:=G*GL:=H*G L:=S*GM:=L M:=L (S为临时变量)(2)若只有L在基本块后面要被引用G:=B*C 或 S1:=B*CH:=G*G S2:=S1*S1L:=H*G L:=S2*S1 (S1、S2为临时变量)对于基本块B2,其DAG如图7.2所示。
3 A C 15图7.2 基本块B2的DAG图优化后的四元式序列如下:(1) 若只有G、L、M在基本块后面要被引用D:=A+CE:=A*CF:=D+EG:=3*FL:=F+15M:=L(2) 若只有L在基本块后面要被引用D:=A+C 或 S1:=A+CE:=A*C S2:=A*CF:=D+E S3:=S1+S2L:=F+15 L:=S3+15(S1、S2、S3为临时变量) 6. 对于基本块PS0:=2S1:=3/S0S2:=T-CS3:=T+CR:=S0/S3H:=RS4:=3/S1S5:=T+CS 6:=S 4/S 5H:=S 6*S 2(1)试应用DAG 进行优化。
(2)假定只有R 、H 在基本块出口是活跃的,试写出优化后的四元式序列。
(3)假定只有两个寄存器R 0、R 1试写出上述优化后的四元式序列的目标代码。
解答22 1.5 T C图7.3基本块P 的DAG 图优化后的四元式序列为:S 0:=2S 4:=2S 1:=1.5S 2:=T-CS 3:=T+CS 5:=S 3R:=2/S 3S 6:=RH:=S 6*S 2(2) 若只有R 、H 在基本块出口是活跃的,优化后的四元式序列为:S 2:=T-CS 3:=T+CR:=2/S 3H:=R *S 2(3) 假定只有两个寄存器R 0、R 1,上述优化后的四元式序列的目标代码为: LD R 0 TSUB R 0 CST R 0 S2LD R0 TADD R0 CLD R1 2DIV R1 R0LD R0 S2MUL R1 R0ST R1 H7. 设有入图7.4所示的程序流程图:图7.4 程序流图(1)求出流图中各个结点n的必经结点集D(n);(2)求出该流图中的回边;(3)求出该流图中的循环。
解答:(1) 在程序流图中,对任意的结点n i和n j,如果从流图的首结点出发,到达n j的任一通路都必须经过n i,则称n i是n j的必经结点,记为n i DOM n j。
流图中结点n 的所有必经结点称为结点n的必经结点集,记为 D (n)。
流图中各结点n的必经结点集 D (n)为:D (B1) ={B1}D (B2) ={B1,B2}D (B3) ={B1,B2,B3}D (B4) ={B1,B2,B3,B4}D (B5) ={B1,B2,B3,B5}D (B6) ={B1,B2,B3,B6}D (B7) ={B1,B2,B7}D (B8) ={B1,B2,B7,B8}(2) 流图的回边是指: 若a→b是流图中一条有向边,且有b DOM a,则称a→b是流图的一条回边。
题目所给流图中,有有向边B7→B2,又有D (B7)={B1,B2,B7},所以, B2DOM B7, 即B7→B2是流图的回边。
且无其他回边。
(3) 该流图中的循环可利用回边求得。
如果以知有向边n→d是一回边,由它组成的循环就是由结点d、结点n以及有通路到达n而该通路不经过d的所有结点组成,且d是该循环的唯一入口结点。
题目所给出流图中,只有一条回边B7→B2,在该流图中,凡是不能经过结点B2有通路到达结点B7的结点,只有B3,B4,B5,B6,所以,由回边B7→B2组成的循环是{ B2,B3,B4,B5,B6,B7}。
8. (中国科学院计算机所1997年) 试画出如下中间代码序列的程序流图,并求出:(1)各结点的必经结点集合D (n);(2)流图中的回边与循环。
J:=0;L1: I:=0;if I<8 goto L3;L2: A:=B+C;B:=D*C;L3: if B=0 goto L4;Write B;goto L5;L4: I:=I+1;if I<8 goto L2;L5: J:=J+1;if J<=3 goto L1;HALT解答: 程序的流图入图7.5所示。
(1) 各结点的必经结点集分别为:D (n0) ={n0}D (n1) ={n0,n1}D (n2) ={n0,n1,n2}D (n3) ={n0,n1,n3}D (n4) ={n0,n1,n3,n4}D (n5) ={n0,n1,n3,n5}D (n6) ={n0,n1,n3,n6}D (n7) ={n0,n1,n3,n6,n7}n0n1n2n3n4n5n6n7(2)流图中的回边有一条:即n6n 1该回边表示的循环为:(n1,n2,n3,n4,n5,n6),入口为n1,出口为n69.(武汉大学1991年)试对下面的程序段进行尽可能的优化:i:=1j:=10read kl: x:=k* iy: =j* iz: =x*ywrite ji:=i+1if i<100 goto lhalt并指明你进行了何种优化,给出优化过程的简要说明及每种优化后的结果形式。
解答:程序的流程图如下所示:B1BB3:图7.6程序流图由程序流图可知,{B2}为一个循环。
对于本题中的循环可进行以下优化:·削减强度循环中有x:=x*iy:=y*ij,k在循环中不改变值。
i每次增加1,x和y的赋值运算可进行强度削减,于是程序流图变为图7.7所示。
B2:B3:图7.7削减强度后的程序流图· 删除归纳变量由于i 是循环中的基本归纳变量,x 、y 是与y 同族的归纳变量,且有线性关系x :=k*i y :=j*i所以,i<100完全可用x<100*k 或y<100*j 代替。
于是,进一步优化为图7.8所示。
· 代码外提将循环中不变运算write jtl:=100*k提到循环外的前置节点B21中,于是程序流图变为7.9所示的情形。
B 2:B:3图7.8归纳变量后的程序流图¹B2B:2B310.在循环优化中,为什么要代码外提?试说明在哪些情况下代码可外提?解答:代码外提可以减少循环中的指令数目,从而节省目标代码运行的时间。
对于循环中L的每一个不变运算s:A:=B op C 或 A:=B检查它是否满足以下两个条件:(1)(a)s所在的节点是L的所有的出口节点的必经节点;(b)A在L中其他地方未再定值;(c)L中所有A的引用点只有s中A的定植才能到达。
(2)A离开L后不再是活跃的,并且条件(1)中的(a)和(b)成立,所谓A离开L后不再是活跃的,是指A在L的任何出口节点的后继节点(当然是指那些不属于L的后继)入口处不是活跃的。
符合上述(1)或(2)的不变运算s可以外提到L的前置节点中。
但是。
S的运算对象(B或C)是在L中定植的,那么只有当这些定植代码都已外提到前置节点中时。
才能把s也提到前置节点中。
11.以下循环是最内循环,是对其进行循环优化。
A := 0I := 1L1:B := J + 1C := B + IA := C + AIF I = 100 GOTO L2I := I + 1GOTO L1L2:解答:程序的流程图如图所表示有流程图可见,{B2, B3}是一个循环,该循环可进行以下有话:代码外提B2中的 B := J + 1是循环的不变运算,可提到循环外。