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