31

私は、ClojureがSTMと呼ぶものと、HaskellでSTMとして実装されるものとの違いを見つけようとしています。リッチ・ヒッキーはスピーチで、ClojureのSTMの実装は他のものとは非常に異なっていると言っていますが、実際の言語の意味の違いを除いて少し混乱していますが、言語の選択とは別の違いについてはわかりません。Clojure STMとHaskell STMの違いは何ですか?

答えて

25

ClojureのSTMは、3つの大ユニークな特徴を持っています

  1. は読み取り無効に取引の再起動を回避MVCCスナップショットを実装します。
  2. 読み取り書き込みに対する参照が、リソース取得順序の一種の手動制御を提供するようにします。
  3. 交換可能な書き込みの再試行を減らす明示的な通勤があります。
+3

非トランザクションは、このリストに読み込むためにあなたもゼロオーバーヘッドを追加するのでしょうか? – mikera

+0

非トランザクションコンテキストを使用しても、STMを検討して他のトランザクションを再試行すると、コンテキストスワップによってパフォーマンスが低下するかどうかはわかりません.JVMは非常に成熟しており、STMはGC ...非常に必要なので、そのように考えてください –

+1

こんにちはウィリアム。 Mark volkmannの記事とプレゼンテーションを読んだとき、彼は "Rexの履歴リストにtxnが始まる前にコミットされた値が含まれている場合、読み取りはClojureで再試行をトリガーするだけです"と述べました。上記の最初の機能は正しいですか? – CHAPa

12

マーク・フォルクマンは、あなたがhere(記事とhereをスライド)を見つけることができます奇妙なループ2009で非常に詳細な一般的なのSTMに関するプレゼンテーション(特にClojureののSTM)を行いました。 ClojureのSTMがどのように動作するかを理解するための他のリソース(コード以外)は実際にはわかりません。 HaskellのSTMの場合

+0

プレゼンテーションリンクが機能しません。誰もがこの話の代替案を持っていますか? – Neil

+1

プレゼンテーションスライドとそのトピックに関する詳細な記事は、http://java.ociweb.com/mark/stm/article.html – lorefnon

+1

でご覧になれます。非常にアクセスしやすい。 Volkmann氏は才能のある作家です。 – Alex

16

、SPJの論文を参照してください。特定の利用http://research.microsoft.com/en-us/um/people/simonpj/papers/stm/

は、「構成可能メモリトランザクション」であり、「データの不変量とトランザクショナルメモリ」。 GHCのSTMの実装は実際にはMVCCではありません。私はすべての実装の詳細を思い出しませんが、私の理解は、論文の記述が現在GHCに存在するものとは全く異なるわけではないということです。

(MVCC、Clojureの中や他の場所では、可能な書き込みスキューを作ることに注意してください - 例えば、ここでは、以下を参照してください。http://en.wikipedia.org/wiki/Snapshot_isolation)を

+8

GHCの実装は、副作用に関するトランザクションの安全性のコンパイル時の保証を提供することも注目に値する。トランザクションをアトミックに構成するためのユニークな「orElse」コンビネータです。 –

+0

@DonStewartさらに、Haskellの 'STM'は' MonadPlus'であり、トランザクションコンテキスト内で追加の失敗条件を指定することができます。最終勘定残高が負であれば、txnに失敗/再試行する。また、他の 'MonadPlus'クラスとそのロジックを簡単に共有することもできます。同じ機能は、アカウントと購入の 'リスト 'が与えられた場合、すべての*潜在的な有効なトランザクションの結果を示します。これは、ロジックが複雑な場合に便利です。私はどちらもクロージャーでは可能ではないと思う。 –

関連する問題