54

関数型プログラミングのパラダイムに賛同している場合は、ErlangとHaskellの両方が好きである可能性があります。どちらも純粋に機能的なコアと、マルチコアの世界にぴったりの軽量スレッドなどの他の優れた機能を備えています。しかし、いくつかの違いもあります。

Erlangは、成熟した配布モデルを備えた、商業的に証明されたフォールトトレラント言語です。ホットコードの読み込みを介して実行時にバージョンをアップグレードする機能には、一見ユニークな機能があります。(かっこいい!)

一方、Haskellは、主流の言語の中で最も洗練された型システムを備えています。(ここで、「mainstream」をO'Reillyの本が出版されている言語と定義しているので、Haskellは重要です。)その直線的なシングルスレッドのパフォーマンスはErlangよりも優れており、軽量のスレッドもさらに軽く見えます。

私は残りのコーディングライフのために開発プラットフォームをまとめようとしていますが、 ErlangとHaskellを組み合わせて最高のプラットフォームを実現できるかどうか疑問に思っていました。この質問には2つの部分があります。

  1. Erlangを一種のフォールトトレラントMPIとして使用して、GHCランタイムインスタンスを結合したいと思います。GHCランタイムごとに1つのErlangプロセスがあります。「不可能が起こった」とGHCランタイムが停止した場合、Erlangプロセスはそれを何らかの形で検出して停止します。Erlangのホットコードのロードおよび配布機能は引き続き機能します。GHCランタイムは、1つのコアのみ、ローカルマシン上のすべてのコア、またはそれらの間の任意の組み合わせを使用するように構成できます。Erlangライブラリが作成されたら、残りのErlangレベルのコードは純粋に定型的であり、アプリケーションごとに自動的に生成されます。(たとえば、Haskell DSLによるものかもしれません。)これらのことの少なくともいくつかをどのように達成するのでしょうか?
  2. ErlangとHaskellが同じガラベージコレクターを共有できるようにしたいと思います。(これは、1よりもはるかに遠い考えです。)JVMおよびCLRで実行される言語は、ランタイムを共有することにより、より多くの質量を実現します。JVMまたはCLRのいずれかでErlang(ホットコードのロード)とHaskell(より高度な種類のポリモーフィズム)を実行することには技術的な制限があることを理解しています。しかし、ガベージコレクターだけをアンバンドルするのはどうですか?(関数型言語のランタイムの開始を並べ替えます。)割り当ては明らかに高速である必要があるため、そのビットを静的にリンクする必要があります。また、可変ヒープと不変ヒープを区別するためのメカニズムが必要です( GHCがこれを必要とするため、レイジーライトワンスメモリを含む)。ガベージコレクターがヒープを共有できるように、HIPEとGHCの両方を変更することは可能でしょうか?

経験(ポジティブまたはネガティブ)、アイデア、提案で答えてください。実際、どんなフィードバックでも(まっすぐな虐待を除いて!)大歓迎です。

アップデート

これまでの4つの返信すべてに感謝します。それぞれが、私が知らなかった有用なことを少なくとも1つ教えてくれました。

残りのコーディングライフについては、議論を巻き起こすために頬に少し舌を入れましたが、実際にはそうです。死ぬまで取り組むつもりのプロジェクトがあり、安定したプラットフォームが必要です。

上で提案したプラットフォームでは、ボイラープレートErlangが自動的に生成されるため、Haskellのみを記述します。では、ハスケルはどのくらい続くのでしょうか?さて、Lispはまだ私たちと一緒にいて、すぐになくなるようには見えません。HaskellはBSD3オープンソースであり、クリティカルマスを達成しています。プログラミング自体が50年経ってもまだ存在しているのであれば、Haskell、またはHaskellの継続的な進化がまだここにあると思います。

rvirdingの投稿に応じて2を更新

同意しました-完全な「Erskell/Haslang」ユニバーサル仮想マシンを実装することは絶対に不可能ではないかもしれませんが、それは確かに非常に難しいでしょう。ガベージコレクターレベルをVMのようなものとして共有することは、それでも難しいことですが、私には桁違いに難しいことではありません。ガベージコレクションモデルでは、関数型言語には多くの共通点が必要です。不変データ(サンクを含む)の不公平性と、非常に高速な割り当ての要件です。したがって、共通性がモノリシックVMに緊密にバンドルされているという事実は、ちょっと奇妙に思えます。

VMは、クリティカルマスの達成に役立ちます。F#やScalaのような「ライト」関数型言語がどのように普及したかを見てください。ScalaはErlangの絶対的なフォールトトレランスを持っていないかもしれませんが、JVMに縛られている非常に多くの人々に逃げ道を提供します。

単一のヒープを使用するとメッセージの通過が非常に速くなりますが、他にも多くの問題が発生します。主に、GCはインタラクティブでグローバルに非中断である必要があるため、実行がより困難になり、per-と同じ単純なアルゴリズムを使用できなくなります。プロセスヒープモデル。

絶対に、それは私には完全に理にかなっています。GHC開発チームの非常に賢い人々は、並列の「世界を止める」GCで問題の一部を解決しようとしているようです。

http://research.microsoft.com/en-us/um/people/simonpj/papers/parallel-gc/par-gc-ismm08.pdf

(明らかに、「世界を止める」は、その主なユースケースを考えると、一般的なErlangでは飛ばないでしょう。)しかし、「世界を止める」がOKのユースケースでさえ、それらのスピードアップは普遍的ではないようです。だから私はあなたに同意します、普遍的に最高のGCがある可能性は低いです、それは私が私の質問のパート1で指定した理由です

GHCランタイムは、1つのコアのみ、ローカルマシン上のすべてのコア、またはそれらの間の任意の組み合わせを使用するように構成できます。

このようにして、特定のユースケースで、ベンチマークを行った後、Erlangの方法を選択し、1つのGHCランタイム(シングルスレッドGCを使用)とコアごとに1つのErlangプロセスを実行し、Erlangにコア間でメモリをコピーさせてローカリティを高めることができます。 。

または、プロセッサあたり4コアで、プロセッサのメモリ帯域幅が良好なデュアルプロセッサマシンでは、ベンチマークにより、1つのGHCランタイム(並列GCを使用)とプロセッサあたり1つのErlangプロセスを実行することが提案される場合があります。

どちらの場合も、ErlangとGHCがヒープを共有できれば、共有はおそらく単一のコアで実行されている単一のOSスレッドにバインドされます。(私はここで私の深みから抜け出しているので、私は質問をしました。)

また、GCとは独立した関数型言語のベンチマークという別の議題もあります。OCaml v GHC v Erlang v ...のベンチマークの結果をよく読んで、結果がさまざまなGCによってどれほど混乱しているか疑問に思います。GCの選択が関数型言語の選択と直交する可能性がある場合はどうなりますか?とにかくGCはどれくらい高価ですか?この悪魔擁護者のブログ投稿を参照してください

http://john.freml.in/garbage-collection-harmful

私のLispの友人であるJohnFremlinは、魅力的に、彼の投稿タイトルに「自動ガベージコレクションはごみです」と付けています。ジョンがGCが遅く、それほど高速化していないと主張するとき、私はいくつかの数値で対抗できるようにしたいと思います。

4

6 に答える 6

33

多くの Haskell と Erlang の人々は、Erlang が配布を監視し、Haskell が共有メモリ ノードを並行して実行してすべての計算/ロジックを実行するモデルに関心を持っています。

これに向けた出発点は haskell-erlang ライブラリです: http://hackage.haskell.org/package/erlang

Ruby の世界でも Hubris を通じて同様の取り組みを行っています: http://github.com/mwotton/Hubris/tree/master

ここでの問題は、Erlang と Haskell の相互運用を実際に進めてトリッキーな問題を見つけてくれる人を見つけることです。

于 2009-09-09T10:45:45.793 に答える
5

Haskell と Erlang の間で GC を混ぜて興味深い時間を過ごすことになるでしょう。Erlang はプロセスごとのヒープを使用し、プロセス間でデータをコピーします。Haskell にはプロセスの概念さえないため、この「ユニバーサル」GC を 2 つの間でどのようにマッピングするかわかりません。さらに、最高のパフォーマンスを得るために、Erlang はさまざまなアロケータを使用しますが、それぞれの動作がわずかに微調整されており、GC サブシステムに影響を与えると確信しています。

ソフトウェアのすべてのものと同様に、抽象化には代償が伴います。この場合、両方の言語のインピーダンスの不一致を克服するために非常に多くのレイヤーを導入する必要があり、パフォーマンスの低い (または有用な) 一般的な VM になってしまうのではないかと思います。

結論 -- 違いを受け入れましょう! 特に信頼性の観点から、すべてを同じプロセスで実行しないことには大きな利点があります。また、1 つの言語/VM が一生続くと期待するのは少しナイーブだと思います (a.) 短期間の生活を計画している場合や、b.) ある言語でのみ機能するある種のコード修道士になることを計画している場合を除きます。単一のプロジェクト)。ソフトウェア開発とは、精神的な敏捷性と、利用可能な最高のツールを喜んで使用して、高速で信頼性の高いコードを構築することです。

