《編譯原理》畫 DAG 圖與求優化後的 4 元式代碼- 例題解析

《編譯原理》畫 DAG 圖與求優化後的 4 元式代碼- 例題解析

DAG 圖(Directed Acylic Graph)無環路有向圖優化

(一)基本塊

基本塊是指程序中一順序執行的語句序列,其中只有一個入口語句(第一個語句)和一個出口語句(最後一個語句)3d

對於一個基本塊來講,執行時只能從其入口語句進入,從其出口語句退出blog

語句
出口語句 任何控制轉移四元式
入口語句 所轉向的目標語句

(二)劃分基本塊的步驟

一、求四元式序列中各個基本塊的入口語句。編譯

  • ① 程序的第一個語句
  • ② 能由條件或無條件轉移語句轉移到的語句
  • ③ 緊跟在條件轉移語句後面的語句

二、對每一入口語句,構造所屬的基本塊,該基本塊由:table

  • 1)該入口語句到下一入口語句(不包括下一入口語句)之間的語句序列組成
  • 2)該入口語句到一轉移語句(包括該轉移語句)之間的語句序列組成
  • 3)該入口語句到一停語句(包括該停語句)之間的語句序列組成

三、凡是未包含在某一基本塊中的語句,都是程序中控制流程不可達的語句,可刪除它們。class

例題:

對於下面給出的求最大公因子的程序,能夠根據基本塊的構造規則與其劃分基本塊編譯原理

基本塊構造步驟:變量

(1):由規則 (1) 中的 ① 可知語句 (1) 是一個入口語句
(2):由規則 (1) 中的 ② 可知,語句 (3) 和 (8) 均是人口語句
(3):由規則 (1) 中的 ③ 可知,語句 (5) 是二我的口語句,能夠用 「+」 在人口語句的左側做標記。
(4):由規則 (2) 能夠劃分該程序爲四個基本塊,它們分別是:原理

  • 語句 (1)、(2) 組成的基本塊 B1
  • 語句 (3)、(4) 組成的基本塊 B2
  • 語句 (5)、(6) 和 (7) 組成的基本塊 B3
  • 語句 (8) .(9) 組成的基本塊 B4

程序中在代碼段左側對各個基本塊進行了標記。cli

(三)程序控制流程流圖

定義: 以基本塊爲結點,控制程序流向做爲有向邊,畫出的有向圖稱爲流圖。

特色:

  • 具備惟一首結點的有向圖
  • 從首結點開始到流圖中任何結點都有通路

若是一個結點的基本塊的入口語句是程序的第一條語句,則稱此結點爲首結點

程序控制流程流圖的表示

一個控制流程圖可表示成一個三元組:
G=(N,E,n0 )

N:全部結點(基本塊)集;
E:全部有向邊集;
n0 :首結點。

有向邊:

當下述條件有一個成立時,從結點i有一有向邊引向結點 j:

  • ① 基本塊 j 在程序的位置緊跟在i後,且 i 的出口語句不是無條件轉移或停語句
  • ② i 的出口是 goto(S) 或 if goto(S),而 (S) 是 j 的入口語句

構造程序控制流圖

對程序基本塊:

構造如下程序控制流圖:

(四)基本塊的 DAG 表示

DAG Directed Acyclic Graph 無環路有向圖

定義:

(1) 在一個有向圖中,若結點 ni 有弧指向結點 nj,則 ni 是 nj 的父結點,nj 是 ni 的子結點;

(2) 若 n1,n2,…,nk 間存在有向弧 n1→n2→…→nk,則稱 n1 到 nk 之間存在一條通路,如有 nk=n1,則稱該通路爲環路;

(3) 如有向圖中任意通路都不是環路,則稱該圖爲無環路有向圖(DAG)

用來描述基本塊的 DAG:

(1) 圖的葉結點以一標識符或常數作標記,表示該結點表明該變量或常數的值。

(2) 圖的內部結點以一運算符做爲標記;

(3) 圖中各個結點上可能附加一個或多個標識符,表示這些標識符具備該結點所表明的值,簡稱附標。

四元式對應的 DAG 結點形式

按其四元式對應結點的後繼個數分紅四種類型:0型、1型、2型、3型

(五)DAG 圖構造例題

對於基本塊 P

(1)S0 := 2
(2)S4 := 2
(3)S1 := 1.5
(4)S2 := T-C
(5)S3 := T+C
(6)S5 := S3
(7)R := 2/S3
(8)S6 := R
(9)H := R*S2

(1)試用 DAG 進行優化並重寫基本塊
(2)假定只有 R,H 在基本塊出口是活躍的,試寫出優化後的 4 元式序列
(只須要還原活躍變量)

解析:

(1)畫出 DAG 圖以下:

畫圖的步驟就是:根據基本塊,一部一部組裝

(2)假定只有 R,H 在基本塊出口是活躍的,試寫出優化後的 4 元式序列
(只須要還原活躍變量)

優化後的 4 元式代碼能夠寫爲:
(1)S2 := T-C
(2)S3 := T+C
(3)R := 2/S3
(4)H := R*S2

解釋:

與原來的基本塊相比較能夠看出:

  • 原基本塊中的 (2) 和 (7) 中的已知量都已經合併。由於 (2) 中 S4 := 2,(7) 中用 2,因此合併。
  • (5) 和 (8) 中的公共子表達式 T+C 只在 (5) 中計算一次,在 (8) 中 直接引用其結果,因此刪除了多餘運算。
  • (6) 中的無用賦值已被刪除。S5 := S3,S5 後面沒有再用,因此就和 S3 一塊兒表示。

除了能夠應用 DAG 進行上述的優化外,還能夠從基本塊的 DAG 中獲得一些其餘信息:

  • DAG 葉結點上標記的標識符是在該基本塊以前的基本塊內被定值,並在該基本塊內被引用的標識符。
  • DAG 各結點上的附加標識符是在基本塊內被定值,並能夠在基本塊後被引用的標識符。

若是確認某結點的一個附加標記在基本塊後不會被引用,則該標識符的定值語句能夠做爲死代碼被刪除。

假設上面例子中 S0~S6。在基本塊後面都不會被引用只有 R, H 在基本塊出口是活躍的則優化後的四元式序列能夠寫爲:
(1)S2 := T-C
(2)S3 := T+C
(3)R := 2/S3
(4)H := R*S2

相關文章
相關標籤/搜索