質問

機能的なプログラミングパラダイムを購入した場合、ErlangとHaskellの両方が気に入っている可能性があります。どちらも純粋に機能的なコアと、マルチコアの世界に適した軽量スレッドなどの他の良さを持っています。しかし、いくつかの違いもあります。

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

一方、Haskellには、主流の言語で最も洗練されたタイプシステムがあります。 (私は「主流」を公開されたO'Reillyの本があるので、Haskellカウントを持っているあらゆる言語であると定義しています。)その真っ直ぐなシングルスレッドパフォーマンスは、Erlangよりも優れており、その軽量のスレッドもさらに軽く見えます。

私は開発プラットフォームをまとめようとしています 私のコーディングライフの残り そして、最高の品種プラットフォームを達成するためにエルランとハスケルを混ぜることが可能かどうか疑問に思っていました。この質問には2つの部分があります。

  1. Erlangを、GHCランタイムインスタンスを一緒に接着するために、一種のフォールトトレラントMPIとして使用したいと思います。 GHCランタイムごとに1つのErlangプロセスがあります。 「不可能が起こった」とGHCランタイムが死んだ場合、Erlangプロセスはそれを何らかの形で検出して死にます。 Erlangのホットコードの読み込みと配布機能は、引き続き機能し続けます。 GHCランタイムは、1つのコアのみ、またはローカルマシン上のすべてのコア、またはその間の任意の組み合わせを使用するように構成できます。 Erlangライブラリが書かれたら、Erlangレベルの残りのコードは純粋にボイラープレートであり、アプリケーションごとに自動的に生成される必要があります。 (たとえば、Haskell DSLによって。)これらのことの少なくともいくつかをどのように達成しますか?
  2. ErlangとHaskellが同じガラベージコレクターを共有できるようにしたいと思います。 (これは1よりもはるかにアウトアイデアです。)JVMとCLRで実行される言語は、ランタイムを共有することでより大きな質量を達成します。 JVMまたはCLRのいずれかで、Erlang(ホットコードの読み込み)とHaskell(高kinded多型)を実行することには技術的な制限があることを理解しています。しかし、ゴミコレクターだけを解体するのはどうでしょうか? (機能的言語のランタイムの始まりのようなものです。)割り当ては明らかに非常に速くなければならないので、そのビットを静的にリンクする必要があるかもしれません。 GHCがこれを必要とするので、メモリを一度に怠zyな書き込みを繰り返します。ゴミコレクターがヒープを共有できるように、HIPEとGHCの両方を変更することは可能ですか?

あらゆる経験(肯定的または否定的)、アイデア、または提案で答えてください。実際、フィードバック(まっすぐな虐待に匹敵しません!)は大歓迎です。

アップデート

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

それにかんする 残りのコーディングライフ 事 - 私はそれを頬に少し舌を描いて議論を引き起こしましたが、それは実際には真実です。私が死ぬまで取り組むつもりであり、安定したプラットフォームが必要であることを念頭に置いているプロジェクトがあります。

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

更新2 RVirdingの投稿に応じて

合意 - 完全な「erskell/haslang」ユニバーサル仮想マシンを実装することは絶対に不可能ではないかもしれませんが、確かに非常に難しいでしょう。まだVMのようなものとしてゴミコレクターレベルだけを共有する 難しい, 、しかし、私には数桁難しいように聞こえます。ガベージコレクションモデルでは、機能的言語には多くの共通点が必要です。これは、不変のデータ(サンクを含む)の不自由なものと、非常に高速な割り当ての要件です。したがって、共通性がモノリシックVMにしっかりと束ねられているという事実は、ちょっと奇妙に思えます。

VMは臨界質量を達成するのに役立ちます。 F#やScalaのような「ライト」の機能言語がどのように離れたかを見てください。 ScalaはErlangの絶対的な断層の耐性を持っていないかもしれませんが、JVMに縛られている非常に多くの人々に脱出ルートを提供します。

単一のヒープを持つことでメッセージが非常に速く渡されると、他の多くの問題が導入されます。主にGCを実行することは、インタラクティブでグローバルに非断続的であるため、より困難になるため、パーマと同じ単純なアルゴリズムを使用できないため、ヒープモデルを処理します。

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

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

(明らかに、「停止する世界」は、その主なユースケースを考慮してエルラン将軍のために飛ぶことはありません。)しかし、「世界を止める」というユースケースでさえ、彼らのスピードアップは普遍的ではないようです。だから私はあなたに同意します、普遍的に最高のGCがある可能性は低いです。これが私がパート1で指定した理由です。

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

そのようにして、特定のユースケースについては、ベンチマークの後、Erlang Wayに行くことを選択し、1つのGHCランタイム(Singlethreadeded GCを使用)とコアごとに1つのErlangプロセスを実行し、Erlangがコア間でメモリ間で優れた地域をコピーできるようにすることができました。 。

あるいは、プロセッサに優れたメモリ帯域幅を備えたプロセッサごとに4つのコアを備えたデュアルプロセッサマシンでは、ベンチマークが1つのGHCランタイム(並列GC)とプロセッサごとに1つのErlangプロセスを実行することを示唆する場合があります。

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

また、GCとは無関係に機能言語をベンチマークする別のアジェンダもあります。多くの場合、私はOCAML V GHC V Erlang Vのベンチマークの結果を読みました...そして、異なるGCSによって結果がどれだけ混乱しているのだろうと思います。 GCの選択が機能的言語の選択に直交する可能性がある場合はどうなりますか?とにかくGCはどれくらい高価ですか?この悪魔の支持者ブログ投稿を参照してください

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

私のリスプの友人であるジョン・フレムリンによって、彼は魅力的に、彼の投稿タイトル「自動化されたガベージコレクションはごみだ」を与えました。ジョンがGCが遅く、あまりそれほどスピードを上げていないと主張するとき、私はいくつかの数字で対抗できるようにしたいと思います。

役に立ちましたか?

解決

HaskellとErlangの多くの人々は、Erlangが分布を監督するモデルに興味がありますが、Haskellはすべての数のクランチ/ロジックを実行する共有メモリノードを並行して実行します。

これに向けたスタートは、Haskell-Erlangライブラリです。 http://hackage.haskell.org/package/erlang

そして、私たちはhub慢を介してルビーランドで同様の努力をしています: http://github.com/mwotton/hubris/tree/master

現在の問題は、実際にErlang / Haskell Interopを押して、トリッキーな問題を見つける人を見つけることです。

他のヒント

HaskellとErlangの間でGCを混ぜ合わせる興味深い時間を過ごすことになります。 Erlangはプロセスごとのヒープを使用し、プロセス間でデータをコピーします - Haskellにはプロセスの概念さえないため、この「ユニバーサル」GCを2つの間にどのようにマッピングするかはわかりません。さらに、最高のパフォーマンスのために、Erlangはさまざまなアロケーターを使用しています。

ソフトウェアのすべてのものと同様に、抽象化にはコストがかかります。この場合、私はむしろ、あなたが彼らのインピーダンスの不一致で両方の言語を取得するために非常に多くのレイヤーを導入する必要があると疑っています。

結論 - 違いを受け入れます!特に信頼性の観点から、同じプロセスですべてを実行しないことには大きな利点があります。また、1つの言語/VMがあなたの人生の残りの間(あなたが計画していない限り)あなたが短時間で生きることを期待していないか、b。)、またはのみ作業するだけのコードモンクになることを期待するのは少し素朴だと思います。単一プロジェクト)。ソフトウェア開発とは、精神的な敏ility性に関するものであり、最適な利用可能なツールを使用して、高速で信頼できるコードを構築することです。

