下圖中,可以到達基本塊b3的入口處的定值集合是。
計算gen[b]和kill[b]
基本塊gen[b]
kill[b]
b1b2
b3b4
gen[b]和kill[b]是要作為已知量帶入方程的。
1.明確到達-定義的資料流方程
與程式點(基本塊)關聯的資料流值是:變數定義(賦值語句)。
in[b]: 緊靠基本塊b之前的有效定義的變數。
out[b]: 緊隨基本塊b之後的有效變數定義。
gen[b]: 在基本塊b中,生產的新的變數定義。
kill[b]: 在基本塊b中,被新的變數定義登出的變數定義。
2.到達-定義資料流方程的求解演算法
輸入:已經計算出每個基本塊b的kill[b]和gen[b]的流圖
輸出:每個基本塊b的in[b]和out[b]
步驟:演算法框架如下
初始化:in[b]=∅, out[b]=gen[b]
更新in:
儲存舊out值:oldout = out[b];
更新out值:
ischange標記迴圈過程中out集合是否改變,如改變,再次進行迭代,直至out集合不再改變。
3.該例子中的計算示例
1)初始化
基本塊in[b]
out[b]b1∅
b2∅b3∅
b4∅2)第一次迭代
b1沒有前驅;更新out[b1]=∪(∅-kill[b1])=
b2的前驅有b1和b4,
in[b2]=out[b1]∪out[b4]=∪=
out[b2]=∪(-)=, ischange=true
b3的前驅是b2
in[b3]=out[b2]=
out[b3]=∪(-)=
b4的前驅是b2和b3
in[b4]=out[b2]∪out[b3]=∪=
out[b4]=∪(-)=
基本塊in[b]
out[b]b1∅
b2 b3
b4
3)第二次迭代
b1沒有前驅;更新out[b1]=∪(∅-kill[b1])=
b2的前驅有b1和b4,
in[b2]=out[b1]∪out[b4]=∪=
out[b2]=∪(-)=, ischange=true
b3的前驅是b2
in[b3]=out[b2]=
out[b3]=∪(-)=
b4的前驅是b2和b3
in[b4]=out[b2]∪out[b3]=
out[b4]=∪(-)=
基本塊in[b]
out[b]b1∅
b2 b3
b44) 第三次迭代
b1沒有前驅;更新out[b1]=∪(∅-kill[b1])=
b2的前驅有b1和b4,
in[b2]=out[b1]∪out[b4]=∪=
out[b2]=∪(-)=
b3的前驅是b2
in[b3]=out[b2]=
out[b3]=∪(-)=
b4的前驅是b2和b3
in[b4]=out[b2]∪out[b3]=
out[b4]=∪(-)=
基本塊in[b]
out[b]b1∅
b2b3
b4out[b]集合不再改變
終止.迭代次數不會超過基本塊的次數,此題中為4.
遞迴思想分析 以乙個簡單的例子為例
遞迴演算法分析 以乙個最簡單的例子為例 題目 用遞迴的方法將整數按高到低位輸出相應的數字字元.例如 對整數 603,將輸出3 個數字6,0,3 源程式 include int main void fun n return 0 void fun int k 分析 咱們以這個例子來解釋遞迴。遞迴就是自己...
發布乙個npm包 以angular為例
做前端的同學和npm打交道的次數可不算少,npm上有許多好用的庫可以幫我們節省很多時間,那麼今天我們就嘗試發布乙個angular元件到npm上。首先,我們來建立乙個angular專案,不同於平時我們使用 來建立專案,我們本次使用 ng g library npm klx lib prefix myp...
乙個選擇問題的分析
設有一組n個數,要確定其中第k個最大者,這稱為選擇問題 selection problem 該問題的一種解法是將這n個數讀進乙個陣列中,再通過某種簡單的演算法,比如氣泡排序,以遞減順序將陣列排序,然後返回位置k上的元素。更好一點的演算法可以先把前k哥元素讀入陣列中並 以遞減的方式 進行排序。接著將剩...