控制流圖
編輯在計算機科學中,控制流圖(CFG)是表示,使用圖形可能通過一個被遍歷所有路徑的符號,程序其期間執行。該控制流圖是由于法蘭·艾倫,誰注意到,里斯T.Prosser的使用布爾連接矩陣用于流動分析之前。
控制流圖對于許多編譯器優化和靜態分析工具都是必不可少的。
定義
在控制流圖中的每個節點在所述圖形表示基本塊,即一個直線片而沒有任何跳躍或代碼的跳轉目標;跳轉目標開始一個塊,跳轉結束一個塊。引導邊緣被用來表示在跳躍控制流程。在大多數演示中,有兩個特別指定的塊:入口塊,控制通過它進入流圖,以及出口塊,所有控制流都通過它離開。
由于其構造過程,在控制流圖中,每條邊A→B都具有以下性質:
出度(A)>1或入度(B)>1(或兩者)。
因此,至少在概念上,可以通過從程序的(完整)流程圖開始獲得CFG,即每個節點代表一條單獨指令的圖,并對每條邊進行邊收縮以證偽上述謂詞,即收縮每條邊的源有一個出口,其目的地有一個入口。這種基于收縮的算法沒有實際意義,除了作為理解CFG構造的可視化輔助工具外,因為可以通過掃描基本塊,直接從程序更有效地構造CFG。
控制流圖的循環管理
編輯環頭(有時也被稱為入口點的循環的)是支配其是環成形后邊緣的目標。循環頭控制循環體中的所有塊。一個塊可以是一個以上循環的循環頭。一個循環可能有多個入口點,在這種情況下它沒有“循環頭”。
假設塊M是一個支配者,有幾個傳入邊,其中一些是后邊(所以M是一個循環頭)。將M分成兩個塊Mpre和Mloop對多次優化傳遞是有利的。M的內容和后邊移動到Mloop,其余邊移動以指向Mpre,并插入從Mpre到Mloop的新邊(因此Mpre是Mloop的直接支配者)。一開始,Mpre將是空的,但是像循環不變代碼運動這樣的傳遞可以填充它。Mpre被稱為looppre-header和Mloop將是循環頭。
可還原性
編輯可約CFG的邊可以分為兩個不相交的集合:前邊和后邊,這樣:
- 前向邊形成一個有向無環圖,所有節點都可以從入口節點到達。
- 對于所有后邊(A,B),節點B支配節點A。
結構化編程語言通常被設計為它們生成的所有CFG都是可約化的,并且常見的結構化編程語句(如IF、FOR、WHILE、BREAK和CONTINUE)生成可約化圖。要生成不可約圖,需要諸如GOTO之類的語句。一些編譯器優化也可能產生不可約圖。
回路連通性
編輯控制流圖的環路連通性是相對于CFG的給定深度優先搜索樹(DFST)定義的。這個DFST應該以起始節點為根,覆蓋CFG的每個節點。
控制流圖中從節點到其DFST祖先之一(包括其自身)的邊稱為后邊。
環連通性是在CFG的任何無環路徑中找到的xxx數量的后邊緣。在可約CFG中,回路連通性與選擇的DFST無關。
過程間控制流圖
編輯控制流圖表示單個過程的控制流,過程間控制流圖表示整個程序的控制流。
內容由匿名用戶提供,本內容不代表www.gelinmeiz.com立場,內容投訴舉報請聯系www.gelinmeiz.com客服。如若轉載,請注明出處:http://www.gelinmeiz.com/127543/