В Kotlin есть отличная возможность — Kotlin Native. Она позволяет компилировать Kotlin код в бинарники под конкретные платформы — которые способны запускаться без виртуальной машины. Эта технология основана на LLVM — Low Level Virtual Machine. Что? Снова виртуальная машина? Не аналог ли это обычной JVM? Или модной молодёжной GraalVM? Давайте разберёмся, в чём же разница между ними.
LLVM
- Регистровая VM (оперирует, в первую очередь, регистрами процессора).
- Очень низкоуровневая, спроектированна для абстрагирования от различий в железе.
- Больше похожа на компилятор, потому что из своего IR (Intermediate Representation) получает бинарник под конкретную платформу.
JVM
- Стэковая ВМ (не пользуясь регистрами, оперирует стэком).
- Предоставляет высокоуровневую инфраструктуру разработки: понятие объектов и ООП, Garbage Collector и др.
GraalVM
- Это не совсем ВМ сама по себе. Это набор компонентов, предоставляющих кучу доп возможностей JVM.
- Поддерживает JIT и AOT компиляцию.
- JIT компилятор просто заменяет имеющийся JIT компилятор в JVM, при этом сама JVM остаётся той же.
- Позволяет запускать LLVM биткод. (В отличие от стандартного его запуска компилирует динамически для interop-совместимости с другими поддерживаемыми языками)
Погружение
- Различие регистровых и стэковых ВМ.
- Помимо упомянутых ВМ, знакомых нам из Java-мира, существуют ещё многие другие, и даже другие типы ВМ — об этом тоже в статье из предыдущего пункта.