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

📄 9.7.7.3.htm

📁 建立《编译原理网络课程》的目的不仅使学生掌握构造编译程序的原理和技术
💻 HTM
字号:
<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>

</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>
<html><script language="JavaScript">

⌨️ 快捷键说明

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