java clojure concurrent-programming

Por qué Clojure en lugar de Java para la programación simultánea



concurrent-programming (9)

La evolución del lenguaje de programación Java es bastante lenta, principalmente debido 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?

Cuando Java proporciona las capacidades para la programación concurrente, ¿cuáles son las principales ventajas de usar Clojure (en lugar de Java)?


Porque Clojure se basa en el paradigma de programación funcional , lo que quiere decir que logra seguridad en concurrencia siguiendo unas simples reglas:

  • estado inmutable
  • las funciones no tienen efectos secundarios

Por lo tanto, los programas escritos tienen una escalabilidad horizontal integrada, mientras que un mecanismo de concurrencia basado en bloqueo (como en Java) es propenso a errores que involucran condiciones de carrera, interbloqueos, etc.


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.


Clojure está diseñado para concurrencia .

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.

  • Enhebrar 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 sobre las estructuras de datos inmutables de 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).


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.


Además del enfoque 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 las bibliotecas Java (y también está desarrollándose una versión CLR. )

No es exactamente lo mismo que Scheme o Common Lisp, pero aprenderlo te ayudará si alguna vez quieres trabajar a través de la Estructura e Interpretación de Programas de Computación o entender de qué está hablando Paul Graham en sus ensayos , y puedes relacionarte con este cómic de XKCD. ;-)


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


Una de las cosas interesantes de tener tipos inmutables es que la mayoría de las funciones integradas ya tienen múltiples 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 tener múltiples subprocesos con Java, pero implica bloqueos y otras cosas. Clojure tiene múltiples subprocesos sin ningún esfuerzo adicional.


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 esta excelente presentación de Rick Hickey (creador de Clojure) sobre concurrencia en Clojure. EDITAR: Al parecer, JAOO ha eliminado las presentaciones anteriores. Todavía no he podido encontrar una nueva fuente para esto.