Они оба являются объектно-ориентированными языками для JVM, которые имеют лямбда-выражения и замыкания и взаимодействуют с Java. В остальном они очень разные.
Groovy - это «динамический» язык не только в том смысле, что он динамически типизирован, но и в том смысле, что он поддерживает динамическое метапрограммирование.
Scala является «статическим» языком в том смысле, что он статически типизирован и практически не имеет динамического метапрограммирования, кроме неудобных вещей, которые вы можете делать на Java. Обратите внимание: система статических типов в Scala значительно более унифицирована и сложна, чем в Java.
На Groovy синтаксически влияет Java, но на семантическое больше влияют такие языки, как Ruby.
На Scala синтаксически влияют как Ruby, так и Java. На него больше семантически влияют Java, SML, Haskell и очень малоизвестный объектно-ориентированный язык под названием gBeta.
Groovy имеет "случайную" множественную отправку из-за того, как он обрабатывает перегрузку Java.
Scala поддерживает только однократную отправку, но в ней есть сопоставление с образцом, основанное на SML, для решения некоторых из тех же типов проблем, для решения которых предназначена множественная отправка. Однако там, где множественная отправка может выполняться только по типу среды выполнения, сопоставление с образцом в Scala может выполняться по типам среды выполнения, значениям или обоим. Сопоставление с образцом также включает синтаксически приятное связывание переменных. Трудно переоценить, насколько приятным является программирование на Scala только благодаря этой единственной функции.
И Scala, и Groovy поддерживают форму множественного наследования с помощью миксинов (хотя в Scala они называются типажами).
Scala поддерживает как частичное применение функций, так и каррирование на уровне языка, Groovy имеет неудобный метод «карри» для выполнения частичного приложения функций.
Scala выполняет прямую оптимизацию хвостовой рекурсии. Я не верю, что Groovy знает. Это важно в функциональном программировании, но менее важно в императивном программировании.
И Scala, и Groovy по умолчанию оцениваются с нетерпением. Однако Scala поддерживает параметры вызова по имени. Groovy этого не делает - вызов по имени должен эмулироваться с помощью замыканий.
В Scala есть «для понимания», обобщение представлений списков, имеющихся в других языках (технически это монадные понимания плюс немного - где-то между do Haskell и LINQ в C #).
Scala не имеет понятия «статические» поля, внутренние классы, методы и т.д. - вместо этого он использует одноэлементные объекты. Groovy использует концепцию статики.
В Scala нет встроенного набора арифметических операторов, в отличие от Groovy. В Scala вы можете очень гибко называть методы.
В Groovy есть оператор elvis для работы с null. Программисты Scala предпочитают использовать типы Option вместо использования null, но при желании легко написать оператор elvis на Scala.
Наконец, есть ложь, есть чертова ложь, а затем есть тесты. Игра компьютерных тестов оценивает Scala как значительно более быструю, чем Groovy (от двух до 93 раз быстрее), при сохранении примерно того же размера исходного кода. ориентиры .
Я уверен, что есть очень много различий, которые я не рассмотрел. Но, надеюсь, это дает вам суть.
Есть ли между ними соревнование? Да, конечно, но не настолько, как вы думаете. Настоящие конкуренты Groovy - это JRuby и Jython.
Кто победит? Мой хрустальный шар так же треснул, как и любой другой.