3주소코드
Three-address code컴퓨터 과학에서 3주소 코드[1](흔히 TAC 또는 3AC로 약칭)는 코드 개선 변환의 구현에 도움이 되도록 컴파일러를 최적화하여 사용하는 중간 코드다.각 TAC 명령에는 최대 3개의 피연산자가 있으며, 일반적으로 할당과 이진 연산자의 조합이다.예를 들어,t1 := t2 + t3피연산자가 적은 지시사항이 발생할 수 있음에도 불구하고, 이 문장에서 피연산자 3명의 사용에서 이름이 유래되었다.
3주소 코드는 컴파일러 내에서 중간 언어로 사용되기 때문에 피연산자는 구체적인 메모리 주소나 프로세서 레지스터가 아니라 레지스터 할당 중에 실제 주소로 변환될 상징적인 주소일 가능성이 높다.일반적으로 세 개의 주소 코드가 컴파일러에 의해 생성되기 때문에 피연산자 이름이 순차적으로 번호가 매겨지는 것도 드문 일이 아니다.
3주소 코드의 정교함은 A-정규형(ANF)이다.
예
3주소 코드로, 이것은 몇 가지 개별 명령으로 나누어진다.이 지침들은 조립 언어로 더 쉽게 번역된다.또한 코드 축소를 위한 일반적인 하위 표현들을 탐지하는 것이 더 쉽다.다음 예에서 하나의 계산은 여러 개의 작은 계산으로 구성된다.
# [Quadratic 방정식]에 대한 하나의 용액을 계산한다.x = (-b + sqrt(b^2 - 4*a*c)) / (2*a) | t1 := b * b t2 := 4 * t3 : t2 * t4 := t1 - t3 t5 := sqrt(t4) t6 := 0 - b t7 := t5 + t6 : 2 * t9 := t7 / t8 x := t9
|
3주소 코드는 조건부 및 무조건 점프와 메모리에 접근하는 방법을 가질 수 있다.그것은 또한 기능을 호출하는 방법이 있을 수도 있고, 점프로 이것을 줄일 수도 있다.이러한 방식으로 3주소 코드는 제어 흐름 분석에 유용할 수 있다.다음의 C 유사 예에서, 루프는 0과 9 사이의 숫자의 제곱을 저장한다.
... 을 위해 (i = 0; i < 10; ++i) { b[i] = i*i; } ... | t1 := 0; i L1 초기화: t1 >= 10 goto L2; 조건부 점프 t2 := t1 * t1; i t3 := t1의 제곱; word-align address t4 := b + t3; pointer t1 := t1 + 1; 를 저장할 주소 i*i *t4 :=1을 통해 저장 i1로 증가 i1; 반복 루프 L2:
|
참고 항목
- 중간 언어
- 명령 집합 컴퓨터 감소
- 정적 단일 할당 양식(SSA)
참조
- ^ V., Aho, Alfred (1986). Compilers, principles, techniques, and tools. Sethi, Ravi., Ullman, Jeffrey D., 1942-. Reading, Mass.: Addison-Wesley Pub. Co. pp. 466. ISBN 0201100886. OCLC 12285707.