¿Cuáles son las diferencias clave entre Scala y Groovy? [cerrado]

128

En la superficie, Groovy y Scala se parecen bastante, aparte de que Scala está tipada estáticamente, y Groovy es dinámica.

  • ¿Cuáles son las otras diferencias clave y las ventajas que cada una tiene sobre la otra?
  • ¿Qué tan similares son realmente?
  • ¿Hay competencia entre los dos?
    • Si es así, ¿quién crees que ganará a largo plazo?
Leif
fuente
Groovy 2.0 también incluye escritura estática: infoq.com/articles/new-groovy-20
HDave

Respuestas:

230

Ambos son lenguajes orientados a objetos para la JVM que tienen lambdas y cierres e interoperan con Java. Aparte de eso, son extremadamente diferentes.

Groovy es un lenguaje "dinámico" no solo en el sentido de que se tipea dinámicamente sino que admite la metaprogramación dinámica.

Scala es un lenguaje "estático" en el sentido de que está tipado estáticamente y prácticamente no tiene metaprogramación dinámica más allá de las cosas incómodas que puedes hacer en Java. Tenga en cuenta que el sistema de tipo estático de Scala es sustancialmente más uniforme y sofisticado que el de Java.

Groovy está influenciado sintácticamente por Java pero semánticamente influenciado más por lenguajes como Ruby.

Scala está influenciada sintácticamente por Ruby y Java. Está influenciado semánticamente más por Java, SML, Haskell y un lenguaje OO muy oscuro llamado gBeta.

Groovy tiene un envío múltiple "accidental" debido a la forma en que maneja la sobrecarga de Java.

Scala es solo un despacho único, pero tiene una coincidencia de patrones inspirada en SML para tratar algunos de los mismos tipos de problemas que el despacho múltiple debe manejar. Sin embargo, cuando el despacho múltiple solo puede despacharse en tipo de tiempo de ejecución, la coincidencia de patrones de Scala puede despachar en tipos de tiempo de ejecución, valores o ambos. La coincidencia de patrones también incluye una unión variable sintácticamente agradable. Es difícil exagerar lo agradable que es esta característica por sí sola que hace que la programación en Scala.

Tanto Scala como Groovy admiten una forma de herencia múltiple con mixins (aunque Scala los llama rasgos).

Scala admite la aplicación de funciones parciales y el currículum a nivel de lenguaje, Groovy tiene un método incómodo de "curry" para realizar aplicaciones de funciones parciales.

Scala realiza la optimización de recursión de cola directa. No creo que Groovy lo haga. Eso es importante en la programación funcional pero menos importante en la programación imperativa.

Tanto Scala como Groovy son evaluados ansiosamente por defecto. Sin embargo, Scala admite parámetros de llamada por nombre. Groovy no: la llamada por nombre debe emularse con cierres.

Scala tiene "para las comprensiones", una generalización de las comprensiones de listas que se encuentran en otros idiomas (técnicamente son comprensiones de mónada más un poco, en algún lugar entre Haskell's do y C # 's LINQ).

Scala no tiene ningún concepto de campos "estáticos", clases internas, métodos, etc., utiliza objetos singleton en su lugar. Groovy usa el concepto estático.

Scala no ha incorporado una selección de operadores aritméticos de la misma manera que Groovy. En Scala puede nombrar métodos de manera muy flexible.

Groovy tiene el operador de elvis para tratar con nulo. Los programadores de Scala prefieren usar los tipos de Opción a usar nulo, pero es fácil escribir un operador de elvis en Scala si lo desea.

Finalmente, hay mentiras, hay malditas mentiras, y luego hay puntos de referencia. El juego de puntos de referencia del lenguaje informático clasifica a Scala entre sustancialmente más rápido que Groovy (que varía de dos a 93 veces más rápido) mientras conserva aproximadamente el mismo tamaño de fuente. puntos de referencia .

Estoy seguro de que hay muchas, muchas diferencias que no he cubierto. Pero espero que esto te dé una idea general.

¿Hay una competencia entre ellos? Sí, por supuesto, pero no tanto como podrías pensar. La verdadera competencia de Groovy es JRuby y Jython.

¿Quién va a ganar? Mi bola de cristal está tan rota como la de cualquier otra persona.

