BEAM

BEAM — виртуальная машина, на которой исполняется байт-код программ, созданных на языке Erlang.

BEAM является основой платформы OTP и частью ERTS (Erlang Run-Time System). Эта система компилирует исходный код в байт-код, который затем мы можем запустить на BEAM. Файлы байт-кода имеют расширение .beam.

Первой виртуальной машиной для Эрланга была JAM (Joe’s Abstract Machine). Её написал Джо Армстронг. Название BEAM происходит от Bogdan’s Erlang Abstract Machine (Богумил “Богдан” Хаусман написал оригинальную версию BEAM). Сейчас это название также трактуют как Björn’s Erlang Abstract Machine — в честь Бьорна Густавссона, поддерживающего текущую версию.

Английское слово beam имеет много смыслов. В данном контексте, видимо, подразумевается beam как пучок частиц (физика). Судя по всему, это намёк на ключевую особенность Эрланга, в котором очень легко порождать огромное количество параллельных процессов, каждый из которых весьма легковесен.

Одна из ключевых особенностей Erlang/OTP — то, что порождаемые программой параллельные процессы (акторы) не имеют прямого отношения к процессам операционки. Это внутренние процессы для BEAM. Пусть мы запустили даже миллион акторов, в операционной системе будут отображаться лишь несколько процессов “beam.smp”.

Поддержка многих бифов реализована прямо в BEAM. Например, бифа spawn.

На BEAM запускаются не только Эрланг-программы. Всего для этой виртуальной машины создано как минимум 34 языка. Самым известным, помимо Эрланга, является Elixir. Программа на любом BEAM-языке компилируется сначала в специальный BEAM-ассемблер, потом уже собственно в байт-код. Чтобы скомпилировать только в BEAM-ассемблер, можно использовать ключ -S: erlc -S foo.erl. Получившийся файл foo.S можно открыть в текстовом редакторе и изучить или даже внести какие-то правки.

В стандартной библиотеке есть beam_lib — интерфейс к BEAM-файлам. Например, функция cmp сравнивает содержимое двух BEAM-файлов.


Copyright © 2025 Алексей Карманов