Как компилируется Kotlin: в Java байткод или напрямую
Что проверяют
Понимаете ли вы путь кода от .kt до исполнения на устройстве и то, что на Android между байткодом JVM и процессором есть ещё два шага. Следом обычно спрашивают, чем Kotlin-код отличается от Java на уровне байткода и как это увидеть.
Как отвечать
Короткий ответ: Kotlin для JVM компилируется в тот же байткод JVM, что и Java, без промежуточных Java-исходников. Для Android-разработчика картина полнее:
- kotlinc: компилятор Kotlin (с версии 2.0 по умолчанию работает фронтенд K2) собирает
.ktв.class-файлы. В смешанном модуле он читает Java-исходники, аjavacпотом видит уже скомпилированные Kotlin-классы; - D8: превращает
.classв DEX-байткод для Android Runtime. В release-сборке этим занимается R8, который заодно ужимает, обфусцирует и оптимизирует код; - ART: на устройстве DEX исполняется интерпретатором и JIT, а часто вызываемые методы компилируются заранее в машинный код (AOT) по профилю, в том числе по Baseline Profiles из самого приложения.
Кроме JVM, у Kotlin есть другие бэкенды: Kotlin/Native через LLVM в машинный код (так собирается iOS-часть в Kotlin Multiplatform), Kotlin/JS и Kotlin/Wasm. Так что «напрямую» тоже бывает, просто не на Android.
Сильный ход: показать, как фичи Kotlin выглядят в байткоде. Top-level функции оказываются в классе FileNameKt, companion object становится вложенным классом со статическим полем, inline-функции копируются в место вызова, а suspend-функции получают лишний параметр Continuation и превращаются в конечный автомат. Посмотреть это можно в Android Studio: Tools > Kotlin > Show Kotlin Bytecode и кнопка Decompile.
Где спотыкаются
Говорят, что Kotlin сначала переводится в Java-код. Это не так, промежуточного Java-исходника нет.
Забывают про DEX и ART и отвечают так, будто Android исполняет .class-файлы на обычной JVM.
Не знают, зачем нужны @JvmStatic, @JvmOverloads и @JvmField. Байткод общий, но без этих аннотаций Java-коду неудобно вызывать Kotlin: приходится писать Companion. и передавать все параметры со значениями по умолчанию.