これはかなり古いスレッドですが、読者がまだ興味を持っているなら、それを見る価値があります クラウドハスケル, 、Erlangスタイルの並行性と分布をGHC Stableにもたらします。

近日公開 分散プロセスプラットフォーム ライブラリは、Gen_Servers、監督木、その他のさまざまな「Haskell Flauled」抽象化などのOTP風景の構成要素をサポートし、Erlang/OTPに触発され、触発されました。

  1. OTP GEN_SUPERVISORプロセスを使用して、Open_Port()でスポーンするHaskellインスタンスを監視できます。 「ポート」がどのように終了したかに応じて、再起動するか、意図的に停止し、対応するErlangプロセスも死ぬことを決定できます。

  2. fugheddaboudit。あなたが話すこれらの言語に依存しないVMでさえ、言語間で渡されるデータに問題があります。データベース、XML-RPCなど、2つの間にデータをシリアル化するだけです。

ちなみに、あなたの人生の残りのための単一のプラットフォームのアイデアもおそらく非現実的です。コンピューティングテクノロジーとファッションの変化は、1つの言語だけを永遠に使用できることを期待することができません。あなたの非常に質問がこれを示しています:今日でも私たちが望むかもしれないすべての言語は何もしません。

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

別のメモリ構造を使用して、プロセスごとの個別のヒープを持つことを避けることは確かに可能であり、多くの以前の実装で行われています。単一のヒープを持っている間、メッセージが渡されます とても 高速では、他の多くの問題を導入します。主にGCを実行すると、インタラクティブでグローバルに非壊滅的でなければならないため、プロセスごとのヒープモデルと同じ単純なアルゴリズムを使用できないため、より困難になります。

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

HaskellとErlangはどちらも機能的な言語ですが、多くの点で非常に異なる言語であり、実装が非常に異なります。両方の言語を効率的に処理できる「erskell」(またはhaslang)マシンを作成することは困難です。個人的には、それらを別々に保ち、それらの間に本当に良いインターフェースがあることを確認する方がはるかに良いと思います。

CLRは、明示的なテールコールの最適化をサポートします tail opcode(f#で使用されている)は、JVMには(まだ)同等のものを持っていないため、このような言語スタイルの実装が制限されます。個別の使用 AppDomainSはCLRがホットスワップコードを許可します(例を参照 このブログ投稿 それがどのように行われるかを示します)。

サイモン・ペイトン・ジョーンズがドン・シムの廊下をちょうど下って働いており、Microsoft ResearchのF#チームから廊下を歩いているので、最終的にはある種の公式ステータスを持つIronhaskellを見なかったなら、大きな失望になるでしょう。 Ironorlangは興味深いプロジェクトです。最大の作業は、おそらくWindowsワークフローエンジンと同じくらいヘビー級を獲得せずにグリーンスレッドスケジューラを移植するか、CLRの上でビームVMを実行することです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top