まず第一に、Erlangの学習に関する私の正しい意見の答えに同意します。これはほとんど機能的な言語であり(同時実行が大きな役割を果たします)、その機能のすべてがフォールトトレランスと堅牢性に向けて追加されましたが、そもそもJavascriptとまったく同じ設計目標ではありません。
第二に、Node.jsからErlangに移行することは少し見当違いです。Node.jsは単一のサーバー/フレームワークであり、コールバックの助けを借りてイベント駆動型の方法ですべてを実行します。Erlangには独自のフレームワーク(OTP)がありますが、まったく同じレベルではありません。
Erlangの学習を計画している場合は、チュートリアルに入る前に、ブログエントリ「Erlang初心者(またはOnlooker)への公開レター」を紹介することをお勧めします。
ErlangとNode.jsをパターンと使用法の観点から比較できるのは、それらがイベント駆動型である方法だけです。ただし、ここには2つの大きな違いがあります。Node.jsのモデルは、イベントにバインドされたコールバックに基づいています。Erlangは、メッセージキューと選択的受信に基づいています。そこにはどんな意味がありますか?
まず、コールバックベースの方法で物事を行う場合、状態を保持する唯一の方法は、それをグローバルにするか、継続渡しスタイルのプログラミングに入ることです。第二に、イベントマトリックス全体を自分で管理する必要があります。この一例は、非常に単純な有限状態マシンを想像すると、イベント駆動型のミューテックスセマフォです。
ミューテックスセマフォには、ロックとフリーの2つの状態があります。計算の特定の単位(ワーカー、プロセス、関数、またはスレッド)がミューテックスにアクセスするたびに、「興味がある」ことを通知するイベントを発生させる必要があります。ここで、次のタイプのイベントに注意する必要があります。
- ミューテックスは無料であり、ロックを取得するように要求します
- ミューテックスは他の誰かによってロックされており、ロックを取得したい
- ミューテックスは自分でロックされており、ミューテックスを解放したい
次に、デッドロックを回避するためのタイムアウトなど、考慮すべき追加のイベントがあります。
- ミューテックスがロックされており、待機時間が長すぎたため、ファイアーを放棄するタイマー
- ミューテックスがロックされており、待機時間が長すぎてロックを取得し、タイムアウトが発生した
次に、バインドされていないイベントもあります。
- ミューテックスがフリーであると期待している間にミューテックスをロックしただけです。今、そのワーカーのクエリはキューに入れる必要があります。
- すべての作業を非同期にする必要があります
イベントマトリックスは非常に高速で複雑になります。ここのFSMには2つの状態しかありません。Erlang(または選択的に受信し、潜在的に同期イベントと非同期する任意の言語)の場合、いくつかのケースに注意する必要があります。
- ミューテックスは無料であり、ロックを取得するように要求します
- ミューテックスは他の誰かによってロックされており、ロックを取得したい
- ミューテックスは自分でロックされており、ミューテックスを解放したい
以上です。タイマーは受信と同じケースで処理され、「空きになるまで待機」に関係するものについては、メッセージは自動的にキューに入れられます。ワーカーは応答を待つだけです。これらの場合、モデルははるかに単純です。
これは、一般的な場合、CPSとnode.jsのようなコールバックベースのモデルは、イベントの処理方法について非常に賢いことを要求するか、複雑なイベントマトリックス全体を完全に処理するように要求することを意味します。奇妙なタイミングの問題や状態の変化に起因する重要でないケースごとにコールバックする必要があります。
通常、選択的受信を使用すると、潜在的なすべてのイベントのサブグループにのみ集中でき、その場合のイベントについてはるかに簡単に推論できます。Erlangには、と呼ばれるものの動作(設計パターン/フレームワーク実装)があることに注意してくださいgen_event
。gen_event実装を使用すると、node.jsで使用されているものと非常によく似たメカニズムを使用できます。
それらを区別する他のポイントがあります。Erlangはプリエンプティブスケジューリングを備えていますが、node.jsは協調的であり、Erlangは非常に大規模なアプリケーション(配布およびすべて)により適していますが、Node.jsとそのコミュニティは通常、よりWebに適合し、最新のWebトレンドについて知識があります。最適なツールを選択するかどうかは問題であり、これはあなたの背景、問題の種類、好みに依存します。私の場合、Erlangのモデルは私の考え方にぴったりです。これは、必ずしもすべての人に当てはまるわけではありません。
お役に立てれば。