于 2009-09-09T12:39:53.480 に答える
5

これはかなり古いスレッドですが、読者がまだ興味を持っている場合は、Erlang スタイルの並行性と分散を GHC 安定版にもたらすCloud Haskellを調べる価値があります。

近日公開予定の分散プロセス プラットフォームライブラリは、Erlang/OTP から借用して着想を得た、gen_servers、監視ツリー、およびその他のさまざまな「Haskell フレーバー」抽象化などの OTP 風の構造のサポートを追加します。

于 2013-01-23T14:59:34.577 に答える
4

dizzyd がコメントで述べたように、メッセージ内のすべてのデータがコピーされるわけではありません。大きなバイナリはプロセス ヒープの外に存在し、コピーされません。

異なるメモリ構造を使用して、プロセスごとに別個のヒープを持たないようにすることは確かに可能であり、以前の多くの実装で行われています。ヒープを 1 つ持つとメッセージ パッシングが非常に高速になりますが、他の多くの問題が発生します。主に、GC はインタラクティブでグローバルに非中断的でなければならないため、GC の実行がより困難になるため、ヒープごとに同じ単純なアルゴリズムを使用することはできません。プロセス ヒープ モデル。

不変のデータ構造を使用する限り、堅牢性と安全性に問題はありません。どのメモリと GC モデルを使用するかを決定することは大きなトレードオフであり、残念ながら、普遍的に最適なモデルがあります。

