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
Clojure STM dispose de 3 grandes caractéristiques uniques:
- Met en oeuvre image MVCC évitant les transactions redémarrages sur infirmation de lecture.
- 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.
- A explicitement commute qui réduit les tentatives sur les écritures commutatives.
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.
Le lien de présentation ne fonctionne pas. Quelqu'un at-il une alternative à cette conversation? – Neil
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
Une bonne lecture. Très accessible M. Volkmann est un écrivain doué. – Alex
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)
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. –
@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. –
- 1. Clojure STM Mémoire insuffisante
- 2. fonction de contrôle Haskell STM
- 3. transactions utilisant deuce stm
- 4. Est-ce que les deux modifient et ref-set mettent à jour l'arborescence STM dans Clojure?
- 5. Haskell: thread bloqué indéfiniment dans une transaction STM
- 6. Utiliser clojureql ou STM + écritures asynchrones?
- 7. File d'attente avec Deuce STM
- 8. Test des fonctions STM purement
- 9. Quelle est la différence entre pur et impur dans haskell?
- 10. désactiver la journalisation pour STM Akka (Multiverse)
- 11. STM et les options/bibliothèques basées sur l'acteur sur Android
- 12. Utilisation de transactions STM et base de données ensemble
- 13. Quelle est la différence entre ces deux (Haskell)
- 14. Utilisation du Par monad avec STM et IO déterministe
- 15. Comment implémenter l'équivalent de l'instruction select de Go pour les canaux Haskell STM?
- 16. Les refs sont-ils vraiment cohérents dans une transaction STM?
- 17. Différence entre clojure et clojurescript?
- 18. L'historique des valeurs de STM de Clojure peut-il être consulté?
- 19. Quelle est la différence entre '==' et '==='?
- 20. Quelle est la différence entre "$^N" et "$ +"?
- 21. Quelle est la différence entre dict() et {}?
- 22. Quelle est la différence entre equales et ==
- 23. Quelle est la différence entre ~ et! opérateur?
- 24. Quelle est la différence entre = et: =
- 25. quelle est la différence entre:.! et: r !?
- 26. quelle est la différence entre == et ===?
- 27. quelle est la différence entre * et l'objet
- 28. Quelle est la différence entre == et ===?
- 29. Quelle est la différence entre `{}` et `[]`?
- 30. quelle est la différence entre '! =' Et
vous pouvez également ajouter les frais généraux pour les lectures zéro non transactionnel à cette liste? – mikera
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 –
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