9. 중간언어 9-1. Polish표기법 9-2. N-투플 표기법 9-3. 트리 구조 코드 9-4. 추상 기계 코드 9-5. 중간 언어의 선택
9-1. Polish표기법 중간 언어의 등장 배경 프로그래밍 언어의 다양화와 컴퓨터 하드웨어의 급격한 발전은 많은 컴파일러의 작성을 요구하게 되었으며 이에 따른 컴파일러 의 생산 기술도 빠르게 발전하였다. 초창기의 컴파일러는 이론 정립이 없는 상태에서 설계되어진 단일 패스 컴파일러로서 원시 프로그램을 중간 코드 생산 없이 직접 목적 코드로 번역 하였다.
중간언어를 사용 함으로써의 장점 컴파일러를 기능적으로 독립적인 여러 모듈들로 구성하는 것이 가능해졌다. 원시 프로그램의 이식성을 증가 시킬 수 있다. 고급 원시 언어의 저급 목적 코드간의 의미적인 차이를 이어주는 교량 역할을 중간 코드가 담당해줌으로써 번역과정이 좀더 쉽게 표현되고 효율적으로 처리될 수 있다. 중간 코드를 이용하여 최적화를 수행함으로써 기계와 독립적인 최적화가 가능해졌다. 인터프리티브 컴파일링 시스템에서 인터프리터를 이용하여 실행 할 수 있다.
9-2. N-튜플 표기법 정의 중간 토드를 한 개의 연산자와 그에 해당하는 피연산자들의 튜플 형태로 정의 한 것 부분은 피연산자를 나타낸다. 가장 널리 알려진 형태로 triple과 quadruple이 있는데, 차이점은 결과값을 갖는 피연산자의 유무인데 quadruple은 마지막 피연산자에 결과값을 저장하고 triple은 그 자체에 값을 저장하여 triple 번호로 참조된다.
Triple표현의 형태 (연산자, 피연산자1, 피연산자2) 일련의 triple들은 순서에 따라 차례로 번호가 부여되면 각 triple 의 연산 결과는 그 triple번호로 저장된다. triple의 결과를 triple번호로 할당함으로써 코드 최적화에서 흔히 발생하는 코드 이동 시에 이동되는 triple를 지칭하는 triple 코드 들의 피연산자 또한 바꾸어 주어야 하므로 triple 형태는 최적화를 위해서는 부적합한 중간 언어이다.
Quadruple 표현의 형태 (연산자, 피연산자1, 피연산자2, 결과) <결과>는 연산의 결과를 지칭하는데 보통 임시 변수가 되면 후에 목적 기계의 레지스터 또는 주기억 장치에 배정된다. Quadruple 코드는 triple과는 달리 결과 주소 부분(result address field)을 포함하고 있어 코드 이동이 용이하므로 최적화에 알맞은 중간 코드 형태이다. 단점으로는 임시 변수를 다루어야 한다.
9-3. 트리 구조 코드 정의 구문 트리 원시 프로그램의 트리 구조 표현은 프로그램의 의미를 보다 효율적으로 표현할 수 있는 방법이 되며 코드의 특성상 손쉽게 재구성이 가능하므로 최적화 컴파일러의 중간 언어로 가장 적합한 표현 구문 트리 파스 트리에서 불필요한 중복된 정보를 제거한 것 구성은 단말 노드와 비단말 노드로 이루어지는데 단말 노드는 상수 또는 변수를 나타내게 되고 비단말 노드는 구문 트리 연산자를 나타낸다.
TCOL(Tree structured Common Language) 트리 형태를 갖는 중간 언어로 컴파일러의 후단부를 자동화 하기 위한 여러 가지 명세에 이용 AST가 고급에 가까운 반면 TCOL은 비교적 중간 레벨이다. TCOL은 목적 기계 명령어의 어떤 가정도 배제된 파스트리와 유사한 표현인 점에서는 고급이고, 언어 구조에 대한 어떤 가정도 배제하고 모든 자료에 대한 주소를 인덱스 계산, 페치, 저장 등으로 분해하고 자료형의 표현을 분리하는 점에서 저급이다. 언어 종속 부분과 기계종속 부분을 분리하는데 유용하게 사용 Semantic Analyzer AST TCOL AST와 TCOL의 관계
Diana(Descriptive Intermediate Attributed Notation for Ada) TCOL를 생성과정 Diana(Descriptive Intermediate Attributed Notation for Ada) 컴파일러의 전반부와 후반부 사이의 정보 교환에 적당하게 설계 된 Ada 프로그램의 중간 형태이다. 네 가지 속성 구조적 속성 어휘적 속성 의미적 속성 코드 속성 스캐너 파서 중간 코드 생성기 원시프로그램 AST TCOL
9-4. 추상 기계 코드 포터블 컴파일러 컴파일러를 원시 언어에만 관계되고 목적 기계에 무관한 전단부 부분과 목적 기계에만 관계되는 후단부 부분으로 분리하고 잘 정의된 인터페이스를 사용하여 이 두 부분을 연결해 줌으로써 보다 이식 가능하고 적용 가능한 컴파일러 연결방법은 추상 기계를 설정하여 이 기계의 명령어 집합을 중간 언어로 사용하여 전단부 분과 후단부 부분을 연결하는 방법
포터블 컴파일러의 모델 P 코드 Pascal 컴파일러를 제작하는 데 사용된 중간언어로 Pascal-P 컴파일러는 Pascal 프로그램을 입력 받아 P-코드 를 생성한다. P-기계는 스택 컴퓨터로 네 개의 특수 레지스터와 기억 공간 으로 구성 PC-Program Counter SP-Stack Pointer MP-Mark Pointer NP-New Pointer 중간언어 목적 코드 원시프로그램 전단부 후단부 목적 기계 추상 기계 인터프리터
MP current activation record EM-코드 의사 명령어와 EM명령어로 구분되면 각 명령어는 상수, 명칭 등과 같은 피연산자를 갖을 수 있다. 의사 명령어는 기억 장소 를 확보하거나 상수 정의를 위한 기능을 갖으며, 또한 어셈블 리 컴파일이나 링킹에 관련 된 기능을 수행한다. CODE PC STORE stack MP current activation record SP NP heap constant area
U-코드 P-코드에서 코드 최적화의 기능을 높이기 위해 확장된 중간 언어로서 가상적인 스택 기계에 근거를 두고 있다. 스택 기계는 모든 연산을 스택에서 수행하기 때문에 변수들의 주소는 모든 스택에 대한 주소 부여 방법을 이용 변수에 대한 주소는 두개의 튜플(B, O)로 구성되는데 여기서 B 는 블록의 번호를 의미하며 O는 블록의 시작으로부터의 오프셋 을 나타낸다.
9-5. 중간 언어의 선택 중간언어의 요건 중간 레벨성 원시언어에 대해 저급으로 목적 기계에 대해 고급의 성격을 유지 해야 하는 것 효율적인 처리의 적합성 원시언어에서 중간언어로의 번역 고급에 치우친 중간 코드는 원시 언어에서 중간언어로 번역이 쉬운 반면 중간 언어에서 목적 언어로 번역이 어려우며, 저급에 가까운 것은 반대 현상이 발생
인터프리테이션 가상적이 기계 코드가 가장 우수성을 나타내는데, 그 이유는 가상적인 기계의 설계 시 효율적인 인터프리 테이션이 고려 되었기 때문이다. 최적화 쉽게 코드를 이동할 수 있는 quadruple이 효과적이며 트리 구조도 고급 언어의 제어구조를 내포할 수 있으며 트리의 재구성이 쉽기 때문에 최적화의 적합한 형태 외부 표현성 트리 구조 만이 선형구조가 아닌 관계로 단점을 나타내며 확장성 문제에 있어서는 비교적 모든 중간 언어들이 좋은 편이나 가상적인 기계 코드만이 약간의 결함을 보인다.
Source ILS ILT Target A: 좋다 B: 보통이다 C: 나쁘다 전단부 ILS ILS to ILT ILT 후단부 Target 두개의 중간 언어를 갖는 컴파일러 ILS의 특징은 상당히 소스 언어에 의존적이고 고급에 가까우며 ILT는 목적 기계에 의존적이며 그 자체에 변수의 주소 계산, 자료형 변화, 형에 따른 연사자 등이 모두 반영된 형태를 갖는다.