3-어드레스 코드

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:

관련항목 
 중간언어
 RISC

외부 링크 
 Three-Address Code and Register Allocation
 CSc 453: A Three-Address Intermediate Code Instruction Set for C--

컴파일러
명수 3
컴파일러 구성