2009-10-15 7 views

Respuesta

7

Sin ser un experto en Clojure diría que la principal ventaja es que Clojure oculta muchos detalles de la programación concurrente y, como todos sabemos, el diablo está en los detalles, por lo que considero que es algo bueno.

Es posible que desee comprobar this excellent presentation de Rick Hickey (creador de Clojure) en concurrencia en Clojure. EDITAR: Al parecer, JAOO ha eliminado las presentaciones anteriores. Todavía no he podido encontrar una nueva fuente para esto.

+0

los enlaces parecen estar rotos. Alguien tiene un trabajo? – Surya

+0

@Surya: Aparentemente eliminaron las presentaciones de la conferencia anterior. –

+0

¿Estabas pensando en esta presentación? http://clojure.blip.tv/file/812787/ – egbokul

-5

La evolución del lenguaje de programación Java es bastante lenta debido principalmente a la preocupación de Sun sobre la compatibilidad con versiones anteriores.

¿Por qué no quieres simplemente usar directamente lenguajes JVM como Clojure y Scala?

6

Porque el mundo ha avanzado en los últimos 10 años y al lenguaje Java (! = La JVM) le resulta difícil mantener el ritmo. Los lenguajes más modernos para JVM se basan en nuevas ideas y conceptos mejorados, lo que hace que muchas tareas tediosas sean mucho más simples y seguras.

6

Debido Clojure se basa en el paradigma -programación funcional, es decir, que logra seguridad en concurrencia siguiendo algunas reglas simples:

  • estado inmutable
  • funciones no tienen efectos secundarios

Los programas escritos por lo tanto tienen prácticamente escalabilidad horizontal incorporada, mientras que un mecanismo de concurrencia basado en bloqueo (como con Java) es propenso a errores relacionados con condiciones de carrera, interbloqueos, etc.

+0

Lisp no son puramente funcionales, es perfectamente posible tener muchas estructuras de datos mutables y efectos secundarios y estropearlos cuando se va concurriendo. Pero sí, un defensor de programación funcional evitará efectos secundarios como el plauge, haciendo la concurrencia mucho más fácil. – delnan

19

Clojure está diseñado para concurrency.

Clojure proporciona primitivas de concurrencia a un nivel de abstracción más alto que Java. Algunos de estos son:

  • Un sistema de memoria transaccional de software para hacer frente a cambios sincrónicos y coordinados en referencias compartidas. Puede cambiar varias referencias como una operación atómica y no tiene que preocuparse por lo que están haciendo los otros subprocesos en su programa. Dentro de su transacción, siempre tendrá una vista coherente del mundo.

  • Un sistema de agente para el cambio asincrónico. Esto se asemeja al mensaje que pasa en Erlang.

  • Enhebre los cambios locales a las variables. Estas variables tienen un enlace de raíz que comparten todos los hilos de su programa. Sin embargo, cuando vuelva a enlazar una variable, solo será visible en esa cadena.

Todas estas primitivas de concurrencia se construyen en la parte superior de las estructuras de datos inmutable Clojures (es decir, listas, mapas, vectores, etc). Cuando ingresa al mundo de los objetos Java mutables, todas las primitivas se descomponen y vuelve a los bloqueos y variables de condición (que también se pueden usar en clojure, cuando sea necesario).

5

Una de las cosas interesantes de tener tipos inmutables es que la mayoría de las funciones integradas ya tienen varios subprocesos. Una simple 'reducción' abarcará múltiples núcleos/procesadores, sin ningún trabajo adicional de su parte.

Por lo tanto, seguro que puede ser multiproceso con Java, pero implica bloqueos y otras cosas. Clojure tiene múltiples subprocesos sin ningún esfuerzo adicional.

+0

Creo que tiene que envolver la reducción en (seque (reduce (pmap #(stuff) input)))

2

Sí, Java proporciona todas las capacidades necesarias para programas concurrentes.

Una analogía: C proporciona todas las capacidades necesarias para los programas de memoria segura, incluso con una gran cantidad de manejo de cadenas. Pero en C la seguridad es el problema del programador.

Como sucede, analizar la concurrencia es bastante difícil. Es mejor utilizar mecanismos intrínsecamente seguros en lugar de tratar de anticipar todos los posibles riesgos de concurrencia.

Si intenta hacer seguro un programa concurrente de datos compartidos mutable-data-structure añadiendo enclavamientos, está caminando sobre una cuerda floja. Además, es en gran medida no comprobable.

Un buen compromiso podría ser escribir código Java simultáneo utilizando el estilo funcional de Clojure.

2

Además de la aproximación de Clojure a la concurrencia a través de datos inmutables, vars, refs (y memoria transaccional de software), átomos y agentes ... es un Lisp, que vale la pena aprender. Obtiene macros Lisp, desestructuración, funciones y cierres de primera clase, REPL y tipado dinámico, además de literales para listas, vectores, mapas y conjuntos, todo ello además de la interoperabilidad con bibliotecas Java (y también se está desarrollando una versión CLR.)

no es exactamente el mismo que el esquema o Common Lisp, pero el aprendizaje que le ayudará si alguna vez quiere trabajar a través de la Structure and Interpretation of Computer Programs o asimilar lo que Paul Graham está hablando en su essays, y se puede relacionar con this comic de xkcd . ;-)

1

Esta presentación de video hace un caso muy fuerte, centrado en estructuras de datos persistentes eficientes implementadas como intentos.

Cuestiones relacionadas