到達 定義分析,以乙個問題為例

2021-10-13 19:42:17 字數 1877 閱讀 7295

下圖中,可以到達基本塊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哥元素讀入陣列中並 以遞減的方式 進行排序。接著將剩...