February 18, 2024
kotlin compiler에 대해 알아보기 전에 Compiler에 대해 간단하게 알아보자. 간단하게 말하면 source code를 target 또는 machine code로 변환하는 역할을 한다.
source code
machine code
Compiler에 대해 간단하게 알아봤으니 Kotlin Compiler에 대해서 알아보자.
말 그대로 Kotlin으로 쓰인 source code를 컴파일하는 것이다. 다만 코틀린 컴파일러는 machine code가 아닌, target code로 변환한다. 왜냐하면 kotlin은 결국 JVM 위에서 동작하게 되기 때문에, jvm 위에서 동작할 수 있는 바이트 코드로 변환되어야 한다. 사실 코틀린 컴파일러는 JVM 위에서 동작하는 바이트코드만 생성하는게 아니라, 멀티플랫폼을 지원하는 언어이기 때문에 js와 native도 지원한다.
위의 그림을 보면 코틀린 컴파일러가 되게 많은 일을 하고, 블랙박스처럼 보인다. 코틀린 컴파일러를 한번 더 자세히 들여다보면, 아래 그림처럼 역할에 따라 Frontend와 backend로 구성되어 있다.
<그림1>
Frontend와 Backend에서 무슨 일을 하는지 알아보자.
Frontend는 다음과 같은 역할을 수행한다
코틀린 컴파일러 초기의 Old Frontend와 개선된 New Frontend 버전이 있다. 위 <그림1>에서 Frontend 영역의 Parser와 Semetic Analyzer은 무엇이고, New Frontend에서는 어떤게 개선되었는지 정리해보자.
소스 코드의 유효성을 체크하고, 문법이 맞으면 구문트리를 빌드한다
if (pet is Cat) {
pet.meow()
} else {
println("*")
}
의미를 확인하고, 올바르게 함수가 호출되는지 확인한다.
아래 코드처럼 파라미터의 개수가 안맞거나, 참조할수 없는 함수를 참조하는 등에서 발생
if (pet is Cat) {
pet.meow(1) // Error: Too many arguments
} else {
pet.mmeow() // Error: Unresolved reference
}
지금까지 Old Frontend에서 어떻게 동작하는지 확인하였다. New Frontend는 기존의 Old Frontend에서 무엇이 개선되었는지 확인해보자.
New Frontend에서의 FIR은 디슈가링(안드로이드에서 호환성을 위해 일컫는 Desugaring이랑은 다름)을 지원한다. 디슈가링이란 복잡한 언어 구문을 단순화하고 더 간단한 구문으로 대체하는 것이다. dusugarging의 예시로는 아래와 같은 것들이 있다.
operators desugaring
a + b
는 a.plus(b)
로 변환된다.구조 분해 선언 desugaring
val (a, b) = pair
는 val a = pair.component1(); val b = pair.component2()
로 변환된다.for문 desugaring
for (item in collection)
은 val it = collection.iterator(); while (it.hasNext()) { val item = it.next() }
로 변환된다.data class에 대한 메서드 생성
equals()
, hashCode()
, toString()
등의 메서드를 생성한다. 이러한 메서드 선언은 컴파일 과정에서 추가된다.Backend는 frontend의 결과를 입력으로 취해서 다양한 대상으로 바이트코드를 생성한다. 이번에도 Old kotlin complier와 개선된 New kotlin compiler로 나뉜다.
위에서 봤던 New Frontend 구조와 New backend 구조를 합치면 아래 그림이 된다.
kotlin 2.0 부터 stable하게 도입될 예정이다.
현재는 kotlin beta로 2.0이 운용되고 있고, 계속해서 안정화 중이라고 한다.
New Frontend가 도입되면 기존보다 약 두배 정도의 성능이 향상될 것이라고 한다.
https://blog.jetbrains.com/ko/kotlin/2022/02/the-road-to-the-k2-compiler/
https://www.youtube.com/watch?v=iTdJJq_LyoY
https://proandroiddev.com/lets-talk-about-kotlin-k2-3e1c6f10d74
https://kotlinlang.org/docs/whatsnew-eap.html#kotlin-k2-compiler