Каковы некоторая фундаментальная Функция / Архитектурное различие между ЛУЧОМ и JVM?
Прежде всего, Beam - это регистровая машина, а не стековая. Как и WAM для Prolog, он использует "X-регистры", которые являются обычными регистрами (реализованными как массив в C), и "Y-регистры", которые являются именами для слотов в локальной записи активации функции ("кадр вызова") на стеке. Инструкции манипулирования стеком отсутствуют.
Во-вторых, есть инструкции для быстрого выделения еще нескольких слов памяти кучи, для инициализации кортежей и других структур данных на куче, для выбора элементов кортежей и т.д. JVM ориентирована на объекты и имеет операцию 'new', которая скрывает детали выделения памяти и базовой инициализации.
BEAM имеет инструкцию для уменьшения "счетчика уменьшения" для процесса и принятия решения о том, не пора ли выйти, чтобы позволить запуститься другому процессу. JVM, с другой стороны, имеет инструкции синхронизации для потоков.
Одно из важных различий заключается в том, что BEAM имеет инструкции вызова хвоста, которые отсутствуют в JVM.
Наконец, и для BEAM, и для JVM набор инструкций, используемый в объектных файлах, на самом деле является лишь транспортным форматом. Эмулятор BEAM переписывает инструкции из файла во внутреннюю версию с множеством оптимизированных инструкций для специальных случаев (которые могут меняться от одного выпуска к другому). В качестве альтернативы вы можете скомпилировать в родной код. Большинство JVM делают то же самое.