Scala vs. Groovy vs. Clojure [cerrado]

676

¿Alguien puede explicar las principales diferencias entre Scala, Groovy y Clojure? Sé que cada una de estas compilaciones se ejecuta en la JVM, pero me gustaría una comparación simple entre ellas.

James Fassett
fuente

Respuestas:

873

Groovy es un lenguaje de tipo dinámico, cuya sintaxis está muy cerca de Java, con una serie de mejoras de sintaxis que permiten un código más ligero y menos repetitivo. Puede ejecutarse a través de un intérprete, además de ser compilado, lo que lo hace bueno para la creación rápida de prototipos, scripts y el aprendizaje de lenguajes dinámicos sin tener que aprender una nueva sintaxis (suponiendo que conozca Java). A partir de Groovy 2.0, también tiene un soporte creciente para la compilación estática . Groovy admite cierres y admite la programación en un estilo algo funcional, aunque todavía está bastante lejos de la definición tradicional de programación funcional.

Clojure es un dialecto de Lisp con algunas características avanzadas como la memoria transaccional de software . Si te gusta Lisp y te gustaría usar algo similar en JVM, Clojure es para ti. Es posiblemente el lenguaje más funcional que se ejecuta en la JVM, y ciertamente el más famoso. Además, tiene un mayor énfasis en la inmutabilidad que otros dialectos de Lisp, lo que lo acerca al corazón de los entusiastas del lenguaje funcional.

Scala es un lenguaje totalmente orientado a objetos, más que Java, con uno de los sistemas de tipos más avanzados disponibles en lenguajes que no son de investigación, y ciertamente el sistema de tipos más avanzado en la JVM. También combina muchos conceptos y características de lenguajes funcionales, sin comprometer la orientación del objeto, pero su compromiso con las características del lenguaje funcional desanimó a algunos entusiastas de este último.

Groovy tiene una buena aceptación y un marco web popular en Grails. También alimenta el sistema de construcción Gradle, que se está convirtiendo en una alternativa popular a Maven. Personalmente, creo que es un lenguaje con una utilidad limitada, particularmente cuando Jython y JRuby comienzan a incursionar en la tierra JVM, en comparación con los demás.

Clojure, incluso descontando algunas características muy interesantes, tiene un gran atractivo simplemente por ser un dialecto de Lisp en JVM. Puede limitar su popularidad, por supuesto, pero espero que tenga una comunidad leal a su alrededor durante mucho tiempo.

Scala puede competir directamente con Java y darle una oportunidad por su dinero en casi todos los aspectos. Por el momento, no puede competir en popularidad, por supuesto, y la falta de un fuerte respaldo corporativo puede dificultar su aceptación en los entornos corporativos. También es un lenguaje mucho más dinámico que Java, en el sentido de cómo evoluciona el lenguaje. Desde la perspectiva del lenguaje, eso es algo bueno. Desde la perspectiva de los usuarios que planean tener miles de líneas de código escritas, no es así.

Como revelación final, estoy muy familiarizado con Scala y solo conozco a los otros dos.

Daniel C. Sobral
fuente
1
Buena esa. Aunque debo decir que Scala tiene el respaldo corporativo de Lightbend y es utilizado por grandes nombres como LinkedIn, Twitter, Spark y muchos bancos. Donde trabajo tenemos una base de código de 11 millones de líneas de Scala, lo cual no es una buena idea pero funciona.
Joan
219

Scala

Scala evolucionó a partir de un lenguaje funcional puro conocido como Funnel y representa una implementación de sala limpia de casi toda la sintaxis de Java, que difiere solo donde se puede hacer una mejora clara o donde se compromete la naturaleza funcional del lenguaje. Dichas diferencias incluyen objetos singleton en lugar de métodos estáticos, y la inferencia de tipos.

Gran parte de esto se basó en el trabajo previo de Martin Odersky con el lenguaje Pizza . La integración OO / FP va mucho más allá de los simples cierres y ha llevado al lenguaje a ser descrito como post-funcional.

