複製鏈接
請複製以下鏈接發送給好友

定義可達性

鎖定
在編譯器理論中,一個指令的定義可達性(Reaching Definition)必然是另外一個指令,而這個指令則是一個沒有交錯賦值指令的目標變數,舉例來説:
中文名
定義可達性
外文名
Reaching Definition

定義可達性例子

d1 : y := 3d2 : x := y
在d2中,d1為定義可達性,而在下列的範例中:
d1 : y := 3d2 : y := 4d3 : x := y
d1在d3不再是定義可達性,因為d2使它不再可能被到達。

定義可達性作為分析用途

定義可達性也可稱為數據流分析,它靜態的決定在程式碼當中哪些定義可以被到達,由於他相當簡單,它在教課書當中通常被使用作數據分析的經典範例。數據流匯流運算(data-flow confluence operator)則是使用聯集,而他的分析則是正向流動。定義可達性被使用在計算UD鏈以及DU鏈。
資料流方程式,給定一個基本區塊
在定義可達性:
換句話説,定義可達性的集合為
的前身,在控制流程圖(Control flow graph)中,
包含所有在
區塊前的基本區塊。定義可達性出來的
,為所有定義可達性自己前身減掉那些被
剃除掉的變數,再加上
產生的新的定義 [1] 
我們定義通用的指令
如下:
為所有賦值給
變數定義的集合,
是一個獨立的標籤附加在賦值的指令,那麼定義可達性的值域就是這些指令標籤。

定義可達性工作清單算法

通常使用迭代工作列表算法來計算到達定義。
輸入:控制流程圖CFG =(節點,邊緣,進入,退出)
// Initializefor all CFG nodes n in N,    OUT[n] = emptyset; // can optimize by OUT[n] = GEN[n];// put all nodes into the changed set// N is all nodes in graph, Changed = N; //Iterate while (Changed != emptyset){  choose a node n in Changed;  // remove it from the changed set  Changed = Changed -{ n };   // init IN[n] to be empty  IN[n] = emptyset;    // calculate IN[n] from predecessors' OUT[p]  for all nodes p in predecessors(n)      IN[n] = IN[n] Union OUT[p];   oldout = OUT[n]; // save old OUT[n]    // update OUT[n] using transfer function f_n ()  OUT[n] = GEN[n] Union (IN[n] -KILL[n]);     // any change to OUT[n] compared to previous value?  if (OUT[n] changed) // compare oldout vs. OUT[n]  {      // if yes, put all successors of n into the changed set    for all nodes s in successors(n)        Changed = Changed U { s };    }}
參考資料
  • 1.    馮廣超, 覃成林. 可達性研究動態及測算模型修訂[J]. 地域研究與開發, 2016, 35(2):6-11.