?? 9.5.5.htm
字號(hào):
<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.5.4.htm'" ></img></td>
<td><img src="../images/next.gif" onmouseover="javascript:style.cursor='hand'" onclick="vbscript:window.location.href='9.5.5ab.htm'" ></td>
</tr>
</table>
<br><br>
<font class="title2"><b>9.5.5 in和out的計(jì)算</b></font>
<table>
<tr>
<td>    </td>
<td class="content">
<p>
許多數(shù)據(jù)流問題可以用類似計(jì)算gen和kill的綜合翻譯來解決.例如,對(duì)每個(gè)語(yǔ)句S,我們想確定S定值的變量集合,這些信息可以由計(jì)算類似gen方程的方程得到,甚至不需要類似kill的集合。這些信息可用于確定循環(huán)的不變計(jì)算。
</p>
<p>
但是,另外一些數(shù)據(jù)流問題,如到達(dá)_定值問題,還需要計(jì)算某些繼承屬性。很明顯,in是繼承屬性,out是依賴于in的綜合屬性。in[S]是到達(dá)S開始點(diǎn)的定值集合,它的計(jì)算要考慮到整個(gè)程序的控制流,包括S外面的語(yǔ)句或者嵌在S其中的語(yǔ)句。集合out[S]是類似地為S的結(jié)束點(diǎn)定義的。注意區(qū)別out[S]和gen[S]是很重要的,后者是不經(jīng)過S外的路徑到達(dá)S結(jié)束點(diǎn)的定值集合。
</p>
<p>
用一個(gè)簡(jiǎn)單的例子來區(qū)別:
</p>
<p>
<p><img src="images/9_25_2.gif">
</p>
<p>考慮圖9.27(2)(b)的串聯(lián)語(yǔ)句。語(yǔ)句d在S<sub>1</sub>中產(chǎn)生,因而到達(dá)S<sub>2</sub>的開始點(diǎn),如果d不在kill[S<sub>2</sub>]中,d將到達(dá)S<sub>2</sub>的結(jié)束點(diǎn),于是d在out[S<sub>2</sub>] 中而不在gen[S<sub>2</sub>]中。
</p>
<p>
在自底向上計(jì)算了所有語(yǔ)句的gen和kill后,可以從代表整個(gè)程序的語(yǔ)句開始計(jì)算in和out。如果S0是整個(gè)程序開始,in[S0]=φ,即沒有定值到達(dá)程序的開始。對(duì)圖9.27(2)的四類語(yǔ)句??梢约俣╥n[S]都是已知的,用它來計(jì)算S每個(gè)子語(yǔ)句的in。然后自頂向下遞歸地計(jì)算每個(gè)子語(yǔ)句S<sub>1</sub>或S<sub>2</sub>的out,并用這些集合計(jì)算out[S]。
</p>
<p>
<table>
<tr>
<td class="content">
<p>
<hr size=2 width=90% align=center color=red><br>
<p><font class = "example"> 計(jì)算圖9.27(2)(a)的in和out </font></p>
<p><span style="FONT-SIZE: large">
<img border="0" src="images/9_25_1_3.gif"></span></p>
<p><font size="4" color="#FF0000">out[S]=gen[S]∪(in[S]-kill[S]) </font>
</p>
<p>解析:這是一種最簡(jiǎn)單的情況,它是一個(gè)賦值語(yǔ)句,如果知道in[S],即可由方程<font color="#FF0000">out[S]=gen[S]∪(in[S]-kill[S])</font>計(jì)算out。</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.5.4.htm'" ></img></td>
<td><img src="../images/next.gif" onmouseover="javascript:style.cursor='hand'" onclick="vbscript:window.location.href='9.5.5ab.htm'" ></td>
</tr>
</table>
</BODY>
<html><script language="JavaScript">
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -