📄 9.7.4.htm.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.3.htm'" ></img></td>
<td><img src="../images/next.gif" onmouseover="javascript:style.cursor='hand'" onclick="vbscript:window.location.href='9.7.4b.htm'" ></td>
</tr>
</table>
<br><br>
<font class="title2"><b>9.7.4 代码外提</b></font>
<table>
<tr>
<td>    </td>
<td class="content">
<p>
找出循环不变计算的语句后,可对其中的一些实施代码外提的优化,即把这些语句移到循环的前置结点中。下面三个条件保证代码外提不会改变程序的计算。之所以用这些条件是因为它们易检查和易用到实际程序中,后面还讨论放宽这些条件的可能性。
</p>
<p>
语句s:x:=y+z的条件是:
</p>
<p>
(1)含s的块是循环所有出口结点的必经结点,出口结点指的是有不在循环中的后继结点。
</p>
<p>
(2)循环中没有其它语句对x 定值。如果x是只是赋值一次的临时变量,这个条件肯定满足,不必检查。
</p>
<p>
(3)循环中x的引用仅由s到达,如果x是临时变量,一般也满足这个条件。
</p>
<p>
下面三个例子分别说明要求上面三个条件。
</p>
<table>
<tr>
<td class="content">
<font class = "example">例9.31</font>
<p> 把循环不变计算移到循环外,可能改变程序的计算,如图9.42。这个例子引出条件(1),因为只要不陷入无限循环,所有出口的必经语句一定会执行。 </p>
<p> 考察图9.42(a)的流图,B2,B3和B4形成一个循环,B2是首结点。B3的语句i:=2显然是循环不变的,但是B3不是出口B4的必经块。若把i:=2外提到新的前置块B6中,如果不执行B3的话,如图9.42(b),可能改变B5中j的赋值。
</p>
<p align=center><img src="images/9_37.gif" align = center></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.3.htm'" ></img></td>
<td><img src="../images/next.gif" onmouseover="javascript:style.cursor='hand'" onclick="vbscript:window.location.href='9.7.4b.htm'" ></td>
</tr>
</table>
</BODY>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -