Scala vs. Groovy vs. Clojure [закрито]


676

Може хтось, будь ласка, пояснить основні відмінності між Scala, Groovy та Clojure. Я знаю, що кожен з цих компіляцій працює на JVM, але я хотів би просте порівняння між ними.

Відповіді:


873

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

Clojure - це діалект Lisp з кількома вдосконаленими функціями, такими як Software Transactional Memory . Якщо вам подобається Лісп і хочете використати щось подібне під JVM, Clojure - це для вас. Це, можливо, найбільш функціональна мова, що працює на JVM, і, безумовно, найвідоміша. Крім того, він робить сильніший акцент на незмінність, ніж інші діалекти Ліспа, що робить його ближче до серця любителів функціональної мови.

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

Groovy має гарне сприйняття та популярну веб-структуру в Grails. Він також забезпечує систему побудови Gradle, яка стає популярною альтернативою Maven. Я особисто вважаю, що це мова з обмеженою корисністю, особливо, коли Jython та JRuby починають робити набіги на JVM-землю, порівняно з іншими.

Clojure, навіть знижуючи деякі дуже цікаві функції, має сильну привабливість лише тим, що є діалектом Lisp на JVM. Це, можливо, обмежить його популярність, але я сподіваюся, що довгий час у неї буде лояльна спільнота.

Scala може конкурувати безпосередньо з Java, а також запускати гроші за майже всі аспекти. Наразі вона не може конкурувати за популярністю, і відсутність потужної корпоративної підтримки може перешкоджати її прийняттю у корпоративних середовищах. Це також набагато більш динамічна мова, ніж Java, в сенсі того, як мова розвивається. З точки зору мови, це добре. З точки зору користувачів, які планують записати тисячі рядків коду, це не так.

Як остаточне розкриття, я дуже добре знайомий зі Скалою, і лише знайомий з двома іншими.


1
Хороший. Хоча я маю сказати, що Scala має корпоративну підтримку Lightbend, і вона використовується такими великими іменами, як LinkedIn, Twitter, Spark та багато банків. Де я працюю, у нас є кодова база з 11 мільйонів рядків Scala, що не дуже добре, але вона працює.
Джоан

219

Скала

Scala розвинулася з чистої функціональної мови, відомої як « Воронка», і являє собою реалізацію майже всіх синтаксисів Java, відрізняючись лише тим, де можна було б досягти чіткого вдосконалення або де це призведе до загрози функціональному характеру мови. Такі відмінності включають одиночні об'єкти замість статичних методів та тип виводу.

Значна частина цього ґрунтувалася на попередній роботі Мартіна Одерського з мовою піци . Інтеграція ОО / ПП виходить далеко за рамки простого закриття і призвела до того, що мова описується як постфункціональна.

Незважаючи на це, він за багатьма ознаками найближчий до Java. В основному завдяки поєднанню підтримки OO та статичного набору тексту, а також завдяки явній цілі в мовному дизайні, що вона повинна дуже тісно інтегруватися з Java.

Groovy

Groovy прямо вирішує дві найбільші критики Яви

  • динамічно набирається, що видаляє багато котла та
  • додавання мови до закриттів.

Це, мабуть, синтаксично найближче до Java, не пропонує деяких більш багатих функціональних конструкцій, які надають Clojure та Scala, але все ж пропонує певне еволюційне вдосконалення - особливо для написання програм-скриптів syle.

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

Clojure

Clojure - це функціональна мова в сім'ї LISP, вона також динамічно набирається.

Такі функції, як підтримка STM, надають їй найкращу підтримку одночасного одночасного використання, тоді як Scala вимагає сторонньої бібліотеки, такої як Akka, щоб її дублювати.

Синтаксично це також найдальша з трьох мов із типового коду Java.

Я також повинен розкрити, що я найбільше знайомий зі Скалою :)


11
Я ніколи раніше не чув про цю мову воронки. Дякуємо, що заповнили невеликий пробіл в історичному записі.
Рандалл Шульц

8
Ви дійсно не можете назвати Clojure чистою функціональною мовою. Напевно можна написати імперативний код.
дбирне

2
Scala створила в бібліотеці Акка для одночасності на базі акторів. Це вже не третя сторона залежності.
scott m gardner

2
@Orubel У байт-коді клас Scala ідентичний еквівалентному класу Java - типи та всі. Як приклад, весь API Akka Java написаний на Scala. Тому, будь ласка, поясніть, що ви маєте на увазі під "не можу інтегруватись" тут, тому що це звучить як FUD для мене.
Кевін Райт

3
Підсумовуючи цей документ: "Функції Scala, які не існують на Java, не можуть бути безпосередньо використані на Java". Однак ... члени абстрактних типів та типи вищого роду - це досить вдосконалені функції, якими ви точно не змушені користуватися! Java також не може використовувати методи без параметрів, будівельників або модулів розширення від Groovy, таким чином, також робить Groovy "не тісно інтегрованою" за вашим власним визначенням.
Кевін Райт

68

Я ніколи не встиг пограти з клоджуром. Але для scala vs groovy - це слова Джеймса Страчана - творця Groovy

