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 생성으로 논리적 부분만 만들면 되는 장점이 있다.

 - 이 장점도 언어의 특성이 달라지면 중간 코드도 바뀌어야 한다. 주로 비슷한 언어끼리 같은 중간 코드 사용

+ Recent posts