LLVM vs JVM vs GraalVM

В 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-мира, существуют ещё многие другие, и даже другие типы ВМ — об этом тоже в статье из предыдущего пункта.

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *