1 ポイント 投稿者 GN⁺ 2025-04-13 | 1件のコメント | WhatsAppで共有

背景

  • Erlangは信頼性の高い分散システムを構築するために開発された言語で、当初はPrologライブラリとして始まり、その後独立した言語へと発展した。
  • Ericssonで電話交換機をプログラミングするために使われ、1998年にオープンソース化された。
  • Joe ArmstrongはErlangの主要な設計者の一人であり、彼の博士論文はソフトウェアに欠陥がある状態でも信頼できる分散システムをどのように作るかを扱っている。

ビヘイビア(Behaviours)

  • ErlangのビヘイビアはJavaやGoのインターフェースに似ており、複数の実装を持てる型シグネチャの集合である。
  • ビヘイビアでは、プログラムのビジネスロジックを定義するコードだけを書けばよく、インフラコードは自動的に提供される。
  • ビヘイビアは専門家によって書かれ、ベストプラクティスに基づいている。

汎用サーバービヘイビア

  • gen_serverはキー・バリューストアを実装する例として説明される。
  • handle_callは状態を更新したりキーを検索したりする役割を担い、すべての並行性はgen_serverコンポーネントの中に隠蔽されている。

イベントマネージャービヘイビア

  • gen_eventはイベントマネージャーであり、イベントハンドラを登録し、メッセージが到着すると実行する。
  • エラーロギングに有用で、簡単なロガーの例が示されている。

状態機械ビヘイビア

  • gen_fsmgen_statemに名前が変更され、プロトコル実装に適している。

スーパーバイザービヘイビア

  • スーパーバイザーは他のプロセスが正常に動作しているかを確認し、失敗した場合は事前定義された戦略に従って再起動する。
  • one_for_one戦略は失敗したプロセスだけを再起動し、one_for_all戦略は1つのプロセスが失敗するとすべての子を再起動する。

アプリケーションおよびリリースビヘイビア

  • アプリケーションはスーパーバイザーツリーと必要なものすべてを含み、リリースは1つ以上のアプリケーションをパッケージ化する。
  • アップグレードに失敗した場合はロールバック可能でなければならない。

ビヘイビアの実装

  • Erlangの軽量プロセスやメッセージパッシングよりも、ビヘイビアの構造こそが信頼性の高いソフトウェアにつながる。
  • 他の言語でビヘイビアを実装するには、インターフェースのシグネチャを使って始めることができる。

ビヘイビアの正しさ

  • シミュレーションテストは分散システムのテストを容易にし、gen_serverビヘイビアの構造を使うことで問題解決を簡素化できる。

貢献

  • Martin Thompsonの作業からアイデアを取り入れて高速なイベントループを作り、非同期I/Oを追加するなどの案がある。
  • 興味がある場合や意見、提案、質問がある場合は連絡してほしい。

