ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 컴파일러 블록 쌓기 시작
    카테고리 없음 2026. 9. 20. 16:34

    얼마 전 LEGO로 만든 사그라다 파밀리아 성당을 보다가 이런 생각이 들었다. 100년이 넘는 시간 동안 지어지고 있는 위대한 건축물도, 비교적 단순하게 추상화해서 보면 결국 작은 블록들이 모여 거대한 구조를 만들어낸 것 아닐까. 실제 건축물에는 수많은 설계와 시행착오, 기술의 축적이 있겠지만, LEGO라는 관점에서 보면 복잡한 전체도 작은 단위들의 조합으로 바라볼 수 있다.


    그러다 문득 컴파일러가 떠올랐다. 오늘날의 컴파일러 역시 거대하고 복잡한 소프트웨어 중 하나이고, 현대의 상용 컴파일러에는 수십 년에 걸친 연구와 구현의 노고가 쌓여 있다. parser, type system, intermediate representation, optimizer, register allocator, code generator처럼 수많은 구성 요소가 맞물려 돌아간다. 멀리서 보면 쉽게 엄두가 나지 않지만, 이것도 LEGO처럼 하나씩 쌓아간다면 언젠가는 상용 컴파일러에 가까운 수준까지 만들어볼 수 있지 않을까 하는 생각이 들었다.


    그래서 직접 C compiler를 하나 만들어보기로 했다. 이름은 bricck. 목표는 단순히 몇 개의 문법만 처리하는 toy compiler를 만드는 것이 아니다. 장기적으로는 Linux kernel을 실제로 빌드할 수 있고, 더 나아가 상용 컴파일러에 가까운 수준까지 발전시키는 것이 목표다. 가능하다면 최적화 파이프라인과 IR, backend까지 갖추고, 새로운 언어나 새로운 ISA를 실험할 때도 재사용할 수 있는 구조로 키워보고 싶다.


    물론 처음부터 그 모든 것을 만들 생각은 없다. 오히려 이번 프로젝트에서 가장 중요한 것은 완성된 구조를 미리 설계하는 것이 아니라, 작은 기능을 하나씩 직접 만들면서 왜 다음 구조가 필요한지 경험하는 것이다. 구현하고, 한계를 만나고, 필요할 때 리팩터링하면서 조금씩 쌓아갈 생각이다.


    첫 번째 목표는 아주 작다.

    int main() {  
        return 42;  
    }  


    이 코드를 직접 만든 컴파일러가 RISC-V assembly로 변화하도록 만드는 것. 구현 언어는 Rust를 사용하고, host는 macOS, target은 RISC-V 64-bit Linux로 잡았다. 개발 환경이 Macbook이고, RISC-V ISA가 x86-64 나 ARM에 비해 비교적 단순하다고 생각했기 때문이다. 초기에는 assembler와 linker 같은 도구까지 모두 직접 만들지 않고 LLVM toolchain과 QEMU를 활용하면서 compiler의 핵심부터 만들어갈 예정이다.

    C source
       ↓
    bricck
       ↓
    RISC-V assembly
       ↓
    LLVM assembler / linker
       ↓
    RISC-V ELF
       ↓
    QEMU
Bearmetal: A Bare-metal Systems Lab.