はじめに
皆さん、ご無沙汰しております。
Elixir界隈の富樫ことGsannです。昨年・今年はほとんど沈黙しておりました。
活動を再開しようと、重い腰を上げていこうとしているところです。
本題
The Erlang Runtime System というのがあります。
Erik StenmanというErlangプログラマの方が書かれたものですが、Erlang(Elixir)のランタイムシステムについて詳細に網羅されています。
これは zacky1972さんからご紹介いただいて、以前は彼とともにこちらのペーパーをゼミ形式?対話形式?で内容を深めていました。(私が追いついていくのがやっとで、対話になっていたのかが怪しいですが)
いつの間にかその活動が中止?休止?してしまい、それと同時に本業の忙しさに負けてモチベーションが上がらなかった、というのが今思えば私が富樫化した経緯です。
さて、以降は全部で21章のうち最初の5章について、コメントをしていきます。
1. Introducing the Erlang Runtime System
専門書によくあるイントロ。
このペーパーで何を学ぶのか、おおよその概観と概要を記載している。
Erlang Runtime Systemのことを、以降「ERTS」と表記していたりする。
この章では特に、HWやVMの上にどのようなlayerでERTSが構成されているのかが記載されているので確認するとよいかもしれない。
2. The Compiler
コンパイラについて。
ErlangのコンパイラがどのようなプロセスでNativeCodeを生成しているのかを記載している。
特にFigure6にそのプロセスが記載されているので、確認するとよいかもしれない。
また、各プロセスでどのような操作を行っているかも記載されている。
3. Processes
ERTSで扱うプロセスについての話。
プロセスとは何か、という話から始まって、プロセスをErlang上で確認する方法の紹介や
プロセスがどのような要素を構成してメモリ上に現れるのかが記載されている。
また、プロセス間でメッセージのやり取りを行うことについても言及されている。
4. The Erlang Type System and Tags
型システムとタグについての話。
Erlangは強い動的な型付け言語であると言及している。
動的な型付けなので、コンパイル時には型チェックを行わず、実行時に型チェックを行う。
(Javaをやってきた私としては、コンパイルするんだったら静的に型付けしてくれよ…とは思う)
Erlangではデータ(term)に型のタグをつけることで、実行時に型をチェックする。
5. The Erlang Virtual Machine: BEAM
真骨頂である、BEAMについて。
BEAMの特性は、
- レジスタマシン
- ノンプリエンプティブ
- 直接スレッド化
- ガベージコレクション
で、それぞれの特性について説明されている。
通常、マシンはスタックを使用して演算を行うが、BEAMはレジスタを使って演算を行う。
例えば、レジスタに関数の戻り値や引数を格納する領域を確保したりしている。
また、通常はスレッドやプロセスがプリエンティブにスケジュールされているが、BEAMではノンプリエンティブスケジュールになっている。
例えば、Erlangのような動的メモリ管理とタグ付き値を持つ言語では、実行中のメモリにタグなし値がないときだけプロセスが終了するような実装にすることができる。
雑感
もともとは、私が「BEAMって何をしているんだろう、でもオリジナルのBEAMのソースコード見てもわからないな」という呟きをzackyさんが拾っていただいて、紹介いただいたものでした。
おかげでBEAMについてはある程度、雰囲気レベルではありますが理解は深められたと自覚しています。
ただ、事細かに紐解いて理解する、というレベルには至っていないというのが現状です。
紹介いただいたのにもったいないな、というお気持ちをこのような形で吐露するのにも時間がかかった、というのもある種罰当たりなところがあります。時間が過ぎてしまっただけだなぁと後悔しているところです。
これまでではなく、これから、2023年について
来年、2023年はもう少しElixirコミュニティに関りを増やしていこうかと思っています。
また、zackyさんから紹介いただいた本ペーパーについて慎ましく静かに翻訳でもしていこうかな、と考えています。
ただ、「翻訳しても中身がわからない」という事態は往々にしてあると思います。その際は、どうか皆様の温かいご助力をいただけますと幸いです。