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--