LLVM
A Quick Introduction to Classical Compiler Design
- LLVM은 컴파일러의 기반 구조로 사용되고 있다.
- 전통적인 컴파일러는 프론트엔드, 옵티마이저, 백엔드 three-phase 일체형 구조로 설계된다.

- 프론트엔드: 소스 코드 파싱, 에러 체크, AST 생성
- 옵티마이저: 불필요한 연산 제거 등 성능 개선을 위한 각종 변환
- 백엔드: target instruction set에 코드 매핑, 레지스터 할당, 명령 스케줄링
- 전통적인 설계의 문제는 하나의 컴파일러가 여러 아키텍처 또는 언어를 지원하지 못한다는 것이다.
- LLVM은 전통적인 설계의 문제를 해결한다.

- 위와 같이 retargetable하게 설계하면 기존 옵티마이저와 백엔드를 그대로 둔 채로 새로운 프론트엔드만을 추가해 새 언어를 지원할 수 있다.
Existing Language Implementations
- 이러한 모델에 세 가지 주요 성공 스토리가 있다.
- 자바와 .NET 가상 머신 - JIT 컴파일로 제공, 런타임 지원, 잘 정의된 바이트코드.
- 소스를 C 코드로 변환하고, C 컴파일러로 컴파일하기 - 쉬운 이해와 구현, 하지만 열악한 환경과 각종 문제.
- GCC - 많은 프론트엔드, 백엔드 지원, 활동적인 커뮤니티, 오래된 역사.
- GCC가 라이브러리로서 재사용될 수 없는 이유가 많다.
- 광범위한 전역 변수 사용, 불변에 대한 약한 강제, 잘못 설계된 자료 구조.
- 가장 해결하기 어려운 문제: 초기 설계 문제와 시대에서 비롯된 고유한 구조적 문제.
- 레이어링 문제와 추상화로 인한 고통: 백엔드가 프론트엔드 AST를 참조해 디버그 정보를 생성한다.
참고자료
이 문서를 인용한 문서