2009-04-02 17 views
116

En la superficie, Groovy y Scala se ven bastante similares, aparte de que Scala está tipado estáticamente y Groovy dynamic.¿Cuáles son las diferencias clave entre Scala y Groovy?

  • ¿Cuáles son las otras diferencias clave y ventajas que cada uno tiene sobre el otro?
  • ¿Qué tan similares son realmente?
  • ¿Hay competencia entre los dos?
    • Si es así, ¿quién crees que va a ganar a largo plazo?
+0

Groovy 2.0 también incluye tipos estáticos: http://www.infoq.com/articles/new-groovy-20 – HDave

Respuesta

208

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 está tipeado dinámicamente sino que es compatible con 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 meta-programación dinámica más allá de las cosas torpes que puede 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á influido sintácticamente por Java pero influenciado semánticamente más por idiomas como Ruby.

Scala está influenciado sintácticamente tanto por Ruby como por Java. Semánticamente está influenciado por Java, SML, Haskell y un lenguaje OO muy oscuro llamado gBeta.

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

Scala es 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 envío múltiple solo puede enviarse en el tipo de tiempo de ejecución, la coincidencia de patrones de Scala puede enviarse en tipos de tiempo de ejecución, valores o ambos. La coincidencia de patrones también incluye un enlace variable sintácticamente agradable. Es difícil sobreestresar lo agradable que es esta característica única 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 currying en el nivel de idioma, Groovy tiene un método incomodo de "curry" para realizar una aplicación de función parcial.

Scala hace la optimización de recursividad 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 con entusiasmo por defecto. Sin embargo, Scala admite parámetros de llamada por nombre. Groovy no lo hace: la llamada por nombre debe emularse con cierres.

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

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

Scala no tiene una selección integrada de operadores aritméticos de la forma en que lo hace Groovy. En Scala puedes nombrar los métodos de manera muy flexible.

Groovy tiene el operador elvis para tratar con nulo. Los programadores de Scala prefieren usar los tipos de Opción para usar null, pero es fácil escribir un operador 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 de la computadora clasifica a Scala entre sustancialmente más rápido que Groovy (variando de dos a 93 veces más rápido) mientras conserva aproximadamente el mismo tamaño de fuente. benchmarks.

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

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

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

+0

"¿Existe una competencia entre ellos? Sí, por supuesto, pero no tanto como se podría pensar. La verdadera competencia de Groovy es JRuby". ¡No te olvides de Jython! – Jeff

+0

¡Oh, claro, Jython! Añadiré eso a mi respuesta. Gracias –

+0

Vale la pena señalar que el despacho múltiple de Clojure puede enviar tanto en valores como en tipos. Estrictamente hablando, creo que es tan poderoso como la coincidencia de patrones de Scala, aunque Scala obtiene una ventaja si agrega los patrones permitidos por las clases de tipos (valores implícitos y conversiones). –

7

Usted ha golpeado el clavo en la cabeza con la tipificación estática y dinámica. Ambos son parte de la nueva generación de lenguajes dinámicos, con cierres, expresiones lambda, etc. Hay un puñado de diferencias sintácticas entre los dos también, 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 listas y arreglos primitivos. Groovy tiene (creo) una mejor interpolación de cuerdas.

Scala es más rápido, parece, pero la gente de Groovy está realmente presionando el rendimiento para la versión 2.0. 1.6 dio un gran salto de velocidad en la serie 1.5.

No creo que ninguno de los dos idiomas realmente "gane", ya que se dirigen 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 prototipos rápidos y desarrollo, donde la velocidad es menos importante que el tiempo que les lleva a los programadores implementar el código.

+3

"es maravilloso para el prototipado rápido y el desarrollo "- esto sugiere que Groovy no es adecuado para el uso de producción con el que estaría en desacuerdo. Hay bastantes sitios de Grails en uso de producción, por ejemplo –

+9

Scala no es un lenguaje dinámico. –

+2

"Groovy tiene (creo) una mejor interpolación de cuerdas". - con Scala-2.10.0 esto ya no es cierto (Scala obtuvo una interesante interpolación de cadenas). – VasyaNovikov

11

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

+8

Para referencia futura, también lo hace Groovy a través de GPars o Akka. – Xorlev

+4

Para referencia futura, también lo hace Groovy a través de los rasgos – vicsz

+1

Bueno, nada más: http://docs.scala-lang.org/overviews/core/actors-migration-guide.html – morty

11

scala está destinado a ser un lenguaje híbrido oo/funcional y es muy bien planificado 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.

6

Hemos utilizado ampliamente Groovy y podemos decir con confianza que es extremadamente bueno en el desarrollo de aplicaciones web de calidad de producción, no solo para la creación de prototipos. Es muy fácil de usar y permite un desarrollo rápido, tanto que es difícil desviar a los desarrolladores de Groovy para planear Java después de que lo hayan usado por algún tiempo, en mi experiencia.

No he usado mucho Scala y por eso no puedo decir mucho al respecto.

+3

¡Esto no es una respuesta! – TechSpellBound

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 recursividad basada en la cola, lo que significa más herramientas para FP pura.

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 el uso de eval creó la clase scala en tiempo de ejecución. diría Scala es la programación meta y tiene las características de complicación dinámica

Cuestiones relacionadas