개요
- 프로그래밍 언어의 컴파일러를 그 언어 자신으로 작성하는 과정을 부트스트래핑(Bootstrapping)이라고 함
- Kotlin은 처음에는 Java로 컴파일러를 개발했으나, 현재는 Kotlin으로 작성된 컴파일러가 자기 자신을 컴파일하는 자가 호스팅(Self-Hosting) 시스템을 완성함
- 이 과정은 언어의 실용성과 성숙도를 증명하는 중요한 지표임
부트스트래핑의 개념
닭과 달걀 문제
- 새로운 언어 X를 만들고 싶을 때 “X 컴파일러를 X로 작성”하면 순환 논리에 빠짐
- X 컴파일러를 실행하려면 X 컴파일러가 필요하고, X 컴파일러를 만들려면 X 언어가 필요한 모순
- 이 문제를 해결하는 주요 전략이 부트스트래핑임
부트스트래핑의 정의
- 다른 언어로 최소한의 컴파일러를 만든 후, 그것을 이용해 자신의 언어로 작성된 더 나은 컴파일러를 만드는 과정임
- “부츠의 끈을 잡고 자신을 들어올린다”는 뜻에서 유래한 용어로, 외부 도움 없이 자립하는 것을 의미함
- 언어가 자기 자신을 컴파일할 수 있다는 것은 복잡한 시스템을 구현할 수 있다는 신뢰성의 증거임
용어 정리
- 부트스트래핑
- 다른 언어로 시작해서 자신의 언어로 전환하는 전체 과정
- 자가 호스팅 (Self-Hosting)
- 자신의 언어로 작성된 컴파일러가 자신을 컴파일하는 상태
일반적인 부트스트래핑 과정
| Phase | 무엇을 하는가 | 누가 하는가 | 결과 |
|---|---|---|---|
| Phase 1 | 언어 X를 다른 언어 Y로 구현 | Y를 사용하는 X의 개발자 | X가 작동 가능해짐 (Y 필요) |
| Phase 2 | X의 컴파일러를 X로 다시 작성 | X의 개발자 | X가 자기 자신을 컴파일 가능 |
| Phase 3 | X로 더 나은 X 컴파일러 작성 | X 커뮤니티 | X는 계속 진화함 (Y 불필요) |
- 한 번에 완성하는 것이 아니라 각 버전마다 조금씩 더 나아짐
- v1은 기본 기능만 제공하고, v2는 최적화를 추가하며, v3는 더 빠른 컴파일을 지원함
- v4는 더 똑똑한 에러 메시지를 제공하는 식으로 순환적으로 개선됨
- 이 과정은 진화론의 “작은 변화의 누적”과 유사한 패턴임
Kotlin의 부트스트래핑 과정

