31

J'essaie de trouver les différences entre ce que Clojure appelle un STM et ce qui est implémenté dans Haskell comme STM. En tenant compte des différences sémantiques réelles, je suis un peu confus, comme le dit Rich Hickey dans son discours, que la mise en œuvre de STM par Clojure est très différente de tout ce qui existe, mais je ne comprends pas les différences.Quelle est la différence entre Clojure STM et Haskell STM?

Répondre

25

Clojure STM dispose de 3 grandes caractéristiques uniques:

  1. Met en oeuvre image MVCC évitant les transactions redémarrages sur infirmation de lecture.
  2. Garantit que les références sur les écritures en lecture fournissent une sorte de contrôle manuel sur l'ordre d'acquisition des ressources.
  3. A explicitement commute qui réduit les tentatives sur les écritures commutatives.
+3

vous pouvez également ajouter les frais généraux pour les lectures zéro non transactionnel à cette liste? – mikera

+0

C'est vrai, quand vous utilisez un contexte non-transactionnel, mais si vous considérez STM et réessaye sur d'autres transactions, je ne suis pas sûr que le système de trou souffre des performances causées par le swap de contexte.Mais JVM est très mature et STM est comme un GC ... très nécessaire, donc vous devriez penser de cette façon –

+1

Salut william. En lisant l'article et la présentation de Mark volkmann, il a dit que "reads ne déclenche une nouvelle tentative dans Clojure que lorsque la liste d'historique d'un Refdoes ne contient pas une valeur validée avant le début du txn". La première caractéristique décrite ci-dessus est correcte? – CHAPa

12

Mark Volkmann a fait une présentation très détaillée sur STMs en général (et la STM Clojure en particulier) à 2009 Boucle étrange que vous pouvez trouver here (article et diapositives here). Je ne connais pas d'autre ressource (autre que le code) pour comprendre comment fonctionne la STM de Clojure.

+0

Le lien de présentation ne fonctionne pas. Quelqu'un at-il une alternative à cette conversation? – Neil

+1

Les diapositives de présentation et un article détaillé sur le sujet sont disponibles ici http://java.ociweb.com/mark/stm/article.html – lorefnon

+1

Une bonne lecture. Très accessible M. Volkmann est un écrivain doué. – Alex

16

Pour Haskell STM, voir les papiers de SPJ: http://research.microsoft.com/en-us/um/people/simonpj/papers/stm/

Particulièrement utile sont des "transactions de mémoire Composables" et "mémoire transactionnelles avec des données invariants". La mise en œuvre de STM par GHC n'est en effet pas MVCC. Je ne me souviens pas de tous les détails de mise en œuvre, mais je crois comprendre que la description dans les documents n'est pas si différente de ce qui existe actuellement dans GHC.

(notez que MVCC, en Clojure ou ailleurs, rend l'écriture d'inclinaison possible - voir, par exemple, ici: http://en.wikipedia.org/wiki/Snapshot_isolation)

+8

Il convient également de noter que la mise en œuvre de GHC fournit des garanties au moment de la compilation de la sécurité d'une transaction en ce qui concerne les effets secondaires; et le combinateur unique 'orElse' pour la composition atomique des transactions. –

+0

@DonStewart De plus, Haskell 'STM' est un' MonadPlus', qui vous permet de spécifier des conditions d'échec supplémentaires dans le contexte de la transaction. c'est-à-dire que si le solde du compte final est négatif, échec/réessayer le txn. Cela vous permet également de partager facilement cette logique avec d'autres classes 'MonadPlus'; la même fonction montrerait le résultat de toutes les transactions valides * potentielles, compte tenu d'une liste de comptes et d'achats. Cela peut être utile si la logique est complexe. Je ne pense pas non plus que ce soit possible dans le clojure. –

Questions connexes