Sto cercando di trovare le differenze tra ciò che Clojure chiama un STM e ciò che è implementato in Haskell come STM. Prendendo le differenze semantiche del linguaggio reale a parte sono un po 'confuso come Rich Hickey dice nel suo discorso che l'implementazione di Clojure di STM è molto diversa da qualsiasi altra cosa là fuori, ma non capisco le differenze a parte la scelta della lingua.In che modo Clojure STM differisce da Haskell STM?
risposta
Clojure STM ha 3 grandi caratteristiche uniche:
- implementa MVCC istantanea evitando operazioni di riavviamento in lettura invalidazione.
- Assicura i riferimenti sulle scritture in lettura fornisce una sorta di controllo manuale sull'ordine di acquisizione delle risorse.
- Ha un pendolarismo esplicito che riduce i tentativi di scrittura commutativa.
Mark Volkmann ha fatto una presentazione molto dettagliata su STM in generale (e STM di Clojure in particolare) a Strano Anello 2009, che si possono trovare here (articolo e diapositive here). Non conosco alcuna altra risorsa (oltre al codice) per capire come funziona lo STM di Clojure.
Il collegamento di presentazione non funziona. Qualcuno ha un'alternativa a questo discorso? – Neil
Le diapositive della presentazione e un articolo dettagliato sull'argomento sono disponibili qui http://java.ociweb.com/mark/stm/article.html – lorefnon
Una lettura così buona. Molto accessibile. Il signor Volkmann è uno scrittore di talento. – Alex
Per Haskell STM, vedere le carte di SPJ: http://research.microsoft.com/en-us/um/people/simonpj/papers/stm/
Di particolare utilità sono "operazioni di memoria Composable" e "memoria transazionale con invarianti di dati". L'implementazione di STM di GHC in effetti non è MVCC. Non ricordo tutti i dettagli di implementazione, ma la mia comprensione è che la descrizione sui giornali non è molto diversa da quella attualmente esistente in GHC.
(si noti che MVCC, in clojure o altrove, rende possibile write-skew - vedere, per esempio, qui: http://en.wikipedia.org/wiki/Snapshot_isolation)
È inoltre degno di nota il fatto che l'implementazione di GHC fornisce garanzie in fase di compilazione della sicurezza di una transazione rispetto agli effetti collaterali; e l'unico combinatore 'orElse' per le transazioni di composizione atomica. –
@DonStewart Inoltre Haskell 'STM' è un' MonadPlus', che consente di specificare ulteriori condizioni di errore nel contesto della transazione. Ad esempio, se il saldo finale del conto è negativo, fallire/riprovare il txn. Permette anche di condividere questa logica con altre classi 'MonadPlus' facilmente; la stessa funzione mostrerebbe il risultato di tutte le * potenziali * transazioni valide date un 'Elenco' di conti e acquisti. Questo può essere utile se la logica è complessa. Non penso sia possibile nemmeno nel clojure. –
potreste anche aggiungere a zero overhead per non transazionale legge a questa lista? – mikera
È vero, quando si utilizza il contesto non transazionale, ma se si considera STM e si ripete su altre transazioni, non sono sicuro che il sistema di fasce subisca delle prestazioni causate dal contesto di swap. Ma JVM è molto maturo e STM è come un GC ... molto necessario, quindi dovresti pensare in questo modo: –
Ciao William. leggendo l'articolo e la presentazione di Mark Volkmann, ha detto "le letture attivano solo un nuovo tentativo in Clojure quando l'elenco cronologico di un Refdoes non contiene un valore impegnato prima dell'inizio del txn". La prima caratteristica sopra descritta è corretta? – CHAPa