TL;DR

Erlang のランタイムシステム(ERTS)の中で、ユーザのコードを実行する仮想マシン。Bogdan/Björn’s Erlang Abstract Machine の略である。Elixir、Gleam、LFE もこの上で動く。

なぜ必要か

Erlang の FAQ によると、ほぼすべての利用者が BEAM を使っている。最初の Erlang の仮想マシンは JAM(Joe’s Abstract Machine)で、BEAM はその後に作られた「新しい」仮想マシンである。

仕組み

BEAM はレジスタマシンで、名前付きのレジスタを操作する命令を実行する。各レジスタには Erlang の任意の項を入れられる。X レジスタは一時的なデータを持ち、関数の間で値を受け渡す。引数は {x,0} から順に入り、戻り値も {x,0} に入る。Y レジスタは、スタックフレームのローカルな値を持つ。

BEAM 自体は仮想マシンにすぎず、プロセス、ポート、ETS テーブルといった概念は持たない。それらは ERTS の側が提供する。erlc -S を使うと、コンパイルされた BEAM の命令を確かめられる。

例

関連

出典