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.
Groovy 2.0 también incluye tipos estáticos: http://www.infoq.com/articles/new-groovy-20 – HDave