📄 9.7.5.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.4c.htm'" ></td>
<td>
<img src="../images/next.gif" onmouseover="javascript:style.cursor='hand'" onclick="vbscript:window.location.href='9.7.6.htm'" ></img></td>
</tr>
</table>
<br><br>
<font class="title2"><b>9.7.5 代码外提的其它策略</b></font>
<table>
<tr>
<td>    </td>
<td class="content">
<p>
如果我们愿意冒程序执行时间可能略有增加的风险的话,可以稍微放松条件(1)。当然,我们决不改变程序的计算。代码外提条件(1)(即<a href="9.7.4.htm#A9.8">算法9.10</a>的2(a))的放松版本是我们可以外提对x赋值的语句s,只要:
</p>
<p>
(1')含s的块或者是循环所有出口的必经块,或者x在循环外不引用。例如,若x是临时变量,(在许多编译器中)我们可以保证x的值仅在它自己的块中引用。一般而言,需要活跃变量分析指出x在循环的出口是否活跃。
</p>
<p>
如果<a href="9.7.4.htm#A9.8">算法9.10</a>改成使用条件(1'),偶然,运行时间稍有增加,但平均来说这样做是合算的。修改后的算法可能把一些循环中不一定执行的计算提到前置块。请注薏,这种做在个别情况下会引起错误。例如,循环中的计算x/y的前面可能有个测试y是否为0,如果我们把x/y移到前置块,可能会出现0为除数的情况。基于这一点,使用条件(1')是不明智的,除非对除法语句仍然使用较严格的条件(1)
</p>
<p>
即使赋值x:=y+z不能满足<a href="9.7.4.htm#A9.8">算法9.10</a> 的条件(2)的(a),(b)和(c),我们仍可以外提计算y+z。取新的临时变量t,在前置结点置t:=y+z,然后在循环中用x:=t代替x:=y+z。在许多情况下,可以传播复写语句x:=t。注意,如果算法9.10的条件(2)(c)满足,即如果循环L中x的所有引用由x:=y+z(现在是x:=t)定值,那么可以把L中所有x的引用改成引用t,删除掉语句x:=t,并在循环的每个出口后面加上x:=t。
</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.4c.htm'" ></td>
<td>
<img src="../images/next.gif" onmouseover="javascript:style.cursor='hand'" onclick="vbscript:window.location.href='9.7.6.htm'" ></img></td>
</tr>
</table>
</BODY>
<html><script language="JavaScript">
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -