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

📄 9.7.5.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.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>&nbsp&nbsp&nbsp&nbsp</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 + -