맨위로가기

3-어드레스 코드

"오늘의AI위키"는 AI 기술로 일관성 있고 체계적인 최신 지식을 제공하는 혁신 플랫폼입니다.
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.

1. 개요

3-어드레스 코드는 각 명령어가 연산 코드, 두 개의 피연산자, 결과값을 저장할 장소로 구성된 형태이다. x := y op z 와 같은 형태로 표현되며, 여기서 x, y, z는 변수, 상수 또는 임시 변수가 될 수 있고, op는 연산 코드를 나타낸다. 3-어드레스 코드는 각 명령어가 하나의 연산만을 수행하며, 여러 개의 연산으로 구성된 식은 여러 개의 명령으로 분해하여 표현한다. C언어 코드를 3-어드레스 코드로 변환하는 예시가 있으며, 어셈블리 언어로 쉽게 변환되고 공통 부분식 제거에 용이하다.

더 읽어볼만한 페이지

  • 컴파일러 구성 - 구문 분석
    구문 분석은 입력 데이터를 구조화된 형태로 변환하는 과정으로, 컴퓨터 언어에서는 소스 코드를 분석하여 추상 구문 트리를 생성하고, 자연어 처리에서는 텍스트의 문장 구조와 의미를 분석한다.
  • 컴파일러 구성 - 바이너리 재컴파일러
  • 컴파일러 - 바이너리 재컴파일러
  • 컴파일러 - 링커 (컴퓨팅)
    링커는 여러 모듈로 된 목적 파일을 결합해 실행 가능한 프로그램을 만들고, 정적/동적 링킹으로 라이브러리를 연결하며, 심볼 해결 및 재배치로 변수와 함수를 메모리 주소에 연결하는 소프트웨어 도구이다.
  • 명수 3 - 삼국지연의
    《삼국지연의》는 나관중이 유비를 중심으로 184년부터 280년까지의 삼국 시대를 배경으로 저술한 중국 4대 기서 중 하나인 역사 소설로, 격동적인 시대의 사건과 인물들의 활약상을 다루며 여러 나라에서 다양한 미디어로 각색되어 왔다.
  • 명수 3 - 삼국지
    진수가 쓴 《삼국지》는 위, 촉, 오 삼국의 역사를 기록한 기전체 역사서로, 위지, 촉지, 오지로 구성되어 있으며, 후대에 《삼국지연의》에 영향을 주고 동아시아 역사 연구에 중요한 자료로 쓰인다.
3-어드레스 코드
일반 정보
이름세 주소 코드
다른 이름삼중 주소 코드
TAC
유형중간 표현
특징
구성 요소주소 1
주소 2
결과
주소 유형이름
상수
임시 변수
연산자 유형산술
논리
복사
분기
인덱싱
프로시저 호출
주소 및 역참조
코드 예시t1 = a + b
사용 예시
사용되는 곳컴파일러
중간 표현

2. 형식

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

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

여기서 ''x'', ''y'', ''z''는 변수나 상수, 혹은 컴파일러에서 생성한 일시 변수가 될 수 있다. ''op''은 명령 코드이며, 산술 연산에 해당한다. 여러 개의 연산으로 구성된 식은 이대로는 3-어드레스 코드로 표현할 수 없으므로, 여러 개의 명령으로 분해하여 표현한다.

3-어드레스 코드의 핵심은 각 명령이 기본적으로 연산 명령 1개에 상당하는 연산을 표현하고[3], 소스나 데스티네이션이 임의의 식이 아닌 단순한 1개의 변수 등이어야 한다는 점이다.

3. 예제

다음은 C언어 코드 예시이다.[1]

```c

int main(void)

{

int i;

int b[10];

for (i = 0; i < 10; ++i) {

b[i] = i*i;

}

}

```

위 코드는 아래의 3-어드레스 코드로 변환할 수 있다.[1]

