1. Compiler의 탄생
- assembly language로 프로그램 작성하였으나, Target Machine이 바뀔 때마다 다시 짜야하는 불편함이 있었음.
- 1950년대 후반 최초의 FORTRAN Compiler 제작됨.
2. Compiler
- 입력으로 Source Program을 받음.
- Source Program 바탕으로 Target Machine에서 동작가능한 Target Program 생성(Source Program과 동등한 수준의 프로그램)
- 단점 : 컴파일이 모두 끝날 때까지 오류 파악과 수정이 불리함.
- 장점 : 실행코드 최적화에 유리
3. Interpreter and Compiler
- 입력으로 Source Program과 Program Input Data를 받음.
- 입력을 바탕으로 결과값을 출력.
- 단점 : 최적화된 프로그램이 아님
- 장점 : 소스와 데이터가 입력되어 결과가 빠르게 나오므로 코드 수정에 유리
4. Hybrid Compiler(Java)
- 입력으로 Source Program을 받음
- Translator를 이용 intermediate Program을 생성(Byte Code로 이루어진 프로그램)
- Byte Code를 실행 가능한 VIrtual Machine에 Intermediate Program과 Program Input Data를 넣음
- Virtual Machine에서 결과값 출력.
5. Cross Compiler
- Development Environment와 Execution Environment가 다를 경우 사용
ex) 윈도우에서 안드로이드 어플을 개발하는 경우
6. Language Processing System
1) preprocessor : 주석, define, include 등 처리할 문장들을 처리한다.(아직 High Language)
2) Compiler : preprocessor 결과물로 Assembly Code를 생성
3) Assembler : Assembly Code로 Machine Code를 생성
4) Linker/loader : Library 등 호출해 병합 후, 수행가능한 코드 생성
7. Structure of Compiler
1) Lexical Analyzer(Scanner)
- 컴파일러에서 다루기 쉬운 Token으로 바꿔 줌.
- Token 바탕으로 Symbol Table 생성
2) Syntax Analyzer(Parser)
- 문법이 맞는지 확인.
- Syntax Tree를 생성.
3) Semantic Analyzer
- Symbol Table을 참조해 각 Token의 의미를 분석.
4) Intermediate Code Generator
- 분석된 코드를 Intermediate Code로 바꿔줌.
5) Machine-independent Code Optimizer
- 중복 등 Intermediate Code가 최적화 되도록 코드 수정
6) Code Generator
- Target Machine에 맞도록 Machine Code 생성.
7) Machine-Dependent Code Optimizer
- 해당 Machine에 최적화 되도록 Machine Code 수정.
8. Phases 와 Passes
1) Phase : 컴파일러를 구성하는 논리적 component, 모든 컴파일러에 필수.
2) Pass : 입력 데이터로 출력을 만들어 내는 것.
3) one-pass compiler : 중간 산출물 없이 바로 Machine 코드 생성(성능이 제한적이다)
4) multi-pass compiler : 중간에 다양한 산출물 생성 후 산출물 바탕으로 Machine 코드 생성.(분석이 많아저 성능이 뛰어남)
9. Two-pass Compiler
- 별도의 중간 언어 코드를 생성해 중간 언어 코드로 Machine Code를 생성함.
- 장점 : 언어마다 compiler를 만들어야 하지만, 중간 코드가 있다면 중간 코드에 대한 Machine Code 생성으로 논리적 부분만 만들면 되는 장점이 있다.
- 이 장점도 언어의 특성이 달라지면 중간 코드도 바뀌어야 한다. 주로 비슷한 언어끼리 같은 중간 코드 사용