3-어드레스 코드
(Three-address code)는
컴파일러
에서 使用되는
中間 言語
의 한 種類로,
컴파일러 最適化
를 實現하는데 使用된다. '3-어드레스'로 불리는 것은 2個의 入力用과 1個의 出力用
메모리 住所
或은
레지스터
를 指定하는 形式이기 때문이다.
槪要
[
編輯
]
3-어드레스 코드의 各 命令은 命令코드, 오퍼랜드1, 오퍼랜드2, 結果의 4-
튜플
形態로 表現된다. 이는 다음과 같은 一般 式으로 表現할 수 있다.
여기서
x
,
y
,
z
는 變數나 常數, 或은 컴파일러에서 生成한 一時 變數가 될 수 있다.
op
은 命令 코드이며, 算術演算에 該當한다. 여러個의 演算으로 構成된 다음과 같은 式이 있다고 하자.
이 式은 이대로는 3-어드레스 코드로 表現할 수 없으므로, 다음과 같이 2個의 命令으로 分解하여 表現할 수 있다.
3-어드레스 코드를 改良한 形態로
政敵 單一 大入
(SSA)가 있다.
예
[
編輯
]
int
main
(
void
)
{
int
i
;
int
b
[
10
];
for
(
i
=
0
;
i
<
10
;
++
i
)
{
b
[
i
]
=
i
*
i
;
}
}
위의
C言語
코드를 다음의 3-어드레스 코드로 變換할 수 있다.
i := 0 ; 大入
L1: if i < 10 goto L2 ; 條件 分期
goto L3 ; 無條件 分期
L2: t0 := i*i
t1 := &b ; 年産 對象 어드레스
t2 := i << 2 ; b는 정수형 配列이므로
오프셋
은 i*4(=i<<2)바이트
t3 := t1 + t2 ; t3에는 b[i]의 어드레스가 設定됨
*t3 := t0 ;
포인터
를 利用하여 貯藏
i := i + 1
goto L1
L3:
같이 보기
[
編輯
]
外部 링크
[
編輯
]