3-어드레스 코드

위키백과, 우리 모두의 백과사전.
이동: 둘러보기, 검색

3-어드레스 코드(Three-address code)는, 컴파일러에서 사용되는 중간 언어의 한 종류로, 컴파일러 최적화를 실현하는데 사용된다. '3-어드레스'로 불리는 것은 2개의 입력용과 1개의 출력용 메모리 주소 혹은 레지스터를 지정하는 형식이기 때문이다.

개요[편집]

3-어드레스 코드의 각 명령은 명령코드, 오퍼랜드1, 오퍼랜드2, 결과의 4-튜플 형태로 표현된다. 이는 다음과 같은 일반 식으로 표현할 수 있다.

x := y \, \operatorname{op} \, z\,

여기서 x, y, z 는 변수나 상수, 혹은 컴파일러에서 생성한 일시 변수가 될 수 있다. op은 명령 코드이며, 산술연산에 해당한다. 여러개의 연산으로 구성된 다음과 같은 식이 있다고 하자.

p := x + y \times z\,

이 식은 이대로는 3-어드레스 코드로 표현할 수 없으므로, 다음과 같이 2개의 명령으로 분해하여 표현할 수 있다.

t_1 := y \times z\,
p := x + t_1\,

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:

관련항목[편집]

외부링크[편집]