pluffie
@pluffie
Стыдно за старые вопросы

VM vs native, какие плюсы и минусы?

Какие плюсы и минусы трансляции в байт-код ВМ по сравнению с компиляцией в нативный код? В каких ситуациях байт-код показывает себя лучше нативного, а в каких - хуже?
  • Вопрос задан
  • 276 просмотров
Решения вопроса 2
vabka
@vabka
Токсичный шарпист
Плюсы натива - не нужно тащить в рантайм какой-то интерпретатор или jit-компилятор, по тому часто само приложение получается компактнее, жрёт меньше ОЗУ, и быстрее запускается.
А также AOT-компилятор может делать больше сложных оптимизаций, тк у него нет ограничений в ресурсах и времени.
Нативное приложение обычно сложно декомпилировать

Плюсы вм - для портирования приложений нужно портировать только вм.
Если вм уже установлена на целевую машину, то байткод будет занимать меньше места, чем нативный код.
В теории может быть быстрее чем нативное приложение, тк у JITа имеется больше информации, чем у AOT-компилятора даже с профилем.
Компиляция в байткод идёт быстрее, чем в нативный, тк не нужно делать много сложных оптимизаций - этим будет заниматься JIT в фоне. И компилировать он будет только то что используется, а что не используется или используется редко - нет (будет без сложных оптимизаций)
Проблемы со скоростью холодного старта решаемы.
Ответ написан
Комментировать
@Akela_wolf
Extreme Programmer
Плюсы VM:
  1. Главный плюс - переносимость. У нас есть VM и байт-код, работать это будет на любой платформе для которой есть VM. В частности девиз Java: write once, run anywhere.
  2. Упрощение взаимодействия между разными языками. В случае native, например, у нас есть библиотека на C++ и код на Go - как их подружить? Это возможно, но это дополнительная сложность и трудоемкость. В случае JVM у нас есть interoperability между Java, Scala, Kotlin, Groovy и т.д. В случае JS - аналогично, между Javascript, Typescript, Kotlin.js, Dart. Конечно там есть свои особенности, например использовать Kotlin coroutines из Java-кода не так просто, но в целом, на базовом уровне все вполне пристойно работает вместе.
  3. JIT-оптимизация. JIT-компилятор может собирать статистику работы конкретного экземпляра программы, выявлять hot paths и оптимизировать именно их. При компиляции такую оптимизацию сделать невозможно т.к. она зависит от рантайма (в частности от данных с которыми работает программа)

Минусы:
  1. Зависимость от VM. Коду, очевидно, нужна VM. Во многих продуктах приходится поставлять VM вместе с продуктом, чтобы не зависеть от установленного в системе софта. Это увеличивает объем дистрибутива.
  2. Поскольку перед стартом программы должна стартовать VM - программа стартует дольше
  3. Производительность. В общем будет ниже чем у native кода. Хотя в очень многих случаях это не будет критично.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@rPman
Если рассматривать конкретно llvm то эта инфраструктура может дать оптимизацию на основе выполнения, т.е. собирая статистику работы кода на лету может оптимизировать циклы на столько что итоговая скорость выполнения может стать выше аналогичного кода, скомпилированного нативно (например у меня так llvm код соптимизировал 'почти' не используемые блоки).

Да, для компиляторов c++ есть анализаторы, собрающие данные путем прогона алгоритма на специально собранных версиях, но маловато кто этим занимается, уж точно 99.99999% проектов что есть этим не заморачиваются (да и сложно это)

p.s. с другими виртуальными машинами такие тесты сложно провести, а то что я слышал jvm или clr работают медленней нативного, ощутимо
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы