Estoy tratando de encontrar las diferencias entre lo que Clojure llama un STM y lo que se implementa en Haskell como STM. Teniendo en cuenta las diferencias semánticas del lenguaje real, estoy un poco confundido ya que Rich Hickey dice en su discurso que la implementación de CMOURE de STM es muy diferente a cualquier otra cosa, pero no entiendo las diferencias aparte de la elección del idioma.¿En qué se diferencia Clojure STM de Haskell STM?
Respuesta
Clojure STM tiene 3 grandes características únicas:
- implementa MVCC instantánea evitando las transacciones se reinicia en la invalidación de lectura.
- Asegura las referencias en las escrituras de lectura proporciona un tipo de control manual sobre la orden de adquisición de recursos.
- Tiene conmutación explícita que reduce los intentos en escrituras conmutativas.
Marcos Volkmann hizo una presentación muy detallada sobre los STM en general (y los STM Clojure en particular) en el lazo extraño 2009, que se puede encontrar here (artículo y se desliza here). Realmente no conozco ningún otro recurso (que no sea el código) para entender cómo funciona el STM de Clojure.
El enlace de presentación no funciona. Alguien tiene una alternativa a esta charla? – Neil
Las diapositivas de la presentación y un artículo detallado sobre el tema están disponibles aquí http://java.ociweb.com/mark/stm/article.html – lorefnon
Una lectura tan buena. Muy accesible. El Sr. Volkmann es un escritor dotado. – Alex
Para Haskell STM, ver los papeles de SPJ: http://research.microsoft.com/en-us/um/people/simonpj/papers/stm/
De uso particular son "operaciones de memoria Composable" y "memoria transaccional con invariantes de datos". La implementación de STM de GHC de hecho no es MVCC. No recuerdo todos los detalles de la implementación, pero tengo entendido que la descripción en los documentos no es tan diferente de la que existe actualmente en GHC.
(MVCC en cuenta que, en clojure o en otro lugar, hace posible amortización de inclinación - véase, por ejemplo, aquí: http://en.wikipedia.org/wiki/Snapshot_isolation)
También cabe destacar que la implementación de GHC proporciona garantías en tiempo de compilación de la seguridad de una transacción con respecto a los efectos secundarios; y el único combinador 'orElse' para las transacciones de composición atómica. –
@DonStewart Además, Haskell 'STM' es un' MonadPlus', que le permite especificar condiciones de falla adicionales dentro del contexto de la transacción. es decir, si el saldo final de la cuenta es negativo, reprobar/reintentar el txn. También le permite compartir esa lógica con otras clases 'MonadPlus' fácilmente; la misma función mostraría el resultado de todas las transacciones válidas * posibles * a partir de una "Lista" de cuentas y compras. Esto puede ser útil si la lógica es compleja. No creo que ninguno sea posible en Clojure. –
- 1. ¿Qué algoritmos se utilizan en Clojure, Haskell (y otros idiomas) para STM?
- 2. Clojure STM (dosync) x bloque de sincronización de Java
- 3. STM problema de mónada
- 4. Haskell: hilo bloqueado indefinidamente en una transacción STM
- 5. función de comprobación de Haskell STM devolviendo undefined
- 6. ¿Experiencias con Clojure STM para grandes conjuntos de datos?
- 7. ¿Se puede acceder a la historia de valores de STM de Can Clojure?
- 8. ¿Se podría hacer que el modelo STM de Clojure funcione con varias JVM?
- 9. Posibles mejoras en el ejemplo de concurrencia "oficial" de clojure (usando bloqueos, átomos, stm)
- 10. Biblioteca hash STM para C (glib?)
- 11. Utilizando STM y transacciones de base de datos juntas
- 12. ¿Cómo puedo ver la cantidad de retrocesos en mi STM en Clojure?
- 13. scala/akka/stm design for large shared state?
- 14. Uso de agentes para completar efectos secundarios en transacciones de STM
- 15. Haskell to Clojure
- 16. Diferencia entre TVAR y TMVar
- 17. Comprender el ejemplo de simultaneidad de Clojure
- 18. Haskell enumera la diferencia
- 19. ¿Alguna experiencia real usando la memoria transaccional de software?
- 20. ¿Qué significa apóstrofo en Haskell?
- 21. Diferencia en Clojure entre uso y requiere
- 22. Diferencia entre definición y defprotocol en Clojure
- 23. Diferencia entre dosisq y para en Clojure
- 24. ¿En qué se diferencia engine.io de socket.io?
- 25. ¿En qué se diferencia MegaStore de BigTable?
- 26. ¿Qué significa ': ..' en Haskell?
- 27. ¿Qué significa `~` en Haskell?
- 28. Diferencia entre `mod` y` rem` en Haskell
- 29. ¿Por qué debería usar 'aplicar' en Clojure?
- 30. ¿Qué hace "^: static" en Clojure?
puede también añadir ninguna perdida por no transaccional lee a esta lista? – mikera
Es cierto, cuando utiliza contexto no transaccional, pero si tiene en cuenta STM y reintentos en otras transacciones, no estoy seguro de si el sistema de agujeros sufre el rendimiento causado por el cambio de contexto. Pero JVM es muy maduro y STM es como un GC ... muy necesario, entonces deberías pensar de esa manera –
Hola William. leyendo el artículo y la presentación de Mark Volkmann, dijo que "las lecturas solo desencadenan un reintento en Clojure cuando la lista de historial de una Ref. no contiene un valor cometido antes de que comenzara el txn". La primera característica descrita arriba es correcta? – CHAPa