원문 캡처 · github.com
원문 캡처 · github.com

Go로 작성된 JVM용 Kotlin 컴파일러 kc는 공개된 벤치마크에서 실제 라이브러리를 kotlinc보다 10~16배 빠르게 빌드했고, 메모리 사용량도 더 적었다. 다만 아직 프로토타입으로, Kotlin의 일부 기능과 검사, Gradle 플러그인 및 IDE 지원을 제공하지 않는다.

제작자가 Apple M2 MacBook Air(8코어, 메모리 16GB)와 JDK 21에서 kotlinc 2.4.21과 비교한 결과다. kotlinc는 Gradle 데몬처럼 JIT가 준비된 JVM에서 반복 실행한 중앙값이며, kc는 기본 설정으로 모든 코어를 사용했다.

프로젝트파일 수줄 수kotlinckc속도 향상
kotlinpoet 2.4.0398.7k1.23 s97 ms13x
Ktor 3.6.0 (ktor-io, ktor-utils, ktor-http)23624k2.32 s226 ms10x
kotlinx-coroutines-core 1.11.016934k2.50 s159 ms16x

제작자에 따르면 kc는 단일 코어에서도 따뜻한 JVM의 kotlinc보다 6.6~8.8배 빨랐다. 새 JVM으로 실행하는 콜드 빌드에서는 kotlinc가 kc보다 69~85배 오래 걸렸다. 메모리 사용량은 kc가 최대 85~118MB, 힙을 8GB로 제한한 콜드 kotlinc가 1.0~1.1GB였다. 측정 방법과 CPU 시간은 벤치마크 문서에 공개돼 있다.

이 결과는 기능 범위가 같은 컴파일러끼리의 비교가 아니다. kc는 일부 Kotlin 기능과 가시성 검사를 지원하지 않고, kotlinc가 타입 검사 후 실행하는 경고·오류 검사기 290개도 별도로 갖추지 않았다. 이에 따라 진단 테스트에서 kotlinc와 일치한 비율은 79%다. 자체 테스트를 통과한 실제 라이브러리를 빌드했고, kotlinc의 박스 테스트에서는 95%를 통과했다. 실제 코드 조사 결과는 Survey of real code, 지원하지 않는 기능은 Unsupported Kotlin, 적합성 테스트는 Conformance에서 확인할 수 있다.

kc는 JVM 대상만 지원하며 Kotlin/Native, JS, Wasm, 증분 컴파일, Gradle 플러그인, IDE 지원은 제공하지 않는다. 출력 클래스 파일도 kotlinc와 완전히 같지는 않다. 제작자는 속도 차이를 JVM 시작과 JIT 준비의 생략, 여러 코어를 쓰는 병렬 처리, 적은 처리 단계, 클래스 경로의 지연 로딩 등으로 설명한다. 자세한 설계는 Design에 있다.

직접 시험하려면 Go 1.27.2 이상과 JDK가 필요하다. 표준 라이브러리는 자동으로 포함되지 않으므로 컴파일할 때 kotlin-stdlib.jar와 필요한 라이브러리를 클래스 경로에 지정해야 한다. 저장소에는 다음 빌드 및 실행 예제가 있다.

sh
go build -o bin/kc ./cmd/kc
bin/kc -d out testdata/run/fizzBuzz.kt
java -cp out FizzBuzzKt

저장소와 사용 안내는 kotlin-compiler-go에서 확인할 수 있다. 라이선스는 Apache License 2.0이다.