2011-10-01 23 views
25

Ambos lenguajes se basan en JVM con un fuerte soporte para la programación funcional. Soy consciente de que habría una gran clase de problemas en los que los dos idiomas proporcionarían soluciones excelentes. Lo que me gustaría saber es si hay algún tipo de problema en particular en el que las características de Clojure le den una ventaja notable contra Scala y viceversa. Por el momento, hacemos gran parte de nuestro trabajo en Scala, pero me gustaría estar atento a los espacios con problemas específicos donde Clojure puede ofrecer una mejor solución.¿Qué clases de problemas es bueno o malo para Clojure para resolver frente a Scala?

Respuesta

38

Ambos idiomas son extremadamente capaces y adecuados para casi todos los dominios. En particular, no puedes equivocarte con ninguno de los dos idiomas: llegaría a decir que probablemente sean los dos idiomas más prometedores del momento.

todavía creo que hay un par de zonas en las que cada uno tiene ventajas distintivas: fortalezas particulares

de Clojure relativa a Scala:

  • concurrencia - Clojure ha construido el soporte de concurrencia única y muy potente en el lenguaje, en torno a una nueva forma de pensar sobre la identidad del objeto y el estado mutable. Esto se ha explicado muy bien en otros lugares, así que no voy a entrar en detalles aquí, pero este video by Rich Hickey es un gran lugar para obtener algunas ideas.
  • Metaprogramación - Clojure es un lenguaje homoiconic que lo hace especialmente adecuado para la metaprogramación basada en macros, la creación de DSL y la generación de código. Sigue la filosofía de Lisp "código es datos" a este respecto.
  • dinámico escribir - Clojure es un lenguaje dinámico, con todas las ventajas normalmente asociadas con lenguajes dinámicos (menos repetitivo, prototipado rápido, código muy concisa etc.)
  • La programación funcional - aunque se puede hacer en FP Scala, Clojure definitivamente se siente más como un lenguaje funcional (mientras que Scala probablemente se describe mejor como multi-paradigma). Este énfasis funcional en Clojure se manifiesta de varias maneras, por ejemplo, incorpora soporte de evaluación diferida en todas las bibliotecas centrales, todas las estructuras de datos son inmutables, idiomáticas. El "estilo de codificación" de Clojure es funcional en lugar de imperativo/OOP.

puntos fuertes de Scala relativos a Clojure:

  • orientación a objetos - Scala es conceptualmente más cerca de Java y tiene mejor soporte para la programación orientada a objetos enfoques de estilo de Java. Si bien puedes hacer OOP en Clojure, no es tan cómodo.
  • familiaridad sintáctica - Scala sintaxis probablemente será más cómodo para las personas procedentes de otros idiomas no Lisp
  • establecimiento de tipos estáticos - Scala tiene un sistema de tipo estático muy sofisticado. En una situación en la que el tipado estático es ventajoso, Scala tendrá una ventaja clara. Se aplican las ventajas habituales de la tipificación estática: el compilador puede detectar más posibles errores de "tipo", el compilador tiene más oportunidades de realizar optimizaciones de rendimiento, etc.
  • Más maduro - Scala ha sido un poco más largo que Clojure (2003 vs 2007), y como resultado tiene algunos de los beneficios que esperaría de un lenguaje más maduro (mejor soporte de herramientas, comunidad un poco más grande)

Para completar, hay un par de ventajas distintivas que ambos idiomas compartir:

  • comunidades activas e innovadoras - ambos idiomas han construido una comunidad activa con una amplia variedad de colaboradores
  • excelente interoperabilidad con Java - ambos idiomas pueden fácilmente hacer uso de la gran cantidad de librerías y herramientas en el ecosistema de Java
  • ventajas JVM - ambos idiomas se benefician de toda la gran ingeniería en la JVM (compilador JIT, algoritmos de recolección de basura, entorno de ejecución optimizada etc.)
+3

Temía las respuestas que tal pregunta podría haber provocado. ¡Gracias por crear una respuesta tan perfecta! –

11

Prefiero usar Clojure para escribir DSL debido al sistema macro de Clojure. Además, prefiero Clojure para ciertos tipos de sistemas concurrentes. El soporte nativo de Clojure para software transactional memory es bastante diferente al modelo de actor de Scala.

Clojure no tiene un gran soporte para la programación orientada a objetos. Para proyectos en los que el paradigma orientado a objetos funciona bien, o dependerá en gran medida de las bibliotecas/frameworks de Java, prefiero Scala.

+2

Buena respuesta, aunque Scala es mejor para DSL más naturales (menos (entre paréntesis)). –

+6

Tenga en cuenta que [Akka] (http://akka.io/) proporciona similar [soporte STM] (http://akka.io/docs/akka/1.2/scala/stm.html) para Scala/Java. –

+2

@Duncan: tenga en cuenta que las DSL de Clojure no necesitan tener ningún paréntesis aparte de la llamada de macro/función en la que las envuelve. Podrías escribir fácilmente un DSL que hiciera algo como (resolver-ecuación-raíces [x] "0.5x^3 - 6x^2 + 2x -1 = sin x") por ejemplo – mikera

4

Una de las mejores cosas de Clojure y Scala es que se puede usar ambos de ellos en el mismo lugar, con una fricción mínima. Solo sugeriría hacer la mayor parte de la interoperabilidad en Clojure, ya que creo que tiene una ventaja allí.

Simplemente pruebe ambos y vea qué problemas e idiomas encajan. Siempre puede interoperar entre Java, Scala y código Clojure en el mismo sistema con mucha facilidad.

+0

Interopera con qué? – soc

+0

interoperabilidad entre idiomas en la JVM. Es decir. Clojure usando Java, Java usando Scala, Scala usando Clojure, etc. –

+0

Es bastante extraño. A menudo escuché esta afirmación de que Clojure tiene una mejor interoperabilidad, pero desafortunadamente esto nunca fue respaldado por ningún hecho real. – soc

Cuestiones relacionadas