Прежде всего, Beam является регистрационной машиной, а не стековой машиной. Подобно WAM для Prolog, он использует «X-регистры», которые являются нормальными регистрами (реализованы как массив в C) и «Y-регистры», которые являются именами слотов в записи активации локальной функции («кадр вызова») в стеке. Нет инструкций по манипулированию стеком.
Во-вторых, есть инструкции для быстрого выделения еще нескольких слов памяти кучи, для инициализации кортежей и других структур данных в куче, для выбора элементов кортежей и т. Д. JVM ориентирован на объекты и имеет «новый ', которая скрывает детали распределения памяти и базовой инициализации.
BEAM имеет инструкцию для уменьшения «счетчика уменьшения» для процесса и принятия решения о том, пришло ли время, чтобы запустить другой процесс. JVM, с другой стороны, имеет инструкции синхронизации для потоков.
Важным отличием является то, что BEAM имеет инструкции по вызову хвоста, которых нет в JVM.
Наконец, для BEAM и JVM набор инструкций, используемый в объектных файлах, действительно является только транспортным форматом. Эмулятор BEAM перезаписывает инструкции из файла во внутреннюю версию со многими оптимизированными специальными инструкциями (которые могут меняться от одного выпуска к другому). Кроме того, вы можете скомпилировать собственный код. Большинство JVM делают то же самое.