A pesar de esto, es el más cercano a Java en muchos sentidos. Principalmente debido a una combinación de soporte OO y tipeo estático, pero también debido a un objetivo explícito en el diseño del lenguaje que debería integrarse muy estrechamente con Java.

Maravilloso

Groovy aborda explícitamente dos de las mayores críticas de Java al

  • ser tipado dinámicamente, lo que elimina muchas repeticiones y
  • agregando cierres al lenguaje.

Quizás sea sintácticamente más cercano a Java, no ofrece algunas de las construcciones funcionales más ricas que proporcionan Clojure y Scala, pero aún ofrece una mejora evolutiva definitiva, especialmente para escribir programas de script-syle.

Groovy tiene el respaldo comercial más sólido de los tres idiomas, principalmente a través de springsource.

Clojure

Clojure es un lenguaje funcional en la familia LISP, también se escribe dinámicamente.

Las características como el soporte STM le brindan el mejor soporte de concurrencia listo para usar , mientras que Scala requiere una biblioteca de terceros como Akka para duplicar esto.

Sintácticamente, también es el más alejado de los tres idiomas del código Java típico.

También tengo que revelar que estoy más familiarizado con Scala :)

Kevin Wright
fuente
11
Nunca antes había oído hablar de este lenguaje de embudo. Gracias por llenar un pequeño vacío en el registro histórico.
Randall Schulz
8
Realmente no se puede llamar a Clojure un lenguaje funcional puro . Es ciertamente posible escribir código imperativo.
dbyrne 05 de
2
Scala ha incorporado la biblioteca Akka para la concurrencia basada en actores. Ya no es una dependencia de terceros.
Scott m Gardner
2
@Orubel En bytecode, una clase scala es idéntica a la clase Java equivalente - tipos y todo. Como ejemplo, toda la API de Akka Java está escrita en Scala. Así que por favor explique qué quiere decir con "no se puede integrar" aquí, porque me parece FUD.
Kevin Wright
3
Para resumir ese documento: "Las características de Scala que no existen en Java no se pueden usar directamente en Java". Sin embargo ... ¡los miembros de tipo abstracto y los tipos de tipo superior son características bastante avanzadas que ciertamente no está obligado a usar! Java tampoco puede usar métodos sin parámetros, constructores o módulos de extensión de Groovy, lo que hace que Groovy "no esté estrechamente integrado" por su propia definición.
Kevin Wright
68

Nunca tuve tiempo de jugar con clojure. Pero para scala vs groovy, estas son palabras de James Strachan - Creador maravilloso

"Aunque mi consejo para el reemplazo a largo plazo de javac es Scala. ¡Estoy muy impresionado con eso! Puedo decir honestamente que si alguien me hubiera mostrado el libro de Programación en Scala de Martin Odersky, Lex Spoon y Bill Venners en 2003 I probablemente nunca habría creado Groovy ".

Puedes leer la historia completa aquí

Thai Tran
fuente
72
Cabe mencionar que esta declaración no dice que Scala sea mejor que Groovy. James también es conocido por decir que si hubiera sabido cuántos problemas es crear un lenguaje, nunca lo habría creado. Visto en este contexto, está claro por qué no habría desarrollado Groovy, por supuesto. Y me atrevo a decir que dio muchas buenas ideas, pero no es el creador de Groovy actual. dejó el proyecto mucho antes del 1.0 en 2007 y no ha participado desde entonces. Hay al menos tanto sin él en el proyecto como lo había con él.
blackdrag
31
Y dado que James Strachan está trabajando activamente en el idioma Kotlin, Scala aparentemente no es lo suficientemente impresionante para él.
bdkosher
66
@bdkosher está trabajando en ello porque Scala es demasiado impresionante para la mayoría de los programadores ... y [lo más importante,] en algunos lugares demasiado complicado también
Nombre para mostrar
30

Se pueden diferenciar de dónde provienen o a qué desarrolladores se dirigen principalmente.

Groovy es un poco como la versión de Java de secuencias de comandos. Los programadores Java desde hace mucho tiempo se sienten como en casa al crear aplicaciones ágiles respaldadas por grandes arquitecturas. Groovy on Grails es, como su nombre indica, similar al marco de Rails. Para las personas que no quieren molestarse con la verbosidad de Java todo el tiempo.

