背景
- Erlangは信頼性の高い分散システムを構築するために開発された言語で、当初はPrologライブラリとして始まり、その後独立した言語へと発展した。
- Ericssonで電話交換機をプログラミングするために使われ、1998年にオープンソース化された。
- Joe ArmstrongはErlangの主要な設計者の一人であり、彼の博士論文はソフトウェアに欠陥がある状態でも信頼できる分散システムをどのように作るかを扱っている。
ビヘイビア(Behaviours)
- ErlangのビヘイビアはJavaやGoのインターフェースに似ており、複数の実装を持てる型シグネチャの集合である。
- ビヘイビアでは、プログラムのビジネスロジックを定義するコードだけを書けばよく、インフラコードは自動的に提供される。
- ビヘイビアは専門家によって書かれ、ベストプラクティスに基づいている。
汎用サーバービヘイビア
gen_serverはキー・バリューストアを実装する例として説明される。
handle_callは状態を更新したりキーを検索したりする役割を担い、すべての並行性はgen_serverコンポーネントの中に隠蔽されている。
イベントマネージャービヘイビア
gen_eventはイベントマネージャーであり、イベントハンドラを登録し、メッセージが到着すると実行する。
- エラーロギングに有用で、簡単なロガーの例が示されている。
状態機械ビヘイビア
gen_fsmはgen_statemに名前が変更され、プロトコル実装に適している。
スーパーバイザービヘイビア
- スーパーバイザーは他のプロセスが正常に動作しているかを確認し、失敗した場合は事前定義された戦略に従って再起動する。
one_for_one戦略は失敗したプロセスだけを再起動し、one_for_all戦略は1つのプロセスが失敗するとすべての子を再起動する。
アプリケーションおよびリリースビヘイビア
- アプリケーションはスーパーバイザーツリーと必要なものすべてを含み、リリースは1つ以上のアプリケーションをパッケージ化する。
- アップグレードに失敗した場合はロールバック可能でなければならない。
ビヘイビアの実装
- Erlangの軽量プロセスやメッセージパッシングよりも、ビヘイビアの構造こそが信頼性の高いソフトウェアにつながる。
- 他の言語でビヘイビアを実装するには、インターフェースのシグネチャを使って始めることができる。
ビヘイビアの正しさ
- シミュレーションテストは分散システムのテストを容易にし、
gen_serverビヘイビアの構造を使うことで問題解決を簡素化できる。
貢献
- Martin Thompsonの作業からアイデアを取り入れて高速なイベントループを作り、非同期I/Oを追加するなどの案がある。
- 興味がある場合や意見、提案、質問がある場合は連絡してほしい。
1件のコメント
Hacker Newsのコメント
ErlangとBEAMの驚くべき点は、その機能の深さにある。OPにとって最大の収穫はErlangのBehavior/Interfaceだった。個人的には、複雑なシステムを構築するのに必要な開発リソースが他の言語よりはるかに少ない点が重要だと思う。多くの人にとっては、軽量プロセスとプログラミングモデルが魅力的だ
eiライブラリを使えば、Cでノードをコンパイルし、他のErlangノードとインターフェースできる。Erlangのrpcライブラリを通じて、Cから関数を呼び出したり、Elixirアプリケーションとやり取りしたりできる何人かのマネージャーと一緒に、経験をもとに本を書こうとしている人たちと働いたことがある。私たちは成功要因について常に意見が食い違っていた。軽量プロセスとメッセージ受け渡しは秘密のソースではないと主張する人もいるが、ErlangのCommunicating Sequential Processesはこれらの特性と切り離せないことを見落としている
軽量プロセスとメッセージ受け渡しが理由で、私はErlangに再び関心を持つようになった。今のところbehaviorは副次的なものだった
EricssonがなぜErlangの使用をやめたのか、そしてJoeの解雇についての情報を探していた
Erlang/Elixirの力は、Actorモデルの実装、Prologのマッチング、不変性、behaviorなどではなく、Joeが限られたリソースでより多くのことができると示そうとした熱意にある
Erlang、OTP、BEAMはbehavior以上のものを提供している。VMは仮想カーネルに似ており、スーパーバイザー、分離されたプロセス、分散モードを提供する。OTPはMnesia(データベース)、アトミックカウンター/ETSテーブル(キャッシュ)など有用なモジュールも提供する
Erlang/BEAMで最も興味深い概念は、部分的な回復が基本機能として組み込まれていることだ。予期しない状態が発生したとき、プロセス全体を終了させたり、破損を引き起こす危険を冒したりする代わりに、可能な限り最も細かい粒度のレベルで、既知の正常な状態へロールバックする
Erlangのbehavior構造が他の言語やライブラリ設計者に模倣されない理由は、Erlangのbehavior関数シグネチャが、Erlangの他の機能、特に不変性の独特な使い方と密接に結びついているからだ
この記事の内容には同意しない。behaviorはシステムの基本アーキテクチャのおかげで成立している。behaviorはインターフェースではなく、Javaのような言語における抽象オブジェクトに近い
behaviorはそれほど興味深いものではない。他のプログラミング言語にも存在する。BEAMの興味深い点は、エラーを投げることが非常にエレガントであることだ。エラーを投げることとbehaviorの力は、エラーの捕捉やコンテキスト情報の報告を容易にし、全体として高い組み合わせ可能性をもたらしている