[Compiler] Compiler Pipeline 구성
Computer system에서 compiler란 high level languages (C, C++, Python 등)을 hardware에서 이해 할 수 있는 형태로 전환하는 프로그램이다. Compiler와 비슷한 interpreter 또한 존재하는데, 간단한 차이는 다음과 같다.
Compiler | Interpreter |
---|---|
Compiler는 전체 program을 분석한다. | Interpreter는 한 번에 one statement를 변환한다. |
Execution time이 interpreter에 비해 빠르다. | Execution time이 compiler에 비해 느리다. |
Source code를 object file로 변환한다. | Compile process가 따로 필요하지 않고 line by line으로 해석한다. |
Execution을 위해 source code가 필요하지 않는다. | Execution을 위해선 source code가 필요하다. |
Languages: C, C++, C# | Languages: Python, Perl, MATLAB |
구조는 크게 front-end, middle-end, back-end로 나뉜다.
1. Front-end
Compiler에 따라서 세부 process는 다르겠지만, Low Level Virtual Machine (LLVM) 기준으로는 위와 같이 설명 될 수 있다. 참고로 GCC compiler는 다음 link에서 참고 바란다. 링크
1.1 Lexical analyzer
Compile 단계 중 첫 번째인 lexical analyzer 단계에선 compile input program을 token sequence로 변환한다.
1.2 Syntax analyzer
이 단계에선 lexical analyzer에서 만든 token sequence를 바탕으로 syntax가 맞는지를 확인한다. 이 때 Abstract Syntax Tree (AST) struct가 만들어진다.
1.3 Semantic analyzer
만들어진 AST를 바탕으로 program 내에서 type check, flow control check, label check을 진행한다.
1.4 Intermediate code generator
최종적으로 middle-end로 전달하기 위한 intermediate code를 AST 기반으로 생성한다.
2. Middle-end
보통 middle-end에선 optimization을 주로 진행한다.
3. Back-end
Back-end에선 input으로 들어온 intermediate code를 바탕으로 target hardware에 dependent한 assembly code를 생성하는 과정을 거친다.
Reference
- https://home.adelphi.edu/~siegfried/cs372/372l8.pdf