📄 9.7.1b.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.1.htm'" ></td>
<td>
<img src="../images/next.gif" onmouseover="javascript:style.cursor='hand'" onclick="vbscript:window.location.href='9.7.2.htm'" ></img></td>
</tr>
</table>
<br><br>
<table>
<tr>
<td>    </td>
<td class="content">
     关于该算法的一些评论如下: <br>
     1、 步骤(1)的寻找到达s的y+z的计算也可以形式化为一个数据流分析问题。但是,为所有的表达式y+z和所有的语句或基本块解这个问题没有意义,因为收集了许多无关的信息。我们宁可在流图上搜索有关的语句和表达式。 <br>
     2、 由算法9.7完成的变化并非都是改进。我们可能需要限制在步骤(1)发现的到达s的不同计算的个数,很可能限制到1。不过,下面讨论的复写传播在几个y+z的计算到达s时也能获得益处。 <br>
     3、 算法9.7将漏掉a*z和c*z在下面情况下是等价的这个事实。 <br>
         a:= x+y 和 c:= x+y <br>
         b:= a*z   d:= c*z <br>
     因为处理公共子表达式的这种简单方法仅考虑字面表达式,而不是表达式计算的值。Kildall提出了一种方法,在一遍扫描中抓住这样的等价。但是,用算法9.7多遍扫描也能抓住它们,可以考虑重复算法9.7直到没有新的公共子表达式为止。如果a和c是临时变量,它们在块外不再引用,那么,对临时变量作专门处理,可使公共子表达式(x+y)*z被抓住,见下面的例9.28。 <br>
     <font class = "example">例9.28</font> 假定在下面图9.40(a)流图中对数组a没有赋值,我们可以安全地认为a[t2]和a[t6]是公共子表达式。问题是怎样删除这个公共子表达式。<br>
</td>
</tr>
</table>
<p align=center><img src="images/9_34.gif"></p>
<table>
<tr>
<td>    </td>
<td class="content">
     图9.40(a)的公共子表达式4*i在图(b)中已删除。发现a[t2]和a[t6]也是公共子表达式的一种办法是用复写传播把t2和t6改成u(下一小节讨论),两个表达式都成了a[u],再次使用算法9.7可以删除。注意,同样的新值u插入在图9.40(b)的两块中,所以局部的复写传播足以把a[t2]和a[t6]变成a[u]。 <br>
     还有另一种办法,它考虑这样一个事实:临时变量是由编译器插入的,并仅在它们出现的块中使用。如果仔细地观察表达式的表示方法,能够看到:不同的临时变量代表同样的表达式。表示表达式集合的一种广为采用的方法是为每个表达式赋一个序号,用第i位代表序号为i的表达式的位向量。<br>
     更详细地说,如果使用编号而不是用临时变量,设4* i的编号是15,表达式a[t2]和a[t6]将得到同样的编号,比如是18,那么第18位在数据流分析期间既代表a[t2]又代表a[t6],可以断定a[t6]是可用的并加以删除。使用编号的结果代码显示在图9.40(c)中。<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.6.6.htm'" ></img></td>
<td><img src="../images/next.gif" onmouseover="javascript:style.cursor='hand'" onclick="vbscript:window.location.href='9.7.2.htm'" ></td>
</tr>
</table>
</BODY>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -