⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 9.7.7.3.htm.bak

📁 建立《编译原理网络课程》的目的不仅使学生掌握构造编译程序的原理和技术
💻 BAK
字号:
<html>

<head>
<title>编译原理</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<link type="text/css" rel="stylesheet" href="../css/specification.css">
</head>

<BODY>

<table align=right width=300>
<tr>
<td><img src="../images/previous.gif" onmouseover="javascript:style.cursor='hand'" onclick="vbscript:window.location.href='9.7.7.2b.htm'" ></td>
<td>
<img src="../images/next.gif" onmouseover="javascript:style.cursor='hand'" onclick="vbscript:window.location.href='9.7.7.3b.htm'" ></img></td>
</tr>
</table>
<br><br>

<font class="title2"><b>9.7.7.3 归纳变量删除算法</b></font>            


<table>
<tr>
<td>&nbsp&nbsp&nbsp&nbsp</td>
<td class="content">
&nbsp&nbsp&nbsp&nbsp<font class = "definition">算法9.13</font> 归纳变量删除 <br>
&nbsp&nbsp&nbsp&nbsp输入:循环L,以及相应的到达_定值信息,循环不变计算信息和活跃<Br>
&nbsp&nbsp&nbsp&nbsp&nbsp;&nbsp&nbsp;&nbsp&nbsp;&nbsp;变量信息。 <br>
&nbsp&nbsp&nbsp&nbsp输出:归纳变量删除后的循环。<br>
&nbsp&nbsp&nbsp&nbsp方法: <br>
&nbsp&nbsp&nbsp&nbsp&nbsp;(1) 考虑每个仅用于条件分支测试的基本归纳变量i,取i族中其三元<br>
&nbsp&nbsp&nbsp&nbsp&nbsp;&nbsp&nbsp;&nbsp;组(i,c,d)中的c和d尽可能简单的某个j(即,c=1和d=0<br>
&nbsp&nbsp&nbsp&nbsp&nbsp;&nbsp&nbsp;&nbsp;者优先),把每个含i的测试中的i用j代替。例如,形式为<br> &nbsp&nbsp&nbsp&nbsp&nbsp;&nbsp&nbsp;&nbsp;&nbsp&nbsp&nbsp&nbsp&nbsp;&nbsp&nbsp;&nbsp;if i relop x goto B<br>
&nbsp&nbsp&nbsp&nbsp&nbsp;&nbsp&nbsp;&nbsp;的测试,其中x不是归纳变量,用下面的指令序列 <br>
<p>&nbsp&nbsp&nbsp&nbsp;&nbsp&nbsp; r:=c*x <font color="#008000">   /*如果c等于1,r:=x*/</font> <br>
&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp;  r:=r+d <font color="#008000">   /*如果d等于0,省略它*/
</font> <br>
&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp;     if   j  relop   x   goto   B  <br></p><p></P>
&nbsp&nbsp&nbsp&nbsp&nbsp;&nbsp&nbsp;&nbsp;代替,其中r是新的临时变量。可类似处理<br>
&nbsp&nbsp&nbsp&nbsp&nbsp;&nbsp&nbsp;&nbsp;&nbsp&nbsp&nbsp&nbsp&nbsp;&nbsp&nbsp;&nbsp;if x relop i goto B。<br>
&nbsp&nbsp&nbsp&nbsp&nbsp;&nbsp&nbsp;&nbsp;如果测试if i1 relop i2 goto B的i1和i2都是归纳变量,那么<br>
&nbsp&nbsp&nbsp&nbsp&nbsp;&nbsp&nbsp;&nbsp;检查i1和i2是否都能被代替。最简单的情况是,有j1的三元组<br>
&nbsp&nbsp&nbsp&nbsp&nbsp;&nbsp&nbsp;&nbsp;(i1,c1,d1)和j2的三元组(i2,c2,d2),并且c1=c2和<br>
&nbsp&nbsp&nbsp&nbsp&nbsp;&nbsp&nbsp;&nbsp;d1=d2,那么,i1 relop i2等价于j1 relop j2。更复杂的情<br>
&nbsp&nbsp&nbsp&nbsp&nbsp;&nbsp&nbsp;&nbsp;况,测试的替换可能是没有价值的,因为可能要引入两步乘和<br>
&nbsp&nbsp&nbsp&nbsp&nbsp;&nbsp&nbsp;&nbsp;一步加,而删除i1和i2只可能节省两步。 <br>
<p>&nbsp&nbsp最后,当被删掉的归纳变量不再引用时,从循环中删去所有对它的赋值。</P>
<p>&nbsp(2) 考虑由算法9.12(强度削弱用于归纳变量)引入语句j:=s的每<br>
&nbsp&nbsp&nbsp&nbsp&nbsp;&nbsp&nbsp;&nbsp;个归纳变量j。首先检查在引入的j:=s和任何j的引用之间有没<br>
&nbsp&nbsp&nbsp&nbsp&nbsp;&nbsp&nbsp;&nbsp;有对s赋值,通常是没有。j常常在它定值的块中被引用,这个<br>
&nbsp&nbsp&nbsp&nbsp&nbsp;&nbsp&nbsp;&nbsp;检查可以简化,否则需要用到达_定值信息和加上一些图的分析<br>
&nbsp&nbsp&nbsp&nbsp&nbsp;&nbsp&nbsp;&nbsp;来实现这种检查。然后用引用s代替所有j的引用,并删去语句<br>
&nbsp&nbsp&nbsp&nbsp&nbsp;&nbsp&nbsp;&nbsp;j:=s。<br></p>
<br>
<font class = "example">例9.36</font>

</td>
</tr>
</table>

<table>
<tr>
<td>&nbsp&nbsp&nbsp&nbsp</td>
<td class="content">
<p align=center><img src="images/9_40b.gif"></p>
<p>	考虑图9.46(a)的流图。环绕B2的内循环含两个归纳变量i和s2,但是一个也不能删除,因为s2作为计算数组a的下标,i作为外循环的测试。同样,环绕B3的循环含归纳变量j和s4,它们也不能被删除。 <br>
&nbsp&nbsp&nbsp&nbsp    再让我们把算法9.13用于外循环。当算法9.12建立新变量s2和s4时,s2置于i族,s4置于j族。考虑i族,i的唯一引用是在B4中测循环终止,所以i是算法9.13步骤(1)删除的侯选。B4的测试含两个归纳变量i和j,幸好,i族和j族分别含的归纳变量s2和s4的三元组有同样的常数,因为这两个三元组分别是(i,4,0)和(j,4,0)。于是,测试i>=j可由s2>=s4代替,使得i和j都被删除。 <br>
&nbsp&nbsp&nbsp&nbsp    算法9.13步骤(2)运用复写传播于新建的变量,用s2和s4分别代替t2和t4。最后的结果如图9.46(b)<br>
</td>
</tr>
</table>

<br>
<table align=right width=300>
<tr>
<td><img src="../images/previous.gif" onmouseover="javascript:style.cursor='hand'" onclick="vbscript:window.location.href='9.7.7.2b.htm'" ></td>
<td>
<img src="../images/next.gif" onmouseover="javascript:style.cursor='hand'" onclick="vbscript:window.location.href='9.7.7.3b.htm'" ></img></td>
</tr>
</table>

</BODY>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -