2. Compiler Lecture Note, Intermediate Language Page 2
Contents
• Introduction
• Polish Notation
• Three Address Code
• Tree Structured Code
• Abstract Machine Code
• Concluding Remarks
3. Compiler Lecture Note, Intermediate Language Page 3
• Compiler Model
Source
Program
Lexical Analyzer
Syntax Analyzer
Semantic Analyzer
Intermediate
Code Generator
tokens
AST
Front-End
Code Optimizer
Target Code Generator
IC
Back-End
IL
Object
Program
Front-End- language dependant part
Back-End - machine dependant part
Introduction
4. Compiler Lecture Note, Intermediate Language Page 4
• IL 사용의 장점
– Compiler를 기능적으로 독립적인 Modul들로 구성
– Compiler 자체의 portability 증가
– Easy Translation
• 고급 소스 언어와 저급 목적 코드간의 semantic gap를 이어주는 교량 역할
– 중간코드를 이용하여 optimization를 수행
• 기계와 독립적인 최적화 가능
• 기계어로 바뀐 상태에서 행하는 것보다 훨씬 효율적으로 최적화 수행
– Interpretive compiling 시스템에서 interpreter를 이용하여 실행
• IL사용의 결점
– 목적 코드로 직접 번역하는 것 보다 컴파일 시간이 더 많이 소요
– 비효율적인 코드 생산
• 중간 코드로부터 목적 코드로의 번역 과정 필요
• 중간언어 단계에서 간단한 최적화를 통해 극복
5. Compiler Lecture Note, Intermediate Language Page 5
• Two level Code Generation
• ILS
– 소스로부터 자동화에 의해 얻을 수 있는 형태
– 소스 언어에 의존적이며 high level이다.
• ILT
– 후단부의 자동화에 의해 목적기계로의 번역이 매우 쉬운 형태
– 목적기계에 의존적이며 low level이다.
• ILS to ILT
– ILS에서 ILT로의 번역이 주된 작업임.
Source Front-End ILS ILS-ILT ILT Back-End Target
6. • IL의 종류
– Polish Notation Prefix notation, IR
– Three Address Code Triple, Quadruple, Indirect Triple
– Tree Structured Code AST, TCOL, Diana
– Abstract Machine Code P-code, EM-code, U-code, Bytecode
Compiler Lecture Note, Intermediate Language Page 6
7. Compiler Lecture Note, Intermediate Language Page 7
☞ Polish mathematician Lucasiewiez invented the parenthesis-free notation.
• Postfix(Suffix) Polish Notation
• earliest IL
• popular for interpreted language - SNOBOL, BASIC
– general form :
e1 e2 ... ek OP (k ≥ 1)
where, OP : k_ary operator
ei : any postfix expression (1 ≤ i ≤ k)
Polish Notation
8. Compiler Lecture Note, Intermediate Language Page 8
– example :
if a then if c-d then a+c else a*c else a+b
〓〉a L1 BZ c d - L2 BZ a c + L3 BR
L2: a c * L3 BR L1: a b + L3:
– note
1) high level: source to IL - fast & easy translation
IL to target - difficulty
2) easy evaluation - operand stack
3) optimization 부적당 - 다른 IL로의 translation 필요
4) parentheses free notation - arithmetic expression
– interpretive language에 적합
Source Translator Postfix Evaluator Result
9. Compiler Lecture Note, Intermediate Language Page 9
• most popular IL, optimizing compiler
• General form:
A := B op C
where, A : result address
B, C : operand addresses
op : operator
(1) Quadruple - 4-tuple notation
<operator>,<operand1>,<operand2>,<result>
(2) Triple - 3-tuple notation
<operator>,<operand1>,<operand2>
(3) Indirect triple - execution order table & triples
Three Address Code
10. Compiler Lecture Note, Intermediate Language Page 10
– example
• A ← B + C * D / E
• F ← C * D
Quadruple Triple
Indirect Triple
Operations Triple
* C D T1 (1) * C D 1.(1) (1) * C D
/ T1 E T2 (2) / (1) E 2.(2) (2) / (1) E
+ B T2 T3 (3) + B (2) 3.(3) (3) + B (2)
T3 A (4) A (3) 4.(4) (4) A (3)
* C D T4 (5) * C D 5.(1) (5) F (1)
T4 F (6) F (5) 6.(5)
11. Compiler Lecture Note, Intermediate Language Page 11
• Note
• Quadruple vs. Triple
– quadruple - optimization 용이
– triple - removal of temporary addresses
⇒ Indirect Triple
• extensive code optimization 용이
– IL rearrange 가능 (triple 제외)
• easy translation - source to IL
• difficult to generate good code
– quadruple to two-address machine
– triple to three-address machine
12. Compiler Lecture Note, Intermediate Language Page 12
• Abstract Syntax Tree
– parse tree에서 redundant한 information 제거.
• ┌ leaf node --- variable name, constant
└ internal node --- operator
– 예 : a * b + c / d a[i] = exp;
Tree Structured Code
add
divmul
b ca d
assign
expindex
ia
13. Compiler Lecture Note, Intermediate Language Page 13
• Tree Structured Common Language(TCOL)
– Variants of AST - containing the result of semantic analysis.
Example) int a; float b;
...
b = a + 1;
AST TCOL
add
1a
assign
b float
assign
b
addi
1
a
14. Compiler Lecture Note, Intermediate Language Page 14
Abstract Machine Code
• Abstract Machine을 이용한 portable compiler의 모델
• Abstract Machine의 설계
– source language의 기본 연산과 모드에 근거
• 기본 연산은 source program을 구성하는 가장 간단하고 대부분 직
접적인 연산에 대응
• 기본적인 자료 모드는 source language의 가장 간단한 형
• 기본적인 모드와 연산들이 Abstract Machine의 명령어를 결정
– 실제 컴퓨터에 효율적으로 설치 가능 여부도 고려
front-end back-end
target
machine
abstract machine
interpreter
source
program interface target code
abstract
machine
code
15. Compiler Lecture Note, Intermediate Language Page 15
• Motivation
• ┌ rapid development of machine architectures
└ proliferation of programming languages
– portable & adaptable compiler design --- P_CODE
• porting --- rewriting only back-end
– compiler building system --- EM_CODE
M front-ends
N back-ends
+ M compilers for N target machines
16. Compiler Lecture Note, Intermediate Language Page 16
• Pascal-P Code
– Pascal compiler를 제작하는데 사용된 intermediate language
• Pascal-P compiler
– P-코드에서 실제 기계로의 번역기 또는 P-code interpreter를 사용함
으로써 쉽게 이식이 가능
– 소스 언어로부터 P-code로의 translation과 interpretation이 비교적 쉽
게 설계
– P-code에 대한 가상 기계가 P-기계이며, P-기계도 모든 연산이
스택에서 행해지는 가상적인 스택 기계(hypothetical stack
machine)
Pascal P CompilerPascal Program P-code
17. Compiler Lecture Note, Intermediate Language Page 17
• EM-code
– ACK 중간 언어
• ACK(Amsterdam Compiler Kit)
– Algol 형태의 소스 언어와 바이트 기계 형태의 목적 기계에 적합한
EM-기계라는 가상 기계를 설정하고 언어에 대한 전단부와 목적 기
계에 대한 후단부를 제공함으로써 사용자가 필요한 컴파일러를 쉽
게 제작하도록 도와주는 기구
– 가상적인 스택의 개념을 둔 기계 구조
– 소스 언어로부터 EM-코드로의 번역과 EM-코드의 인터프리테
이션이 비교적 쉽게 설계
– EM-코드를 이용하여 제작한 컴파일러는 EM-코드에서 목적
기계로의 번역기 또는 EM-코드 인터프리터만을 교환함으로
써 쉽게 이식 가능
18. • U-code
– Portable Pascal compiler에서 사용한 중간 형태
– 가상적인 스택 기계에 근거
• 모든 명령어들은 가상 스택을 기준으로 정의
• 스택에서 모든 연산 수행
– 스택 기계는 모든 연산을 스택에서 실행하므로 변수들의 주소
는 스택에 대한 주소 부여 방법 이용
• 모든 변수에 대한 주소는 두 개의 항목(B, O)의 형태로 구성
– B : 블록의 번호
– O : 블록의 시작으로부터의 offset
– 예
– 블록 번호는 프로그램 main이 1, procedure P가 2, procedure Q가 3
– procedure Q에 선언된 변수 i와 j의 주소는 각각 (3, 1)과 (3, 2)로 표현
Compiler Lecture Note, Intermediate Language Page 18
program main
procedure P
procedure Q
var i : integer;
j : boolean;
19. • U-code 명령어들의 형태와 기능에 따른 분류
1. 단일 명령어 ⇒ notop, neg
2. 이진 명령어 ⇒ add, sub, mult, divop, nodop, swp
andop, orop, gt, lt, ge, le, eq, ne
3. 스택 운영 명령어 ⇒ lod, str, ldc, ldr
4. 제어 흐름 명령어 ⇒ ujp, tjp, fjp
5. 범위 검사 명령어 ⇒ chkh, chkl
6. 간접 주소 명령어 ⇒ ixa, sta
7. procedure 명령어 ⇒ cal, ret, ldp, proc, endop
8. 기타 명령어 ⇒ bgn, sym
Compiler Lecture Note, Intermediate Language Page 19
20. • U-code로 작성된 프로그램의 전체 구조
– 먼저 global variable의 속성이 나오며, 그 다음에 procedure의 code가
나올 수 있으며, 마지막에 주 프로그램에 대한 code가 나옴
– 하나의 procedure는 local variable의 속성과 code로 구성
– 맨 처음, bgn(begin)으로 제어가 넘어와 실행이 시작
Compiler Lecture Note, Intermediate Language Page 20
sym(s) global variable(s)
<name> proc
sym(s) for procedure
codes for procedure
···
endop
bgn
codes for main program
···
endop
21. • Bytecode
– Java 프로그래밍 환경에서 지원하는 IL로서 이기종간의 실행 환경
에 적합하도록 설계된 스택 기반의 가상 기계 코드
– Java compiler
• Java 프로그램을 입력 받아 JVM(Java Virtual Machine)의 명령어 집합인
byetcode 생성
• Intermediate code 형태인 bytecode는 이기종간의 실행 환경에 적합하도
록 설계되어 portability과 유연성이 높다.
• interpreter 방식과 JIT(Just-In-Time) compiler 방식에 의해서 실행
Compiler Lecture Note, Intermediate Language Page 21
Java CompilerJava Program Bytecode JVM 실행 결과
22. – Bytecode는 일반적인 Abstract Machine Code의 특징을 모두 포함
– Bytecode 만의 특징
• 네트워크 상에서 전송 효율을 위해 code를 가능한 작고 간결하게 설계
• Java language의 기능을 반영하는 명령어가 존재
– 배열, 클래스, 예외, 스레드 등을 직접 다룰 수 있는 명령어 포함
• 자료형에 따라서 명령어가 각기 따로 존재
– ex) iadd 는 int 덧셈, fadd는 float 덧셈
• 복합기능을 갖는 명령어를 제공
– ex) pop2는 stack에서 연속해서 두 번을 pop하는 기능
Compiler Lecture Note, Intermediate Language Page 22
23. • IL의 4가지 분류
– Polish Notation Postfix notation, IR
– Three Address Code Triple, Quadruple, Indirect Triple
– Tree Structured Code AST, TCOL, Diana
– Abstract Machine Code P-code, EM-code, U-code, Bytecode
• IL이 갖추어야 할 요건
1. 중간 레벨성(Intermediate level)
• 소스 언어와 비교해서는 low-level이고 목적 기계와 비교해서는 high-
level의 성격을 유지해야 하는 속성을 의미
• IL이 너무 한쪽으로 치우쳐 있으면 IL과 다른 한쪽과의 의미적 차이가
커져 번역이 어려워지며 또한 이식성 결여
– Postfix polish notation과 syntax tree는 high-level
– Triple, quadruple는 비교적 high-level
– Abstract Machine Code 는 비교적 low-level
– TCOL만이 비교적 intermediate level이 좋은 언어
Compiler Lecture Note, Intermediate Language Page 23
24. 2. 효율적인 처리의 적합성(Efficient processing)
• 소스 언어에서 중간 언어로 번역, 중간언어에서 목적 언어로 번역
– High-level에 치우친 중간 코드는 소스 언어에서 IL로 번역이 쉬운 반면 IL에서
목적 언어로 번역이 어려움
– Low-level 에 가까운 것은 반대 현상이 나타남
• 인터프리테이션(Interpretation)
– Abstract machine code가 가장 우수
– Postfix 표현도 operand stack을 이용하여 쉽게 interpretation을 할 수 있는 형태
– Tree 구조 코드는 tree 구조상 interpretation에 가장 많은 결함을 보임
• 최적화(Optimization)
– 쉽게 코드를 이동할 수 있는 quadruple이 효과적이며 tree 구조도 고급 언어의
제어 구조를 내포할 수 있으며 tree의 재구성이 쉽기 때문에 optimization에 적
합한 형태
– Postfix 표현이나 triple 표현은 연산의 결과가 위치에 영향을 미치지 때문에
optimization에 부적합
3. 외부 표현성 (External representation)
• Tree 구조 code만이 선형 구조가 아닌 관계로 단점을 나타냄
4. 확장성(Extensibility)
• 비교적 모든 중간 언어들이 좋은 편
• Abstract Machine Code만 약간의 결함
Compiler Lecture Note, Intermediate Language Page 24
25. 5. 이식성(Portability)
• 크게 영향을 주는 기계 종속성과 언어 종속성의 분명한 구분성에서는
TCOL과 가상 기계 코드가 가장 우수
• 소스 언어에 가까운 고급 표현인 postfix 표현과 AST는 부적당
• Intermediate Language의 비교
Compiler Lecture Note, Intermediate Language Page 25
IL
Criteria
Polish
Notation
Three Address
Code
Tree
Structured
Abstract
Machine
CodePost IR Quadra Triple AST TCOL
Intermediate level C B B B C A B
efficient
processing
source to IL
translation
A C B B A B C
IL to target
translation
C A B B C A A
interpretation A B B B C C A
optimization C B A C A A B
external representation B B A B C B A
extensibility A A A A A A B
clean separation C B B B C A A
A : 좋다
B : 보통이다
C : 나쁘다