Show GN: Lamina: LLVM 없이 네이티브 코드를 생성하는 멀티 아키텍처 컴파일러 백엔드
(github.com/SkuldNorniern)안녕하세요, 제 지인이 최근에 컴파일러 백엔드를 개발했는데 꽤 흥미로워서 공유합니다.
- 프로젝트 소개
Lamina는 LLVM 같은 무거운 의존성 없이, SSA 기반 IR에서 바로 네이티브 코드를 생성하는
멀티 아키텍처 컴파일러 백엔드입니다. x86_64, AArch64, RISC-V, WebAssembly를
하나의 IR로 지원합니다.
간단한 DSL이나 실험적인 언어를 만들 때마다 LLVM을 빌드하고 수 GB짜리 의존성을
관리하는 게 너무 무겁다고 느꼈다고 합니다. "그냥 IR 넣으면 어셈블리 나오는
가벼운 거 하나 만들어보자"는 생각으로 시작했다네요.
- 주요 특징
▸ 외부 의존성 제로
LLVM이나 Cranelift 없이 IR에서 머신코드로 직접 변환합니다.
빌드 시간도 짧고 배포도 간단합니다.
▸ SSA 기반 IR
Static Single Assignment 형태라 최적화 파이프라인 구성이 깔끔합니다.
▸ 명시적 메모리 모델
스택/힙 할당을 IR 레벨에서 명확히 구분해서, 메모리 분석이 쉽습니다.
▸ 멀티 아키텍처
하나의 IR로 여러 타겟 지원:
- x86_64 (Linux, macOS, Windows)
- AArch64/ARM64 (Linux, macOS, Windows)
- RISC-V (RV32/64/128)
- WebAssembly (32/64-bit)
▸ IRBuilder API
함수형 스타일로 IR을 구성할 수 있는 API를 제공합니다.
타입 안전하게 제어 흐름이나 메모리 연산을 표현할 수 있다고 하네요.
- 현재 상태
기본 산술 연산, 조건/분기/루프 같은 제어 흐름, 비재귀 함수 호출,
간단한 최적화가 동작합니다.
프로덕션 레디는 아니지만, 토이 랭귀지나 DSL 백엔드로 실험해보기엔
충분하다고 합니다.
- 사용 워크플로우
대략 이런 식으로 쓴다고 하네요:
- 소스 언어 파싱해서 AST 만들고
- IRBuilder로 AST를 Lamina IR로 변환
- Lamina가 최적화하고 타겟별 네이티브 코드 생성
IR 생성 부분만 잘 작성하면, 나머지는 Lamina가 알아서 처리합니다
- 마치며.
개인적으로 "컴파일러 백엔드를 만든다"는 게 되게 먼 이야기처럼 느껴졌는데,
지인이 실제로 만드는 걸 보니까 신기하더라고요.
물론 LLVM 수준의 성숙도나 최적화는 아니지만, 가볍게 실험하거나
교육용으로 쓰기엔 꽤 괜찮아 보입니다.
저도 실제로 lamina를 통해 엄준식 랭 컴파일러를 개발해보았습니다.
관심 있으신 분들은 한번 살펴보셔도 좋을 것 같습니다!