Scala es un lenguaje de programación funcional y orientado a objetos y los programadores de Ruby o Python pueden sentirse más cerca de este. Emplea muchas buenas ideas comunes que se encuentran en estos lenguajes de programación.

Clojure es un dialecto del lenguaje de programación Lisp para que los desarrolladores de Lisp, Scheme o Haskell se sientan como en casa mientras desarrollan con este lenguaje.

Mehmet Duran
fuente
24
Scala no es realmente un lenguaje de programación funcional. Es un lenguaje de programación orientado a objetos primero, con características funcionales.
Daniel C. Sobral
16
Tengo que decir que esta respuesta se parece mucho a un tiro en la oscuridad. Creo que se podría argumentar que Python está más cerca de Groovy que de Scala, y Ruby (en mi opinión) no está demasiado cerca de ninguno de los anteriores, quizás más cerca de Groovy. Haskell no se parece demasiado a Lisp (esquema) o esquema (común) y, por lo tanto, no se parece mucho a Clojure. Para mí, esta respuesta se siente (en el mejor de los casos) como "No sé tampoco, déjame Wikipedia para ti".
John Y
21
Scala es un lenguaje imperativo con algunas características funcionales. Si las personas continúan llamando funcional a un lenguaje tan pronto como adopte modismos del mundo funcional, entonces el término se convertirá en otro término de marketing. También podría comenzar a llamar a C ++ funcional y al imperativo de Haskell.
jon-hanson
99
@alanlcode Odersky puede decir lo que quiere. Scala no tiene ningún sistema para aislar los efectos secundarios, no es perezoso de manera predeterminada y no trata el código como datos: trata las llamadas a funciones como datos, lo cual es diferente. Estos son grandes problemas si quieres ser completamente funcional. Por otro lado, Scala hace todo lo posible para garantizar que su Modelo de Objetos no tenga fallas. Me encanta Scala, pero es claramente funcional en segundo lugar.
Daniel C. Sobral
77
Por otro lado, la familia de lenguajes ML es reconocida como funcional pero es estricta y permite efectos secundarios / código imperativo.
GClaramunt
8

Estoy leyendo el libro Pragmatic Programmers "Groovy Recipes: Greasing the wheels of Java" de Scott Davis, Copyright 2008 e impreso en abril del mismo año.

Está un poco desactualizado, pero el libro deja en claro que Groovy es literalmente una extensión de Java. Puedo escribir código Java que funcione exactamente como Java y cambiar el nombre del archivo * .groovy y funciona bien. Según el libro, lo contrario es cierto si incluyo las bibliotecas necesarias. Hasta ahora, la experimentación parece confirmar esto.

Jim Collings
fuente
Ese es el mejor libro para aprender Groovy.
topr
Probablemente sea importante tener en cuenta que no todo el código se comportará exactamente igual. Algunas de estas diferencias incluyen la forma en que Groovy entiende las comillas simples y dobles y su preferencia por el boxeo sobre el ensanchamiento. Sin embargo, la mayoría del código funcionará igual.
Ontonator
4

Obviamente, la sintaxis es completamente diferente (Groovy es la más cercana a Java), pero supongo que eso no es lo que está pidiendo.

Si está interesado en usarlos para ejecutar una aplicación Java, Scala probablemente no sea una buena opción, ya que no hay una manera fácil de evaluarlo desde Java, mientras que Groovy es especialmente adecuado para ese propósito.

Thilo
fuente
No entiendo su punto sobre el uso de Scala para script Java. Ciertamente puede escribir una secuencia de comandos Scala que maneje código Java; No se evalrequiere.
Daniel Yankowsky
2
@Daniel, vea la pregunta sobre el uso de Scala para las secuencias de comandos que he vinculado. La respuesta aceptada allí es que la falta de una instalación "eval" y el soporte de javax.scripting hace que sea más difícil usar Scala para script una aplicación Java que, digamos, Groovy.
Thilo