PLAS 연구실에서 나는 컴파일러를 공부하고 컴파일러와 관련된 일을 해야한다. 그 중에서도 LLVM에 대해 내가 알아야한다고 한다. 그래서 LLVM 공부를 시작하게 되었다. 공부를 돕기위해 세미나를 열고 내가 공부하고 정리한 내용을 발표하는 과정도 갖기로 했다.

일단 LLVM이 뭔지 알아보았다. 그리고 LLVM을 세팅해놓고 만져볼 수 있도록 내 컴퓨터에 LLVM을 빌드 및 설치했다. 책 『LLVM 코어 라이브러리』를 참고 했다.

LLVM은 딱 뭐라고 정의 내리기가 어렵다. LLVM은 프로젝트 이름이면서, 컴파일러 종류이기도 하면서, 컴파일러와 관련 툴체인의 집합을 이르는 말이기도 하다. LLVM이라는 단어가 광범위하게 사용된다는 것을 체감하는데까지 시간이 좀 걸려서, LLVM 개념을 이해하는데 어려움을 겪었던 것 같다. 간단하게 LLVM은 프론트엔드, 최적화, 백엔드를 분리하여 각각이 모듈화된, 재사용 가능한 구조의 컴파일러이다. 프론트엔드에서 소스코드를 중간코드인 IR(Intermediate Representation)로 만들고, 이 중간코드가 백엔드로 넘어가 최종 컴파일을 진행한다.

중간 코드는 플랫폼 독립적인 코드로, 특정 언어에 맞게 개발된 프론트엔드에서 소스코드의 의미만 뽑아내 정리해 만드는 내부코드정도로 생각할 수 있을 것 같다. 즉, IR은 프론트엔드에서 특정 언어에 맞는 해석과정을 이미 거쳤기 때문에 어떤 백엔드든지 처리가능한 코드인 것이다. 이 IR을 백엔드에서는 프로그램이 사용될 목적 기계에 맞게, 실행가능한 코드로 만들어준다. 즉, 백엔드에서는 IR을 각 아키텍처에 맞는 최종 코드로 만든다는 것이다. 이 최종 코드로 만드는 과정 전에 중간코드를 받아 최적화를 할 수도 있다.

이러한 구조로 컴파일러를 모듈화했고, 이식성, 재사용성을 증가시켰다. 컴파일러 전체를 다 구현하지 않고 자기가 개발하고 싶은 부분만 구현할 수 있게되었고, 이미 구현된 다른 부분에 이어붙일 수 있게 되었다. 예를 들어 특정 언어를 처리하는 프론트엔드 코드를 재사용하고 나는 백엔드만 개발할 수 있다. 심지어는 최적화 부분만 개발 할 수도 있다. 이렇게 컴파일러 개발 과정이 수월해졌을 뿐만 아니라, 다양한 언어와 아키텍처를 지원할 수 있고, 심지어는 컴파일 속도 또한 개선되었다.