앞으로 LLVM 공식 홈페이지의 튜토리얼을 따라 Kaleidoscope라는 이름의 프로그래밍 언어를 만들어보려고 해요. C++로 LLVM 기반의 컴파일러를 작성하면서 관련 내용을 공부할 예정입니다. 튜토리얼의 목차를 보니 컴파일러의 프론트엔드(Lexical Analysis, Syntax Analysis, Semantic Analysis)를 다루는 내용같았어요. IR 생성, target machine code 생성, 최적화 등 백엔드 부분은 LLVM 라이브러리를 사용해 구현할 것으로 보였습니다. 목차와 간단한 내용은 다음과 같습니다.
컴파일의 시작이에요. Kaleidoscope가 어떤 기능을 가진 언어인지 알아봅니다. 또한, 소스코드를 파싱하여 Token stream을 생성하는 Lexer를 작성해요.
앞서 작성한 Lexer를 가지고 완전한 형태의 파서를 작성해요. 파서는 Recursive Descent Parsing과 Operator-Precedence Parsing 두 가지를 결합한 방식을 사용해 Kaleidoscope 소스코드를 파싱하고, 결과물로 AST(Abstract Syntax Tree)를 저장합니다.
AST를 가지고 LLVM IR을 생성합니다.
LLVM의 장점 중 하나인 JIT(Just-in-time) 컴파일을 통해 오브젝트 파일을 생성하는 방법을 알아봅니다.
if 조건문과 for 반복문에 따른 제어 흐름을 구현합니다. SSA(Static Single Assignment) form에 대해서도 다룹니다.
단항 및 이항 연산자와 연산자 우선순위에 대해 다룹니다.
지역 변수를 할당하는 법에 대해 다룹니다.
LLVM IR을 가지고 어떻게 오브젝트 파일을 생성하는지 알아봅니다. 정적 컴파일러처럼 생성한다고 하는데, 정적 링킹을 말하는 건가? 잘 모르겠네요.
Kaleidoscope 소스코드를 디버깅할 수 있도록 관련 정보를 추가합니다.
Kaleidoscope 튜토리얼을 마치며 앞으로 확장할 수 있는 기능들(가비지 콜렉터, 예외처리, 디버깅, 스파게티 스택? 등)에 대해 다룹니다.