James Iry
fuente
21
que sería una victoria para ambos si se puede conseguir que las universidades comienzan la enseñanza de estas lenguas en lugar de simplemente java =)
Chii
13
¿No es la inmutabilidad una característica clave de Scala? ¿Qué pasa con la concurrencia y los actores? Cuéntanos un poco más ...
Leonel
44
Si hay alguna competencia, sería con Clojure, pero Clojure no está interesado en la competencia.
Rayne
2
Dado que Scala utiliza el mismo método de envío estático tipado que java (que punto de acceso puede alinearse fácilmente) y Groovy hace envíos dinámicos de métodos, será realmente difícil para Groovy acercarse al rendimiento de Scala. Particularmente con @specialized para optimizar el autoboxing de Java, Scala puede ser más rápido que Java a veces. Sin embargo, el caso de uso de Groovy es similar al uso de Ruby / Python: es un lenguaje de secuencias de comandos de tipo dinámico fácil de usar donde el rendimiento generalmente no es un gran problema. por ejemplo, muchos marcos Groovy contienen una tonelada de código Java para el rendimiento (como Grails)
James Strachan
44
Como esta respuesta tiene tantos votos, hay una parte que me gustaría corregir. Es cierto que los métodos múltiples basados ​​en la herencia en Groovy comenzaron como un accidente, pero en una Conferencia de Desarrolladores de Groovy, que incluyó a James y eso fue mucho antes de Groovy 1.0, decidimos mantener eso. No hubiera sido difícil cambiar esto. También para agregar a lo que James escribió ... invocados dinámicos derribaron esa barrera de la que está hablando
blackdrag
12

Scala está destinado a ser un lenguaje híbrido oo / funcional y está muy bien planeado y diseñado. Groovy es más como un conjunto de mejoras que a muchas personas les encantaría usar en Java. eché un vistazo más de cerca a ambos, así que puedo decir :)

ninguno de ellos es mejor o peor que el otro. Groovy es muy bueno en meta-programación, Scala es muy bueno en todo lo que no necesita meta-programación, así que ... tiendo a usar ambos.

hamsterofdeath
fuente
11

Scala tiene actores, que hacen que la concurrencia sea mucho más fácil de implementar. Y los rasgos que dan una herencia múltiple verdadera y segura.

jasonnerothin
fuente
9
Para referencia futura, Groovy también lo hace a través de GPars o Akka.
Xorlev
44
Para referencia futura, Groovy también lo hace a través de rasgos
vicsz
7

Has dado en el clavo con la escritura estática y dinámica. Ambos son parte de la nueva generación de lenguajes dinámicos, con cierres, expresiones lambda, etc. También hay un puñado de diferencias sintácticas entre los dos, pero funcionalmente, no veo una gran diferencia entre Groovy y Scala.

Scala implementa Listas un poco diferente; en Groovy, casi todo es una instancia de java.util.List, mientras que Scala usa tanto Listas como matrices primitivas. Groovy tiene (creo) una mejor interpolación de cadenas.

Parece que Scala es más rápido, pero la gente de Groovy realmente está impulsando el rendimiento para la versión 2.0. 1.6 dio un salto enorme en velocidad sobre la serie 1.5.

No creo que ninguno de los dos idiomas realmente 'gane', ya que apuntan a dos clases diferentes de problemas. Scala es un lenguaje de alto rendimiento que es muy similar a Java sin tener el mismo nivel de repetitivo que Java. Groovy es para la creación rápida de prototipos y desarrollo, donde la velocidad es menos importante que el tiempo que les lleva a los programadores implementar el código.

Don Werve
fuente
3
"Groovy es para la creación rápida de prototipos y desarrollo", esto sugiere que Groovy no es adecuado para el uso de producción con el que no estoy de acuerdo. Hay muchos sitios de Grails en uso de producción, por ejemplo
Dónal
10
Scala no es un lenguaje dinámico.
John Oxley
2
"Groovy tiene (creo) una mejor interpolación de cuerdas". - con Scala-2.10.0 esto ya no es cierto (Scala obtuvo una interpolación de cadenas genial).
VasiliNovikov
5

Scala tiene una curva de aprendizaje mucho más pronunciada que Groovy. Scala tiene mucho más soporte para la programación funcional con su coincidencia de patrones y recursión basada en la cola, lo que significa más herramientas para FP puro.

Más de cinco
fuente
0

Scala también tiene compilación dynamica y lo he hecho usando twitter eval lib ( https://github.com/twitter/util ). Mantuve el código scala en un archivo plano (sin ninguna extensión) y usando eval creó la clase scala en tiempo de ejecución. Yo diría que scala es meta programación y tiene la característica de complicación dinámica

Veerbhan Tahlani
fuente