Erlang VM

Erlangの軽量プロセスが軽いというので、ちょっと眺めている。
Erlangは、BEAMという仮想機械で動作する。BEAMのソースコードは、erts/emulator/beam以下にある。コンパイルは、erlcコマンドで、.erlから.beamに変換することにより行う。
さて、軽量プロセスってふと思えば、スレッドのことである。しかし、それでも309ワード(1236バイト)というのはすごい(うちヒープのサイズはデフォルト233ワードらしい)。さらに、ネイティブスレッドではなくグリーンスレッドなので、メモリ消費が少ない。軽量プロセスは、spawnの延長で呼ばれるerl_create_process関数で起動している。やっていることは、メモリを取得して、プロセス構造体を定義して、それをrunq(add2runq)につないで終了となっている。これしか作っていないのだから、プロセスの生成は早くて当然である。軽量プロセスが軽くてすむのは、アクターモデル(メッセージパッシング)なので、メモリ共有等の仕組みは不要になるためである。このためか、1マシンで100万プロセス可能というすごいことになる。
次に、ホットコードスワッピングは、モジュール構造体が、新旧のモジュールを定義出来るようにしているためできる。詳しくは、purge_module関数辺りを参照。もちろん、BEAMのソースコードで、module.hに定義されているモジュール構造体を見ても良い。
あと、メッセージパッシングは、メッセージをヒープ領域にコピーして実現している。
最後に、ErlangミドルウェアパッケージであるOTP (Online Telecom Platform) を見てみた。振る舞い(behavior)を定義して、簡単に耐障害アプリケーションを書けるライブラリである。このライブラリを使って、RabbitMQサーバ等は書かれている。そんなに便利なら、何故ほかの言語に移植しないのと思ったら、Erlangの特徴を活用しているので難しいらしい。