Вони обидві об'єктно-орієнтовані мови для 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 є незручний метод «curry» для виконання додатків часткової функції.
Scala робить пряму оптимізацію хвостової рекурсії. Я не вірю, що Groovy так робить. Це важливо у функціональному програмуванні, але менш важливе в імперативному програмуванні.
І Scala, і Groovy нетерпляче оцінюються за замовчуванням. Однак Scala підтримує параметри заклику по імені. Groovy не робить - дзвінок за іменем повинен бути імітований закриттями.
Скала має "для розуміння", узагальнення списків, що знайдені в інших мовах (технічно вони є монадними розуміннями плюс трохи - десь між Haskell's do і C # 's LINQ).
Scala не має поняття "статичних" полів, внутрішніх класів, методів тощо - натомість використовує об'єкти однотонних. Groovy використовує статичну концепцію.
Scala не має в основі відбору арифметичних операторів таким чином, як це робить Groovy. У Scala ви можете назвати методи дуже гнучко.
Groovy має оператора elvis для роботи з null. Програмісти Scala вважають за краще використовувати варіанти Option перед використанням null, але легко написати оператора elvis у Scala, якщо ви хочете.
Нарешті, є брехня, є проклята брехня, а потім є орієнтири. Гра з комп'ютерними мовними орієнтирами оцінює Scala як істотну швидкість, ніж Groovy (коливається вдвічі до 93 разів швидше), зберігаючи приблизно однаковий розмір джерела. орієнтири .
Я впевнений, що є багато, багато відмінностей, які я не висвітлював. Але, сподіваємось, це дає вам суть.
Чи існує конкуренція між ними? Так, звичайно, але не настільки, як ви могли б подумати. Справжня конкуренція Groovy - це JRuby та Jython.
Хто збирається перемогти? Мій кришталевий куля настільки ж розтрісканий, як і у всіх інших.