2015-05-27 34 views

回答

2

首先,請注意,有沒有這樣的事,作爲一個「規範」對三地址代碼。它通常用於指代具有一些共同屬性的中間表示族 - 最值得注意的是,缺少像((x + 5) * z - y)這樣的複雜表達式。

因爲這樣,下面是一個示例,說明它可能以三地址代碼的形式顯示,我只是編寫了

; ... preceding code ... 
    sum := 0 
    i := 1 
    goto loop_header 

loop_header: 
    if i > n then loop_end else loop_body 

loop_body: 
    sum := sum + i 
    i := i + 1 
    goto loop_header 

loop_end: 
    ; ... rest of function ... 

的外賣是:

  • 在三地址代碼,複雜的表達式必須被簡化爲一系列簡單的表達式,引入臨時變量根據需要握住中間結果。例如,我們可能轉化表達x = ((x + 5) * z - y)到:

    t0 := x + 5 
    t1 := t0 * z 
    x := t1 - y 
    

    請注意,您的例子只包含簡單的表達式。

  • 循環被標籤之間的簡單跳轉代替。這使得IR更接近它將最終轉換成的機器碼。

代碼的格式反映了一些我個人的喜好了低級別的IR:

  1. 有沒有隱含的下跌得來;所有的basic blocks都以標籤開始並以gotoif(或return,未示出)結束。
  2. 在分支點,if指令包含true和false目標,不需要以下goto。它在指令選擇器上也更好。
+0

非常感謝! –

+0

如果這回答了您的問題,請將其標記爲已接受。否則,現在是時候提出後續問題了。 :-) –