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