Ce sont tous deux des langages orientés objet pour la JVM qui ont des lambdas et des fermetures et qui interagissent avec Java. À part cela, ils sont extrêmement différents.
Groovy est un langage «dynamique» non seulement dans le sens où il est typé dynamiquement, mais qu'il prend en charge la méta-programmation dynamique.
Scala est un langage "statique" en ce sens qu'il est typé statiquement et n'a pratiquement pas de méta-programmation dynamique au-delà des choses gênantes que vous pouvez faire en Java. Notez que le système de type statique de Scala est nettement plus uniforme et sophistiqué que celui de Java.
Groovy est syntaxiquement influencé par Java mais sémantiquement davantage influencé par des langages comme Ruby.
Scala est syntaxiquement influencé par Ruby et Java. Il est davantage influencé sémantiquement par Java, SML, Haskell et un langage OO très obscur appelé gBeta.
Groovy a une distribution multiple "accidentelle" en raison de la façon dont il gère la surcharge Java.
Scala est une distribution unique uniquement, mais a une correspondance de modèle inspirée de SML pour traiter certains des mêmes types de problèmes que l'envoi multiple est censé gérer. Cependant, lorsque la distribution multiple ne peut être distribuée que sur le type d'exécution, la correspondance de modèle de Scala peut distribuer les types d'exécution, les valeurs ou les deux. La correspondance de modèles comprend également une liaison de variables syntaxiquement agréable. Il est difficile d'exagérer à quel point cette fonctionnalité unique rend la programmation dans Scala.
Scala et Groovy prennent en charge une forme d'héritage multiple avec des mixins (bien que Scala les appelle des traits).
Scala prend en charge à la fois l'application de fonction partielle et le curry au niveau du langage, Groovy a une méthode "curry" maladroite pour faire une application de fonction partielle.
Scala effectue une optimisation directe de la récursivité de la queue. Je ne crois pas que Groovy le fasse. C'est important dans la programmation fonctionnelle mais moins important dans la programmation impérative.
Scala et Groovy sont évalués avec impatience par défaut. Cependant, Scala prend en charge les paramètres d'appel par nom. Groovy ne le fait pas - l'appel par nom doit être émulé avec des fermetures.
Scala a "pour les compréhensions", une généralisation des compréhensions de listes trouvées dans d'autres langages (techniquement, ce sont des compréhensions monades plus un peu - quelque part entre le do de Haskell et le LINQ de C #).
Scala n'a aucun concept de champs "statiques", de classes internes, de méthodes, etc. - il utilise à la place des objets singleton. Groovy utilise le concept statique.
Scala n'a pas intégré la sélection d'opérateurs arithmétiques de la même manière que Groovy. Dans Scala, vous pouvez nommer les méthodes de manière très flexible.
Groovy a l'opérateur elvis pour traiter null. Les programmeurs Scala préfèrent utiliser les types Option à l'utilisation de null, mais il est facile d'écrire un opérateur elvis dans Scala si vous le souhaitez.
Enfin, il y a des mensonges, il y a des mensonges fous, et puis il y a des repères. Le jeu de référence en langage informatique classe Scala comme étant sensiblement plus rapide que Groovy (allant de deux à 93 fois plus rapide) tout en conservant à peu près la même taille de source. repères .
Je suis sûr qu'il existe de très nombreuses différences que je n'ai pas couvertes. Mais j'espère que cela vous donne une idée essentielle.
Y a-t-il une concurrence entre eux? Oui, bien sûr, mais pas autant que vous ne le pensez. La vraie concurrence de Groovy est JRuby et Jython.
Qui va gagner? Ma boule de cristal est aussi fissurée que celle des autres.