Які ключові відмінності між Scala та Groovy? [зачинено]


128

На поверхні Groovy та Scala виглядають досить схоже, окрім того, як Scala статично набрані, та Groovy - динамічні.

  • Які ще є ключові відмінності та переваги кожної з них перед іншими?
  • Наскільки вони насправді схожі?
  • Чи є конкуренція між двома?
    • Якщо так, хто, на вашу думку, переможе в довгостроковій перспективі?

Groovy 2.0 також включає статичне введення тексту: infoq.com/articles/new-groovy-20
HDave

Відповіді:


230

Вони обидві об'єктно-орієнтовані мови для 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.

Хто збирається перемогти? Мій кришталевий куля настільки ж розтрісканий, як і у всіх інших.


21
виграш для обох, якщо ви зможете змусити університети почати викладати ці мови замість просто java =)
Chii

13
Чи не незмінність є ключовою характеристикою Scala? А як щодо одночасності та акторів? Розкажіть нам ще трохи ...
Leonel

4
Якщо є якась конкуренція, це було б з Clojure, але Clojure не зацікавлений у конкуренції.
Rayne

2
Зважаючи на те, що Scala використовує той же статичний метод відправки, що і java (який гаряча точка може бути легко вбудований), а groovy динамічний метод розсилає, що Groovy буде дуже важким, щоб коли-небудь наблизитись до продуктивності Scala. Зокрема, за допомогою @specialised для оптимізації автобіксингу Java, Scala може бути швидше, ніж java. Однак випадок використання Groovy схожий на використання Ruby / Python - це для простого використання динамічно набраної мови сценаріїв, коли продуктивність, як правило, не є великою проблемою. наприклад, багато фреймворків Groovy містять тонну Java-коду для виконання (наприклад, Grails)
Джеймс Страчан

4
Оскільки ця відповідь має стільки голосів, я хотів би виправити одну частину. Правильно, що мультиметоди, засновані на спадкуванні в Groovy, почалися як випадковість, але на конференції розробників Groovy, яка включала Джеймса, і це було задовго до Groovy 1.0, і ми вирішили зберегти це. Це було б не важко змінити. Крім того, щоб додати те, що написав Джеймс ... виклик динаміки зняв бар'єр, про який він говорить
blackdrag

12

Scala призначена для гібридної мови oo / функціональної мови і дуже добре спланована і розроблена. groovy більше схожий на набір удосконалень, які багато людей хотіли б використовувати у Java. я придивився уважніше до обох, так що я можу сказати :)

жоден з них не є кращим чи гіршим, ніж інший. groovy дуже хороший у метапрограмуванні, scala дуже хороший у всьому, що не потребує метапрограмування, тому ... я схильний використовувати обидва.


11

У Scala є Актори, які роблять паралельність набагато простішим у виконанні. І риси, які дають справжнє, типовебезпечне багаторазове успадкування.


9
Для подальшого ознайомлення це робить Groovy через GPars або Akka.
Xorlev

4
Для подальшого ознайомлення, так це робить і Groovy через риси
vicsz


7

Ви потрапили в цвях по голові статичним та динамічним набором тексту. Обидва є частиною нового покоління динамічних мов із закриттями, лямбда-виразами тощо. І між ними є кілька синтаксичних відмінностей, але функціонально я не бачу величезної різниці між Groovy та Scala.

Scala реалізує Списки дещо інакше; у Groovy майже все є примірником java.util.List, тоді як Scala використовує як списки, так і примітивні масиви. Groovy має (я думаю) кращу рядкову інтерполяцію.

Scala швидше, здається, але Groovy люди дійсно підштовхують продуктивність для випуску 2.0. 1.6 дав величезний стрибок у швидкості за версію 1.5.

Я не думаю, що будь-яка мова дійсно «виграє», оскільки вони спрямовані на два різні класи проблем. Scala - це високоефективна мова, яка дуже нагадує Java, не маючи такого ж рівня шаблону, як і Java. Groovy призначений для швидкого прототипування та розробки, де швидкість є менш важливою, ніж час, який потрібен програмістам на реалізацію коду.


3
"Groovy призначений для швидкого прототипування та розробки" - це говорить про те, що Groovy не підходить для виробничого використання, з яким я не погоджуюся. У виробництві використовується досить багато сайтів Grails, наприклад
Dónal

10
Скала - це не динамічна мова.
Джон Окслі

2
"Groovy має (я думаю) кращу рядкову інтерполяцію." - для Scala-2.10.0 це вже не відповідає дійсності (Scala отримала прохолодну інтерполяцію).
ВасиліНовіков

5

У Scala набагато крутіша крива навчання, ніж у Groovy. Scala має набагато більшу підтримку функціонального програмування з його узгодженням шаблону та рекурсією на основі хвоста, тобто більше інструментів для чистого ПЗ.


0

У Scala також є компіляція з динаміки, і я зробив це за допомогою twitter eval lib ( https://github.com/twitter/util ). Я зберігав код scala у плоскому файлі (без будь-якого розширення) та використовував створений eval клас Scala під час виконання. Я б сказав, що scala є метапрограмуванням і має особливість динамічного ускладнення

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.