Cuando Java proporciona las capacidades para la programación simultánea, ¿cuáles son las principales ventajas de usar Clojure (en lugar de Java)?Por qué Clojure en lugar de Java para la programación simultánea
Respuesta
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.
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?
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.
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.
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
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).
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.
Creo que tiene que envolver la reducción en (seque (reduce (pmap #(stuff) input)))
–
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 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 . ;-)
Esta presentación de video hace un caso muy fuerte, centrado en estructuras de datos persistentes eficientes implementadas como intentos.
- 1. ¿Qué ventajas tiene Scala sobre Java para la programación simultánea?
- 2. Patrones de diseño para la programación simultánea?
- 3. .NET lenguaje para programación simultánea
- 4. ¿La programación simultánea es igual a la programación en paralelo?
- 5. Semáforos y programación simultánea
- 6. ¿Para qué sirve Clojure?
- 7. ¿Por qué usar constantes en la programación?
- 8. ¿Por qué Java HashMap nativo en Clojure se ejecuta lentamente?
- 9. La programación de Clojure GUI es difícil
- 10. Programación simultánea en el mismo proyecto en PhpStorm/IntelliJ IDEA
- 11. ¿Por qué Java tiene NullPointerException en lugar de NullReferenceException?
- 12. ¿Por qué pasar y error en lugar de error en la programación de Cocoa?
- 13. Haciendo programación dirigida por eventos en Clojure/ClojureScript
- 14. Lista enlazada simultánea sin cerradura en Java
- 15. Programación funcional de la base de datos en Clojure
- 16. Programación Clojure "DSL"
- 17. ¿Por qué Clojure tiene 5 formas de definir una clase en lugar de solo una?
- 18. Escritura simultánea de archivos en Java en Windows
- 19. Clojure ¿por qué usar: solamente []
- 20. ¿Por qué debería usar Reify en lugar de proxy en clojure?
- 21. ¿Por qué elegirías el lenguaje de programación Java sobre otros?
- 22. Por qué usar un marco para servicios RESTful en Java en lugar de servlets de vainilla
- 23. Usar Clojure para probar la unidad Java
- 24. ¿Por qué debería usar 'aplicar' en Clojure?
- 25. ¿Por qué Clojure prefiere preferir devolver nil en lugar de lista vacía como Scheme?
- 26. Frijoles en la programación java
- 27. ¿Por qué no puedo vincular + en clojure?
- 28. ¿Por qué mi formato de cadena falla en Clojure?
- 29. ¿Por qué NDEBUG en lugar de RELEASE?
- 30. ¿Por qué Java ArrayList usa conversión por elemento en lugar de conversión por matriz?
los enlaces parecen estar rotos. Alguien tiene un trabajo? – Surya
@Surya: Aparentemente eliminaron las presentaciones de la conferencia anterior. –
¿Estabas pensando en esta presentación? http://clojure.blip.tv/file/812787/ – egbokul