"Хоча моя порада, хоча довгостроково замінює javac - Scala. Я дуже вражений цим! Я можу чесно сказати, якби хтось показав мені програмування у книзі Scala Мартіна Одерського, Lex Spoon & Bill Venners ще в 2003 році. "Мабуть, ніколи б не створили Groovy".

Ви можете прочитати всю історію тут


72
Слід зазначити, що це твердження не говорить про те, що Скала краща за Гроови. Джеймс також відомий тим, що, якби він знав, скільки проблем створює мова, він ніколи не створив би його. Побачене в цьому контексті зрозуміло, чому він тоді, звичайно, не розвинув би Гроові. І я смію сказати, що він дав багато хороших ідей, але він не творець нинішньої Гроової. він покинув проект задовго до 1,0 в 2007 році і відтоді не брав участі. У проекті як мінімум стільки, скільки без нього, як і з ним.
blackdrag

31
А враховуючи, що Джеймс Страчан активно працює над мовою Котліна, Скала, мабуть, для нього недостатньо вражаючий.
bdkosher

6
@bdkosher він працює над цим, тому що Scala є занадто вражаючим для більшості програмістів ... і [що ще важливіше] в деяких місцях теж занадто складне
Відображати ім'я

30

Їх можна розмежовувати з тим, звідки вони приїжджають або з яких розробників вони орієнтуються в основному.

Groovy трохи схожий на сценарій версії Java. Програмісти Java довго відчувають себе як вдома, коли створюють спритні програми, підтримувані великими архітектурами. Groovy on Grails - це, як випливає з назви, схожий на рамки Rails. Для людей, які не хочуть постійно турбуватися з багатослівністю Java.

Scala - об'єктно-орієнтована і функціональна мова програмування, і програмісти Ruby або Python можуть відчувати себе ближче до цієї. Тут використовується досить багато загальних добрих ідей, які можна знайти в цих мовах програмування.

Clojure - це діалект мови програмування Lisp, тому розробники Lisp, Scheme або Haskell можуть відчувати себе як вдома під час розвитку цієї мови.


24
Scala насправді не є функціональною мовою програмування. По-перше, це об'єктно-орієнтована мова програмування з функціональними особливостями.
Даніель К. Собрал

16
Треба сказати, ця відповідь дуже схожа на постріл у темряві. Думаю, вдалий випадок, коли Python ближче до Groovy, ніж до Scala, а Ruby (на мій погляд) не надто близький до будь-якого із перерахованих, можливо, найближчим до Groovy. Haskell не дуже схожий на (звичайний) Lisp або Scheme (і, таким чином, не дуже схожий на Clojure). Як мені здається, ця відповідь (у кращому випадку!) Виглядає як "я теж не знаю, дозвольте мені Вікіпедію"
Джон Y

21
Скала - імперативна мова з деякими функціональними особливостями. Якщо люди продовжують називати мову функціональною, як тільки вона прийме ідіоми з функціонального світу, цей термін стане просто ще одним маркетинговим терміном. Можна також почати називати C ++ функціональними та Haskell необхідними.
jon-hanson

9
@alanlcode Одерський може сказати, що хоче. У Scala немає системи виділення побічних ефектів, вона за замовчуванням не лінива і не розглядає код як дані - вона розглядає виклики функцій як дані, що відрізняється. Це великі проблеми, якщо ви хочете бути повністю функціональними. З іншого боку, Scala проходить увесь шлях, щоб переконатися, що її Об'єктна модель не є хибною. Я люблю Scala, але це явно функціональне друге.
Даніель К. Собрал

7
З іншого боку, сімейство мов ML визнано функціональним, але є суворим і допускає побічні ефекти / імперативний код.
GClaramunt

8

Я читаю книгу прагматичних програмістів "Groovy Recipes: Gading the wheel of Java" Скотта Девіса, Copyright 2008 і надрукована у квітні того ж року.

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


Це найкраща книга для вивчення Groovy.
topr

Напевно, важливо зазначити, що не весь код буде вести себе точно однаково. Деякі з цих відмінностей включають те, як Гроові розуміє одинарні та подвійні лапки та перевагу боксу над розширенням. Однак більшість кодів буде працювати однаково.
Онтонатор

4

Очевидно, синтаксис зовсім інший (Groovy найближчий до Яви), але я гадаю, що це не те, про що ви просите.

Якщо вам цікаво використовувати їх для скриптування Java-програми, Scala, мабуть, не є вдалим вибором, оскільки не існує простого способу оцінити це з Java, тоді як Groovy особливо підходить для цієї мети.


Я не розумію вашої точки зору використання Scala для скрипту Java. Ви, звичайно, можете написати сценарій Scala, який керує кодом Java; не evalпотрібно.
Даніель Янковський

2
@Daniel, будь ласка, дивіться питання про використання Scala для сценаріїв, яке я пов’язав. Прийнята відповідь там полягає в тому, що відсутність засобів "eval" та підтримки javax.scripting робить складніше використовувати Scala для скрипту програми Java, тоді це, скажімо, Groovy.
Тіло
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.