[解決済み】Node.jsに対するHaskellの対応について教えてください。
質問
ErlangコミュニティはNode.jsを羨ましく思っていないと思います。Node.jsはネイティブでノンブロッキングI/Oを行い、複数のプロセッサに簡単にデプロイする方法があります(Node.jsには組み込まれていないもの)。 詳しくは http://journal.dedasys.com/2010/04/29/erlang-vs-node-js および Node.jsまたはErlang
Haskellはどうでしょうか? HaskellはNode.jsの利点の一部、つまりマルチスレッドプログラミングに頼ることなくI/Oのブロッキングを回避するクリーンなソリューションを提供できるでしょうか?
Node.jsの魅力はたくさんあります。
- イベント スレッド操作なし、プログラマはコールバックのみを提供(Snapフレームワークと同様)。
- コールバックはシングルスレッドで実行されることが保証されており、レースコンディションが発生しない。
- UNIXフレンドリーのシンプルなAPI。 ボーナス:優れたHTTPサポート。DNSも利用可能です。
- すべてのI/Oは、デフォルトで非同期です。これにより、ロックの回避が容易になります。 しかし、コールバックでのCPU処理が多すぎると、他の接続に影響を与えます(この場合、タスクを小さなサブタスクに分割して再スケジューリングする必要があります)。
- クライアントサイドとサーバーサイドの言語が同じであること。(jQueryとNode.jsはイベントプログラミングモデルを共有していますが、それ以外は大きく異なっています。 サーバーサイドとクライアントサイドでコードを共有することが、実際にどのように役に立つのか、私には理解できない)
- これらをすべて1つの製品にパッケージしました。
解決するには?
OK、それでは node.jsのプレゼンテーション が教えてくれたように、Haskell と node.js を比較する方法についてもう少し説明できます。 プレゼンテーションの中で、RyanはGreen Threadsの利点のいくつかを説明していますが、その後、スレッドの抽象化がないことは欠点とは思わないと言い続けています。 私は、特にHaskellの文脈では、彼の立場には同意できない。スレッドが提供する抽象化は、サーバーコードをより簡単に正しく、より堅牢にするために不可欠なものだと思います。 特に
-
を処理するコードを書くのではなく、1つの接続に対して1つのスレッドを使用することで、1つのクライアントとの通信を表現するコードを書くことができます。 すべて のクライアントを同時に表示します。 このように考えてください。スレッドで複数のクライアントを処理するサーバは、単一のクライアントを処理するサーバとほとんど同じに見えます。
fork
前者のどこかに 実装するプロトコルが少しでも複雑だと、複数のクライアントのステートマシンを同時に管理するのはかなり厄介になる。一方、スレッドを使えば、単一のクライアントとの通信をスクリプト化するだけで済む。 一方、スレッドでは単一のクライアントとの通信をスクリプト化するだけなので、コードを正しく書くのも簡単だし、理解やメンテナンスもしやすい。 -
スレッドで実現するプリエンプティブなマルチタスクとは対照的に、1つのOSスレッドでコールバックを行うのは、協調的なマルチタスクと言えます。 協調型マルチタスクの主な欠点は、プログラマが飢餓状態にならないようにする責任があることです。 モジュール性が失われ、一カ所でミスをすると、システム全体がおかしくなってしまいます。 これは本当に心配したくないことで、先取りは簡単な解決策です。 さらに、コールバック間の通信は不可能です(デッドロックになります)。
-
Haskellでは、ほとんどのコードが純粋で、構造上スレッドセーフなので、並行処理は難しくありません。 単純な通信プリミティブがあります。 Haskellでは、無制限の副作用を持つ言語よりも、同時並行で自分の足を撃つのがずっと難しいのです。
関連
-
[解決済み] package.jsonのチルダ(~)とキャレット(^)の違いは何ですか?
-
[解決済み] Node.jsのプログラムにコマンドライン引数を渡すにはどうしたらいいですか?
-
[解決済み] npm installの-saveオプションは何ですか?
-
[解決済み] Node.jsを使うタイミングをどう判断するか?
-
[解決済み] Node.jsで終了する方法
-
[解決済み] Node.jsでファイルを書き込む
-
[解決済み] プロセスとスレッドの違いは何ですか?
-
[解決済み] Node.jsのmodule.exportsの目的と使い方を教えてください。
-
[解決済み] レースコンディションとは何ですか?
-
[解決済み] Node.js + Nginx - 今度は何?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Not on FX application thread; currentThread = JavaFX Application Thread エラーを回避する方法は?
-
[解決済み] スレッドコンテンションとは何ですか?
-
[解決済み] POSIXシステムでのゾンビスレッド
-
[解決済み] "フリースレッド "と "スレッドセーフ "の違いについて
-
[解決済み] デッドロックとは何ですか?
-
[解決済み] 初心者のためのアトミック操作とは?
-
[解決済み】「スレッド」とは(本当は)何ですか?)
-
[解決済み】スレッド間で共有されるリソースは何ですか?
-
[解決済み】糸と繊維の違いは何ですか?
-
[解決済み] Re-entrantロックとは何ですか?