```

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]의 어드레스가 설정됨


i := i + 1

goto L1

L3:

```

다음은 이차 방정식의 해를 구하는 코드의 3-어드레스 코드 변환 예시이다.[1]

```

t1 := b * b

t2 := 4 * a

t3 := t2 * c

t4 := t1 - t3

t5 := sqrt(t4)

t6 := 0 - b

t7 := t5 + t6

t8 := 2 * a

t9 := t7 / t8

x := t9

4. 특징 및 장점

3-어드레스 코드는 복잡한 연산을 여러 개의 간단한 명령으로 분해하여 표현하는 중간 코드의 한 형태이다. 각 명령어는 최대 3개의 오퍼랜드를 가질 수 있으며, 이는 어셈블리 언어와 유사한 구조를 가진다.[2]
특징


  • 단순성: 복잡한 표현식을 여러 개의 간단한 명령으로 분해하여 코드를 단순화한다. 예를 들어, `p := x + y * z` 와 같은 식은 다음과 같이 두 개의 명령으로 나눌 수 있다.[2]


:t_1 := y \times z

:p := x + t_1

  • 최적화 용이성: 3-어드레스 코드는 코드 최적화를 위한 다양한 기법을 적용하기에 용이하다. 예를 들어, 공통 부분식 제거를 통해 중복 계산을 줄일 수 있다.

  • 제어 흐름 분석: 조건부 분기(예: `if i < 10 goto L2`) 및 무조건 분기(예: `goto L3`) 명령어를 포함하여 프로그램의 제어 흐름을 명확하게 표현할 수 있다. 이를 통해 프로그램의 실행 흐름을 분석하고 최적화할 수 있다.[3]

  • 기계어 변환 용이성: 3-어드레스 코드는 어셈블리 언어와 유사한 구조를 가지므로, 기계어 코드로의 변환이 비교적 쉽다.

장점3-어드레스 코드는 컴파일러의 중간 단계에서 사용되어 소스 코드를 최적화하고 기계어 코드로 변환하는 과정을 효율적으로 수행하는 데 기여한다. 특히, 다음 C 언어 코드 예시는 3-어드레스 코드가 어떻게 활용되는지 보여준다.

```c

int main(void)

{

int i;

int b[10];

for (i = 0; i < 10; ++i) {

b[i] = i*i;

}

}

```

위 코드는 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]의 어드레스가 설정됨
i := i + 1

goto L1

L3:

5. 정적 단일 대입 (SSA)

정적 단일 대입(SSA)은 3-어드레스 코드를 개선한 형태이다. 3-어드레스 코드에서 발전된 형태로, 모든 변수가 한 번만 할당되는 특징을 갖는다.[1]

6. 기타

3-어드레스 코드라는 이름에도 불구하고, 피연산자가 3개가 아닌 경우도 있다.[3] 3-어드레스 코드의 핵심은 각 명령어가 기본적으로 하나의 연산만을 표현하고,[3] 소스와 대상이 되는 값이 식이 아닌 단순한 변수여야 한다는 점이다.

프로세서명령어 집합에서 3-오퍼랜드 형식을 사용하는 RISC 프로세서에서 3-어드레스 코드가 효율적으로 사용될 수 있다. RISC 프로세서는 명령어 형식에서 메모리 어드레싱을 단순화하고 남은 공간을 활용하여, 2-오퍼랜드 형식 대신 최적화에 유리한 3-오퍼랜드 형식을 사용한다. 예를 들어, DEC Alpha 프로세서의 R31과 같은 제로 레지스터를 활용하면,

:y := -x;

와 같은 단항 연산을

:y \leftarrow R31 - x

와 같이 3-오퍼랜드 형식으로 표현할 수 있다.

참조

[1] 서적 Compilers, principles, techniques, and tools https://archive.org/[...] Addison-Wesley Pub. Co 1986
[2] 문서
[3] 문서



본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.

문의하기 : help@durumis.com