Каковы основные отличительные особенности/Архитектурные различия между BEAM и JVM?

Что представляет собой фундаментальная разница в характеристиках/архитектуре между BEAM и JVM?

  • Да, я знаю: один из них был построен вокруг java, а другой - вокруг erlang
  • Я понимаю JVM (несколько) и хочу сравнить их структуры.
  • Например, я знаю, что JVM имеет один глобальный GC, а BEAM - один для каждого процесса.

Ответы

Ответ 1

Прежде всего, Beam - это машина для регистрации, а не стековый компьютер. Подобно WAM для Prolog, он использует "X-регистры", которые являются нормальными регистрами (реализованы как массив в C) и "Y-регистры", которые являются именами слотов в записи активации локальной функции ( "кадр вызова" ) в стеке. Нет инструкций по манипулированию стеком.

Во-вторых, есть инструкции для быстрого выделения еще нескольких слов памяти кучи, для инициализации кортежей и других структур данных в куче, для выбора элементов кортежей и т.д. JVM ориентирован на объекты и имеет "новый", который скрывает детали распределения памяти и базовой инициализации.

BEAM имеет инструкцию для уменьшения "счетчика сокращения" для процесса и принятия решения о том, пришло ли время, чтобы позволить другому процессу работать. JVM, с другой стороны, имеет инструкции синхронизации для потоков.

Важным отличием является то, что BEAM имеет команды хвостового вызова, которых не хватает JVM.

Наконец, для обоих BEAM и JVM набор команд, используемый в объектных файлах, действительно является только транспортным форматом. Эмулятор BEAM перезаписывает инструкции из файла во внутреннюю версию со многими оптимизированными специальными инструкциями (которые могут меняться от одного выпуска к другому). Кроме того, вы можете скомпилировать собственный код. Большинство JVM делают то же самое.