2010-12-30 13 views
31

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

25

Clojure STM tiene 3 grandes características únicas:

  1. implementa MVCC instantánea evitando las transacciones se reinicia en la invalidación de lectura.
  2. Asegura las referencias en las escrituras de lectura proporciona un tipo de control manual sobre la orden de adquisición de recursos.
  3. Tiene conmutación explícita que reduce los intentos en escrituras conmutativas.
+3

puede también añadir ninguna perdida por no transaccional lee a esta lista? – mikera

+0

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 –

+1

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

12

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.

+0

El enlace de presentación no funciona. Alguien tiene una alternativa a esta charla? – Neil

+1

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

+1

Una lectura tan buena. Muy accesible. El Sr. Volkmann es un escritor dotado. – Alex

16

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)

+8

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. –

+0

@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. –

Cuestiones relacionadas