ゲームサーバーの作成に関しては、スケーラビリティと同時実行機能を備えた「この種のことのために構築された」言語として、Erlang が常に登場するようです。私は Haskell も Erlang も経験していませんが、表面上は同じように見えます。Haskell のドキュメントを見ると、マルチプロセッサのスケーラビリティと同時実行性がサポートされているようで、Haskell はより堅実な言語であり、目に見えて優れたコミュニティを持っていると言われています。私の質問は、Haskell は Erlang と同じくらい優れたサーバー構築ソリューションであると考えられているのでしょうか?
8 に答える
サーバーで何をしたいかによって異なります。テレコム アプリケーションから予想されるように、Erlang は、非常に高い並行性で単純なタスクを実行することに優れています。サーバーが 1 秒あたり、または一度に膨大な数の接続を必要とする場合、Erlang はあなたの味方です。Erlang は、複数のサーバーに負荷を分散するためのより優れたサポートも提供します。
Haskell は複雑なシンボリック計算に優れており、 2009 年 4 月現在、非常に多くのスレッドを処理することもできます (以下の更新を参照)。さらに、Haskell には、複雑なコードを正しく処理するためのツールが他にもあります。たとえば、 QuickCheck、SmallCheck、静的型システムなどです。そのため、サーバーが複雑で興味深いことを行っていて、サーバーが 1 つしかない場合は、おそらく Haskell を使用したほうがよいでしょう。
2009 年 4 月 13 日更新: 信頼できる情報源である Don Stewart は、「Glasgow Haskell Compiler の最後のスレッドスケーリングのバグは数か月前に修正された」と報告しており、一部のユーザーは 100 万個の Haskell スレッドを問題なく使用していると報告しています。2009 年 1 月の時点で、これがどのように達成されるかを説明している実装者からの新しい未発表の論文があります。
2012 年 2 月 21 日更新: John Hughes の会社であるQuviQは、Erlang 用の QuickCheck を作成しています。彼らは多くの非常に興味深いバグを発見しました。「QuickCheck Mini」は無料でダウンロードできます。Haskell QuickCheck に匹敵します。より強力な商用バージョンもあります。
これらの論文のベンチマークは、Haskell が Apache と競合できることを示しています。
Concurrent Haskell で高性能 Web サーバーを開発する
— Simon Marlow
スケーラブルなネットワーク サービスのためのイベントとスレッドの結合: モナディックなアプリケーション レベルの同時実行プリミティブの実装と評価
— Peng Li Stephan A. Zdancewic (図 19 を参照)
私は Haskell も Erlang も経験していませんが、表面上は同じように見えます。
Haskell と Erlang の間にはいくつかの大きな違いがあります。Erlang は、並行システム用に特別に設計されています。言語と仮想マシンはどちらも非常に多くのプロセスをサポートするように設計されており、Erlang はアクター スタイルのシステムを使用してそれらすべての間の通信を管理します。Haskell はまた、その機能的な性質により、並行性をかなり簡単にサポートしますが、 Haskell で並行プログラミングを行うのはまだ少し難しく、言語はこれを容易にするように特別に設定されていません。
Haskell と同様に、Erlang はプロセス間で状態を共有しないため、マルチプロセス ソフトウェアを簡単に作成できます。しかし、Haskell と Erlang のプログラミング スタイルは少し異なります。Erlang は小さなプロセスを使用して並行処理を実行することを重視しているためです。
私は Haskell が大好きで、お気に入りの言語の 1 つですが、サーバー ソフトウェアを作成する場合は、おそらく Erlang を使用するでしょう。しかし、Haskell をよく知っているか、ライブラリのサポートが優れていることがわかっている場合は、Haskell でサーバーを作成することは確かに可能です。
新しいオプションがあります: Haskell/Erlang FFI を使用して、Haskell でロジックを記述し、Erlang を使用して通信します。
前回見たとき、Erlang でスケーラブルなサーバーを構築するためのライブラリとフレームワークは、Haskell のものよりも少し成熟しているように見えました。これらの情報については、プログラミング Erlang: Software for a Concurrent Worldを参照することをお勧めします。
遅延が原因で、Haskell アプリケーションにメモリ リークが発生しやすくなります。長時間稼働するサーバーは、まさにメモリ リークを発生させたくない種類のプログラムです。
Haskell の方がしっかりした言語であり、プログラミングしやすいという点には同意しますが、Erlang の方がはるかに簡単で、このような用途に特化したライブラリが多数あります。
Mnesia に相当する Haskell はないと思いますし、それを書くのは難しいでしょう。、などの Haskell バージョンを作成することはできますが、それらは 10 年以上にわたって最適化および調整されていません。gen_server
gen_event
Haskell が Erlang と同じくらい優れているかどうかは、人々が言語に何を求めているかによって異なります。どちらもゲーム サーバーとしては十分に機能すると思いますが、それは主にプログラミング言語に何を求めているか、何を期待しているかに依存します。最も簡単な違いの 1 つは、Haskell が型推論を備えた静的型付け言語であり、Erlang が動的型付け言語であることです。全体として、関数型プログラミングに慣れていない人にとって、Haskell にはもう少し「洗練された」機能が必要だと思います。
そう思う人もきっといると思いますが、Erlang がこの種の使用をサポートする能力について誤解していると思います。電話アプリケーションで広く使用されており、実際には非常に堅牢です。Erlang は、信頼性が高く同時実行性の高いサーバー向けに最適化されています。