3-어드레스 코드
"오늘의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]
다음은 C언어 코드 예시이다.[1]
:
여기서 ''x'', ''y'', ''z''는 변수나 상수, 혹은 컴파일러에서 생성한 일시 변수가 될 수 있다. ''op''은 명령 코드이며, 산술 연산에 해당한다. 여러 개의 연산으로 구성된 식은 이대로는 3-어드레스 코드로 표현할 수 없으므로, 여러 개의 명령으로 분해하여 표현한다.
3-어드레스 코드의 핵심은 각 명령이 기본적으로 연산 명령 1개에 상당하는 연산을 표현하고[3], 소스나 데스티네이션이 임의의 식이 아닌 단순한 1개의 변수 등이어야 한다는 점이다.
3. 예제
```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]
:
:
- 최적화 용이성: 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]의 어드레스가 설정됨
- t3 := t0 ; 포인터를 이용하여 저장
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;
와 같은 단항 연산을
:
와 같이 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