2010-05-26 18 views
17

Se dice que Clojure es un lenguaje que facilita la programación de subprocesos múltiples.Buen ejemplo de concurrencia de Java vs. Clojure

Desde el sitio web Clojure.org:

Clojure simplifica la programación multi-hilo de varias maneras.

Ahora estoy en busca de un problema no trivial resuelto en Java y en Clojure para que pueda comparar/contrastar su simplicidad. ¿Nadie?

+0

Un buen blog sobre cómo explicar las características: https: //perkss.github.io/#/clojure/ConcurrencyClojure # text-body – Matt

Respuesta

13

Sugeriría también mirar thread safe blocking queue de Christophe Grand; es menos de 20 líneas, pero contiene mucha funcionalidad y, en mi opinión, demuestra el uso experto de algunas de las características de simultaneidad, inmutabilidad, átomos y secuencias diferidas de Clojure.

Considere que la alternativa Java java.util.concurrent.LinkedBlockingQueue is 842 lines del código comentado sutil (posiblemente complejo), y usted comienza a entender cómo Clojure realmente cumple con su promesa de simultaneidad; elevando significativamente el nivel de abstracción y entregando una implementación correcta con aproximadamente 10-20 veces menos código.

También notará que al leer el código de Java es muy difícil ver el bosque por los árboles ... Si se le diera, ¿podría estar seguro de su corrección mirándolo? También tenga en cuenta que este código fue escrito por Doug Lea (podría decirse que es el principal experto en Java Concurrency) y es muy legible para Java; Dudo mucho que pueda escribir un código de rendimiento legible como este en Java rápidamente y estar seguro de su corrección.

Contraste esto con la versión Clojure y una vez que esté familiarizado con los fundamentos de Clojure es fácil de entender y entender cómo funciona ... En 20 minutos pude entender cada línea de la implementación, y estar seguro de su exactitud. Y ahora que estoy mucho más familiarizado con las expresiones idiomáticas de Clojure y FP, supongo que esto me llevaría más cerca de 5 minutos. Probablemente también podría escribir código "correcto" como este en Clojure en horas o minutos.

Christophes clojure wrapper de la clase java anterior también es instructivo ya que comparte la misma interfaz funcional que la primera versión.

4

Por favor, busque a Rich Hickey's Ants example - que muestra cómo utilizar las funciones de clojure para construir programas concurrentes

+1

¿Existe también una versión de Java? Estoy buscando ejemplos en ambos idiomas para poder comparar/contrastar. –

+0

Recuerdo que alguien escribió la versión de Java pero no pudo encontrarla en este momento ... –

5

The Wide Finder Project, iniciadas por Tim Bray, tiene un número de entradas de Clojure - el más notable de los cuales es por Alex Osborne; ha hecho a fantastic write-up en él, así como entradas en Java, Scala y una cantidad impresionante de otros idiomas.

El problema que se soluciona es completamente práctico y bastante interesante ya que un desafío de paralelización y las publicaciones de Tim al respecto (véase también la serie más reciente Wide Finder 2) son agradables de leer (y tienen un buen valor educativo). Además, el texto de Alex es excelente, léelo aunque decida omitir el resto. Utiliza algunas características específicas de Clojure (como los átomos) junto con cosas traídas de Java si hace bien el trabajo & rápido ... De hecho, sería interesante solo por la forma en que muestra la excelente interoperabilidad Java de Clojure.

En general, diría que esto es probablemente lo mejor para empezar.

Cuestiones relacionadas