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