Haskell と Erlang はどちらも関数型言語ですが、多くの点で非常に異なる言語であり、実装も非常に異なります。両方の言語を効率的に処理できる "Erskell" (または Haslang) マシンを考え出すのは難しいでしょう。個人的には、それらを別々に保ち、それらの間に本当に良いインターフェースがあることを確認する方がはるかに良いと思います.

于 2009-09-09T15:34:55.023 に答える
4
  1. OTP gen_supervisor プロセスを使用して、open_port() で生成した Haskell インスタンスを監視できます。「ポート」がどのように終了したかに応じて、それを再起動するか、意図的に停止したと判断して、対応する Erlang プロセスも終了させることができます。

  2. フゲダボウディット。あなたが話しているこれらの言語に依存しない VM でさえ、言語間で渡されるデータに問題がある場合があります。データベース、XML-RPC など、何らかの方法で 2 つの間でデータをシリアル化する必要があります。

ところで、残りの人生を 1 つのプラットフォームで過ごすという考えも、おそらく非現実的です。コンピューティング テクノロジとファッションはあまりにも頻繁に変化し、1 つの言語だけを永遠に使い続けることができるとは期待できません。あなたの質問そのものがこれを指摘しています。今日でさえ、私たちが望むかもしれないすべてを1つの言語で行うことはできません。

于 2009-09-09T05:20:13.517 に答える
2

CLRは、明示的なオペコード(F#で使用される)を使用した末尾呼び出しの最適化をサポートしますtail。これは、JVMには(まだ)同等のものがないため、このようなスタイルの言語の実装が制限されます。個別AppDomainのを使用すると、CLRでコードをホットスワップできます(たとえば、このブログ投稿を参照して、コードをホットスワップする方法を示します)。

サイモンペイトンジョーンズがドンサイムとMicrosoftResearchのF#チームの廊下のすぐ下で働いているので、最終的に何らかの公式のステータスを持つIronHaskellが見られなかったとしたら、それは大きな失望です。IronErlangは興味深いプロジェクトです。最大の作業は、Windowsワークフローエンジンほど重くならずに、またはCLR上でBEAM VMを実行しなくても、グリーンスレッドスケジューラを移植することでしょう。

于 2009-09-09T06:57:19.927 に答える