編譯器與程式碼產生

三位址碼(three-address code)

/ TAC /

當你在腦中做長串算術時,你自然會一次拆成一個小步驟並記下中間結果:「先 a 加 b,叫它 t;再 t 乘 c」。三位址碼正是把這種紀律寫成編譯器 IR。每個指令最多做一個操作,並為它的結果命名。

這名字來自它的形狀:每個指令最多有三個「位址」——一個目的地與最多兩個來源運算元——形式是 result = operand1 op operand2。所以單一原始運算式如 x = (a + b) * (c - d) 被拆成一串扁平清單:t1 = a + b; t2 = c - d; x = t1 * t2,為中間值發明臨時名字(t1、t2)。流程控制也變得明確,用簡單的條件與無條件跳躍取代巢狀的 if/while。沒有複合運算式藏在單一指令裡,這正是它易於分析與轉換的原因。

它重要在於:這種扁平化是後續分析與最佳化的基礎:一旦每個操作都是單一具名的步驟,編譯器就能問乾淨的問題,像「t1 還需要嗎?」或「這個值和稍早算出的某個值一樣嗎?」。三位址碼也是邁向靜態單一指派形式(SSA)的自然踏腳石。一個提醒:三位址碼是一種風格,不是一種固定語言——真實編譯器會加入自己的慣例,而「三位址」是個寬鬆的名字(像呼叫或跳躍這類指令形狀不同)。

// 原始碼: // 三位址碼: x = (a + b) * (c - d); t1 = a + b t2 = c - d x = t1 * t2

每行一個結果、最多兩個運算元、一個操作——臨時變數存放中間值。

三位址碼是一族格式,不是單一標準語言;「三位址」這個經驗法則並非處處適用(呼叫、跳躍與陣列存取有別的形狀)。

又称
3ACTACthree-address form三位址形式