9. 중간언어 9-1. 소개 9-2. Polish표기법 9-3. 3-주소 코드 9-4. 트리 구조 코드 9-5. 가상 기계 코드 9-6. 중간 언어의 선택
9-1. 소 개 중간 언어의 등장 배경 초창기의 컴파일러 : 단일 패스 컴파일러 프로그래밍 언어의 다양화 9-1. 소 개 중간 언어의 등장 배경 프로그래밍 언어의 다양화 컴퓨터 하드웨어의 급격한 발전 많은 컴파일러 작성 요구 컴파일러의 생산 기술도 빠르게 발전 초창기의 컴파일러 : 단일 패스 컴파일러 원시 프로그램을 중간 코드 생산 없이 직접 목적 코드로 번역
중간언어 사용의 장점 컴파일러를 기능적으로 독립적인 여러 모듈들로 구성 컴파일러 자체의 이식성(portability) 증가 중간언어 사용의 장점 컴파일러를 기능적으로 독립적인 여러 모듈들로 구성 컴파일러 자체의 이식성(portability) 증가 고급 원시 언어와 저급 목적 코드간의 의미적인 차이를 이어주는 교량 역할을 중간 코드가 담당 번역과정이 좀 더 쉽게 표현, 효율적 처리 중간 코드를 이용하여 최적화를 수행함으로써 기계와 독립적인 최적화가 가능 인터프리티브 컴파일링(interpretive compiling) 시스템에서 인터프리터를 이용하여 실행
1. Polish 표기법 … Postfix 표현, IR 중간언어 형태에 따른 4 가지 부류 1. Polish 표기법 … Postfix 표현, IR 2. 3-주소 코드 … Triple, Quadruple, Indirect Triple 3. 트리 주소 코드 … AST, TCOL, DIANA 4. 가상 기계 코드 … P-코드, EM-코드, U-코드, 바이트코드, .NET IL
9-2. Polish표기법 폴란드식 표기법으로 Lucasiewiez가 개발한 가장 오래된 중간 코드 형태 Fortran 컴파일러에서 산술 연산식을 위한 중간 코드로 사용 특히, Basic 같은 인터프리터에서 중간 코드로 많이 사용 prefix polish 표기법과 postfix polish 표기법 <예> 산술식 A = B + C *D / E에 해당하는 postfix 표현 A B C D * E / + =
9-3. 3-주소 코드( Three address code) 정의 : 중간 코드를 한 개의 연산자와 두 개의 피연산자로 구성 <예> A := B op C <예4> C 언어 문장 a = b * (c + d); 에 대한 3-주소 코드( p381| p359) (t1 := c + d) (t2 := b * t1) (a := t2)
3-주소 코드 가장 널리 알려진 형태 : triple과 quadruple 차이점은 결과값을 갖는 피연산자의 유무 triple : 그 자체에 값을 저장하여 triple 번호로 참조 <예 5> p382| p360 참조
9-4. 트리 구조 코드 정의 원시 프로그램의 트리 구조 표현은 프로그램의 의미를 보다 효율적으로 표현할 수 있는 방법 코드의 특성상 손쉽게 재구성이 가능 최적화 컴파일러의 중간 언어로 가장 적합한 표현 트리 구조 표현 방법 1. 파스 트리 2 . 추상 구문 트리( AST : Abstract Syntax Tree) : 파스트리에서 불필요한 중복된 정보를 제거한 것
TCOL(Tree structured COmmon Language) 트리 형태를 갖는 중간 언어로 컴파일러의 후단부를 자동화하기 위한 여러 가지 명세에 이용 AST가 고급에 가까운 반면, TCOL은 비교적 중간 레벨 TCOL : AST에다 의미 분석한 결과를 반영한 트리 언어 종속 부분과 기계종속 부분을 분리하는데 유용 하게 사용 <예 9> p388| p365 참조 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-5. 가상 기계 코드 (p391| p368~ ) 포터블 컴파일러(portable and adaptable compiler) 컴파일러를 전단부 부분과 후단부 부분으로 분리, 잘 정의된 인터페이스를 사용하여 이 두 부분을 연결해 줌으로써 보다 이식 가능하고 적용 가능한 컴파일러 연결방법은 가상 기계를 설정, 이 기계의 명령어 집합을 중간 언어로 사용하여 전단부 부분과 후단부 부분을 연결하는 방법
포터블 컴파일러의 모델 가상 기계 코드의 종류 P- 코드 EM-코드 U-코드 바이트 코드 .NET IL 중간언어 목적 코드 원시프로그램 전단부 후단부 목적 기계 실행 가상 기계 인터프리터 실행
1) P-코드 Pascal 컴파일러를 제작하는데 사용된 중간언어 Pascal-P 컴파일러는 Pascal 프로그램을 입력 받아 P-코드를 생성 P-기계는 스택 컴퓨터로 네 개의 특수 레지스터와 기억 공간으로 구성 PC-Program Counter SP-Stack Pointer MP-Mark Pointer NP-New Pointer
2) EM-코드 ACK에서 중간 언어로 사용 ACK(Amsterdam Compiler Kit) 14 장 참조 Algol 형태의 원시 언어와 byte machine 형태의 목적 기계에 적합한 EM-기계 설정 언어에 대한 전단부와 목적 기계에 대한 후단부 제공 compiler 쉽게 제작, 컴파일러 자동화 도구 의사 명령어와 EM 명령어로 구분, 각 명령어는 상수, 명칭 등과 같은 피연산자를 갖을 수 있다. 의사 명령어 기억 장소를 확보 상수 정의를 위한 기능 분리 컴파일이나 링킹에 관련된 기능을 수행
3) U-코드 Stanford 대학에서 제작한 포터블 Pascal 컴파일러에서 사용한 중간 형태로서 가상적인 스택 기계에 근거 모든 변수에 대한 주소는 두 개의 투플(B, O)로 구성 B는 블록의 번호를 의미 O는 블록의 시작으로부터의 오프셋 <예 11> p397| p374 <예 12> p398| p375
4) 바이트 코드(byte code) 자바 프로그래밍 환경에서 지원하는 중간 언어 이 기종간의 실행 환경에 적합하게 설계된 스택 기반의 가상 기계 코드 자바 가상 기계(JVM : Java Virtual Machine)의 명령어 집합은 바이트 코드 인터프리터 방식과 JIT(Just-In-Time) 컴파일러 방식에 의해 실행 <그림 9.8> 자바 가상 기계 <표 9.1> p409| p386 <예 16> p410| p386 자바 컴파일러 JVM 자바 프로그램 바이트 코드 실행 결과
5) .NET IL .NET 환경에서 언어 통합을 위해 설계된 중간 언어 MSIL(Microsoft Intermediate Language)라고도 부름 .NET IL은 하드웨어 및 플랫폼에 독립적이고 실행은 JIT(Just-In-Time) 방법 사용 .NET 플랫폼에서는 C#, Managed C++, VB.NET 등 다양한 프로그래밍 언어 수용
9-6. 중간 언어의 선택 중간언어의 요건 중간 레벨성 효율적인 처리의 적합성 확장성 외부 표현성 기계 종속과 언어 종속의 분명한 구분성 ILS : 소스 언어에 의존적, 고급에 가까움 ILT : 목적 기계에 의존적, 그 자체에 변수의 주소 계산, 자료형 변화, 형에 따른 연산자 등이 모두 반영된 형태 전단부 후단부 ILS to ILT ILS ILT Source Target 두 개의 중간 언어를 갖는 컴파일러
[표 9.2] 중간 언어의 비교(p414| p391) Polish Notation Three Address Code Structured IL Criteria Post IR Quadra Triple AST TCOL Abstract Machine Intermediate level C B A source to IL translation IL to target interpretation efficient processing optimization external representation extensibility clean separation A : 좋다 B : 보통이다 C : 나쁘다