Phase 1 - Java로 첫 컴파일러 만들기 (2010-2012)
- JetBrains 팀은 Kotlin이 없는 상태에서 Java를 사용하여 Kotlin 컴파일러의 첫 버전을 작성함
- Java 코드로 작성된 컴파일러 소스를 Java 컴파일러로 컴파일하여 실행 가능한 Kotlin 컴파일러를 생성함
- 이 컴파일러는 Kotlin 소스 코드를 입력받아 JVM 바이트코드(.class 파일)를 출력하는 최소한의 기능을 제공함
- Kotlin 컴파일러는 현재 다양한 타겟을 지원함
- JVM
- .class 파일 (바이트코드)
- JavaScript
- .js 파일
- Native
- 네이티브 바이너리 (LLVM 백엔드)
- Wasm
- WebAssembly 모듈 (실험적)
- JVM
Phase 2 - 첫 번째 자가 호스팅 (2015-2016, Kotlin 1.0 출시 전후)
- Kotlin 컴파일러의 소스 코드 자체를 Kotlin으로 다시 작성하는 작업을 진행함
- Java로 만든 원본 컴파일러로 Kotlin으로 작성된 컴파일러를 컴파일함
- 이후 반복적으로 자신을 컴파일하며 개선함
- 이 과정에서 만들어진 컴파일러가 Kotlin 1.x의 기본 컴파일러 (후에 K1으로 명명됨)
Phase 3 - K2 컴파일러 프로젝트 (2022-2024)
- JetBrains 주도로 컴파일러를 아키텍처 수준에서 재설계함
- 기존 컴파일러를 K1으로, 새 컴파일러를 K2로 명명함
- 여전히 Kotlin으로 작성되었으며, Frontend와 Backend의 완전한 분리를 통한 성능 최적화를 목표로 함
- K2는 Kotlin 2.0에서 기본 컴파일러로 채택됨
- 구체적 개선 사항 (Kotlin 2.0 Release Notes 기준, 프로젝트에 따라 편차 있음)
- 전체 프로젝트 빌드
- 25-30% 빠름 (중형 프로젝트 기준)
- 증분 컴파일
- 최대 2배 빠름
- IDE 실시간 코드 분석 속도 향상
- 더 정확한 에러 위치 및 해결책 제안
- 전체 프로젝트 빌드
다른 언어들의 부트스트래핑
부트스트래핑 역사
| 언어 | 초기 컴파일러 | 자가 호스팅 시점 |
|---|---|---|
| Java | C (Sun, 1995) | 초기에는 C로 작성, 현재 javac는 Java로 자가 호스팅 (JVM은 C/C++) |
| GCC (C) | 이전 버전의 GCC | 3단계 부트스트래핑 |
| Python | C (CPython, 주류) | PyPy는 Python으로 작성된 대안 구현체 |
| Kotlin | Java (2010-2012) | 2015년경 (Kotlin 1.0 전) |
| Rust | OCaml (2010) | 2011년 Rust로 재작성 |
GCC의 3단계 부트스트래핑
- Stage 1
- 시스템에 설치된 기존 GCC 버전 (또는 다른 C 컴파일러)으로 새 GCC 소스를 컴파일
- Stage 2
- Stage 1 결과물(GCC)로 자신을 다시 컴파일
- Stage 3
- Stage 2 결과물로 자신을 한 번 더 컴파일하여 Stage 2와 동일한지 비교 검증(bootstrap comparison)
- Stage 3의 목적은 최적화가 아니라 컴파일러의 정확성을 검증하는 것임
Kotlin의 부트스트래핑
언어의 신뢰성 증명
- 자가 호스팅이 가능하다는 것은 그 언어가 실제 프로덕션 코드를 작성할 수 있다는 증명임
- Kotlin 컴파일러는 파서, 형 검사, 코드 생성 등 매우 복잡한 소프트웨어임
- 이를 Kotlin으로 작성할 수 있다는 것은 Kotlin이 엔터프라이즈급 애플리케이션에 적합하다는 증거임
- 부트스트랩되지 않은 언어는 학술적으로만 존재하는 경우가 많으며 안정성이 불확실함
개발 속도 향상
- 자가 호스팅 이전에는 컴파일러 개선을 위해 Java 코드를 수정하고 Java 컴파일러로 빌드해야 했음
- 자가 호스팅 이후에는 Kotlin 코드만으로 컴파일러를 개선할 수 있어 더 빠른 반복 개발이 가능함
- Kotlin 팀이 Kotlin 언어의 새로운 기능을 Kotlin으로만 작성하고 테스트할 수 있게 됨
- 개발자들이 Kotlin에 익숙하므로 컴파일러 코드베이스에 더 쉽게 기여할 수 있음
순환 개선
- K2 컴파일러가 좋은 예시로, Kotlin으로 Kotlin 컴파일러를 다시 작성하며 다음을 달성함
- 더 나은 에러 메시지를 추가하여 개발자 경험을 개선함
- IDE 지원(자동완성, 리팩토링)을 강화함
- 컴파일 속도를 향상시킴
- 모든 개선 사항이 Kotlin 코드로만 구현되므로 개발자들이 쉽게 이해하고 기여 가능함
부트스트래핑의 한계
- 자가 호스팅은 언어 설계의 복잡성을 컴파일러 개발자 스스로 감내해야 함
- 초기 단계에서 언어 스펙이 바뀔 때마다 컴파일러를 두 번씩 수정해야 하는 관리 비용이 발생함
- 부트스트랩 과정 중 컴파일러 버그가 컴파일러 자체를 빌드하지 못하게 만들 수 있어 신중한 관리가 필요함
- 이러한 복잡성에도 불구하고 장기적으로는 개발 생산성과 언어 신뢰성 측면에서 큰 이점을 제공함
Kotlin이 얻은 장점
- Kotlin은 프로덕션 언어임
- 자가 호스팅 컴파일러를 보유한 언어는 실제 업무를 하도록 설계되었음
- Java와 상호운용 가능
- JVM 바이트코드를 생성하므로 Java와 상호운용이 가능함
- Java 생태계(Spring, Hibernate 등)를 활용할 수 있음
- 계속 진화 중
- K2 컴파일러 도입으로 Kotlin은 더 빠르고 안정적으로 발전할 예정임
부트스트래핑 여부와 언어의 성숙도
- 부트스트래핑은 언어의 성숙도를 보여주는 중요한 지표 중 하나이지만, 유일한 기준은 아님
- 부트스트랩된 언어 예시
- Kotlin, Java, Go, C, Rust
- 부트스트랩되지 않았지만 프로덕션인 언어 예시
- TypeScript (JavaScript로 작성)
- Clojure (Java로 작성)
요약 정리
-
부트스트래핑은 “닭과 달걀 문제를 다른 동물에서 시작해서 해결하는 기술”임
- 1단계
- 다른 언어(Java)로 원하는 언어(Kotlin)의 컴파일러를 만듦
- 2단계
- 그 컴파일러로 원하는 언어로 작성된 더 나은 컴파일러를 만듦
- 3단계
- 반복하여 언어가 자립적으로 진화 가능해짐
- 1단계
-
Kotlin의 부트스트래핑 흐름
- 2010-2012
- Java로 Kotlin 컴파일러 v1 개발
- Java 컴파일러로 Kotlin 컴파일러 v1을 컴파일
- 2015-2016
- Kotlin 컴파일러 v1으로 Kotlin으로 작성된 v2를 컴파일
- 이후
- Kotlin 컴파일러가 자기 자신을 계속 개선 가능해짐
- 2010-2012