1件のコメント

 
GN⁺ 2025-04-13
Hacker Newsのコメント
  • ErlangとBEAMの驚くべき点は、その機能の深さにある。OPにとって最大の収穫はErlangのBehavior/Interfaceだった。個人的には、複雑なシステムを構築するのに必要な開発リソースが他の言語よりはるかに少ない点が重要だと思う。多くの人にとっては、軽量プロセスとプログラミングモデルが魅力的だ

    • OTPには非常に多くの機能が含まれている。私たちは現在、ElixirをiOSデバイス上で動作するようにコンパイルする作業を進めている。Erlangのeiライブラリを使えば、Cでノードをコンパイルし、他のErlangノードとインターフェースできる。Erlangのrpcライブラリを通じて、Cから関数を呼び出したり、Elixirアプリケーションとやり取りしたりできる
    • Erlangは、現代の技術スタックが苦戦している多くの問題をすでに解決しており、スケーラビリティや実装コストの問題を何十年も前に片付けていた。しかしHNでは、Erlang/Elixirへの関心が実際の採用にはつながっておらず、多くの企業がErlangスタックで無料で手に入るものを実装しようとして無駄に資金を費やしている
  • 何人かのマネージャーと一緒に、経験をもとに本を書こうとしている人たちと働いたことがある。私たちは成功要因について常に意見が食い違っていた。軽量プロセスとメッセージ受け渡しは秘密のソースではないと主張する人もいるが、ErlangのCommunicating Sequential Processesはこれらの特性と切り離せないことを見落としている

    • 例: アプリケーションプログラマーは逐次コードを書き、並行性はすべてbehaviorの中に隠されている
    • 新しいチームメンバーでも始めやすい。ビジネスロジックは逐次的で、以前に見たことがあるかもしれない類似の構造になっている
    • スーパーバイザーと「クラッシュさせたままにする」哲学は、信頼できるシステムを作ることに貢献する
  • 軽量プロセスとメッセージ受け渡しが理由で、私はErlangに再び関心を持つようになった。今のところbehaviorは副次的なものだった

    • プロジェクトは、視覚的なFlow Based Programming(FBP)をErlangに導入するというものだ。FBPはErlangに適しているように見え、すでに存在していたことに驚いた
    • FBPのツールとしてNode-REDを使っており、基本的なアイデアはNode-REDフロントエンドをErlangバックエンドに接続し、すべてのノードをプロセスにすることだ
  • EricssonがなぜErlangの使用をやめたのか、そしてJoeの解雇についての情報を探していた

    • 簡単に言えば、新規プロジェクトでJavaに移行したことでErlangが脇に追いやられたからだ。Joeと同僚たちは1998年にBluetailを設立し、その後Nortelに買収された。Nortelは通信業界の巨大企業で、2000年には株価が$125に達したが、2002年には$1未満にまで下落した。これはドットコムバブル崩壊と通信支出の減少に関連している
  • Erlang/Elixirの力は、Actorモデルの実装、Prologのマッチング、不変性、behaviorなどではなく、Joeが限られたリソースでより多くのことができると示そうとした熱意にある

    • よく設計された一貫性のあるシステムであり、他の言語ではめったに見られない一貫性を備えている。完璧ではないが印象的だ
    • ソフトウェアの世界では、単純さが持つ力に対する認識と受容が不足していると思う
  • Erlang、OTP、BEAMはbehavior以上のものを提供している。VMは仮想カーネルに似ており、スーパーバイザー、分離されたプロセス、分散モードを提供する。OTPはMnesia(データベース)、アトミックカウンター/ETSテーブル(キャッシュ)など有用なモジュールも提供する

    • 1年前、ある個人コンサルティング会社でErlangをバックエンド言語として採用した。BEAMの内部を調べて、TCPベースのスタックをQUICに置き換え、Rustのパッチを統合した
  • Erlang/BEAMで最も興味深い概念は、部分的な回復が基本機能として組み込まれていることだ。予期しない状態が発生したとき、プロセス全体を終了させたり、破損を引き起こす危険を冒したりする代わりに、可能な限り最も細かい粒度のレベルで、既知の正常な状態へロールバックする

  • Erlangのbehavior構造が他の言語やライブラリ設計者に模倣されない理由は、Erlangのbehavior関数シグネチャが、Erlangの他の機能、特に不変性の独特な使い方と密接に結びついているからだ

    • 他の言語で同じ目標を達成するには、Erlangのやり方をそのままコピーすべきではない。Erlangの信頼性の高いソフトウェアから学ぶことは勧めるが、Erlangのやり方を他の言語にそのまま移植することには強く反対する
  • この記事の内容には同意しない。behaviorはシステムの基本アーキテクチャのおかげで成立している。behaviorはインターフェースではなく、Javaのような言語における抽象オブジェクトに近い

    • Joeの論文は、与えられたレゴブロックのセットを使って信頼性の高いシステムを構築する方法を示している
  • behaviorはそれほど興味深いものではない。他のプログラミング言語にも存在する。BEAMの興味深い点は、エラーを投げることが非常にエレガントであることだ。エラーを投げることとbehaviorの力は、エラーの捕捉やコンテキスト情報の報告を容易にし、全体として高い組み合わせ可能性をもたらしている