Скала против Groovy против Clojure [закрыто]

676

Может кто-нибудь объяснить, пожалуйста, основные различия между Scala, Groovy и Clojure. Я знаю, что каждый из этих компиляторов запускается на JVM, но я хотел бы провести простое сравнение между ними.

Джеймс Фассетт
источник

Ответы:

873

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

Clojure - это диалект Lisp с несколькими расширенными функциями, такими как программная транзакционная память . Если вам нравится Lisp и вы хотите использовать что-то подобное в JVM, Clojure для вас. Это, пожалуй, самый функциональный язык в JVM и, безусловно, самый известный. Кроме того, он делает больший акцент на неизменности, чем другие диалекты Лисп, что делает его ближе к сердцу энтузиастов функционального языка.

Scala - это полностью объектно-ориентированный язык, в большей степени, чем Java, с одной из самых продвинутых систем типов, доступных на неисследованных языках, и, безусловно, самой продвинутой системой типов в JVM. Он также сочетает в себе многие понятия и особенности функциональных языков, не ставя под угрозу объектную ориентацию, но его компромисс по характеристикам функционального языка отталкивает некоторых энтузиастов последнего.

Groovy имеет хорошее признание и популярный веб-фреймворк в Grails. Он также поддерживает систему сборки Gradle, которая становится популярной альтернативой Maven. Я лично думаю, что это язык с ограниченной полезностью, особенно когда Jython и JRuby начинают проникать на землю JVM по сравнению с другими.

Clojure, даже не считая некоторых очень интересных функций, имеет сильную привлекательность, будучи просто диалектом Lisp в JVM. Конечно, это может ограничить его популярность, но я ожидаю, что в течение долгого времени у него будет лояльное сообщество.

Scala может напрямую конкурировать с Java и испытывать свои усилия практически по всем аспектам. Конечно, в настоящее время он не может конкурировать по популярности, и отсутствие сильной корпоративной поддержки может помешать его принятию в корпоративной среде. Это также гораздо более динамичный язык, чем Java, в смысле его развития. С точки зрения языка это хорошо. С точки зрения пользователей, которые планируют написать тысячи строк кода, это не так.

В заключение, я очень хорошо знаком со Scala и знаком только с двумя другими.

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

Scala

Scala эволюционировал из чисто функционального языка, известного как Funnel, и представляет собой чистую комнату реализации почти всего синтаксиса Java, отличающуюся только тем, где можно сделать явное улучшение или где это может поставить под угрозу функциональную природу языка. Такие различия включают одноэлементные объекты вместо статических методов и вывод типов.

Многое из этого было основано на предыдущей работе Мартина Одерского с языком пиццы . Интеграция OO / FP выходит далеко за рамки простого замыкания и приводит к тому, что язык описывается как пост-функциональный.

Несмотря на это, он ближе всего к Java во многих отношениях. Главным образом из-за сочетания поддержки ОО и статической типизации, а также из-за явной цели в дизайне языка, чтобы он очень тесно интегрировался с Java.

Groovy

Groovy однозначно решает две самые большие критики Java

  • динамически набираемый, который удаляет много шаблонного и
  • добавление замыканий на язык.

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

Groovy имеет самую сильную коммерческую поддержку из трех языков, в основном через источник весны.

Clojure

Clojure - это функциональный язык в семействе LISP, он также динамически типизирован.

Такие функции, как поддержка STM, обеспечивают лучшую встроенную поддержку параллелизма, в то время как Scala требуется сторонняя библиотека, такая как Akka, для ее дублирования.

Синтаксически, это также самый далекий из трех языков из типичного кода Java.

Я также должен сообщить, что я больше всего знаком со Scala :)

Кевин Райт
источник
11
Я никогда не слышал об этом языке воронки раньше. Спасибо за заполнение небольшого пробела в историческом отчете.
Рэндалл Шульц
8
Вы не можете назвать Clojure чисто функциональным языком. Конечно, можно написать императивный код.
dbyrne
2
Scala имеет встроенную библиотеку Akka для актерского параллелизма. Это уже не сторонняя зависимость.
Скотт М Гарднер
2
@Orubel В байт-коде класс scala идентичен эквивалентному классу Java - типам и всем. Как пример, весь API Java Akka написан на Scala. Поэтому, пожалуйста, объясните, что вы подразумеваете под «не могу интегрироваться», потому что для меня это звучит как FUD.
Кевин Райт
3
Подводя итог этому документу: «Функции Scala, которые не существуют в Java, не могут напрямую использоваться в Java». Однако ... члены абстрактного типа и типы с более высоким родом являются довольно продвинутыми функциями, которые вы, конечно, не обязаны использовать! Java также не может использовать методы без параметров, компоновщиков или модулей расширения из Groovy, что также делает Groovy «не сильно интегрированным» по вашему собственному определению.
Кевин Райт
68

У меня никогда не было времени играть с clojure. Но для scala vs groovy это слова Джеймса Страчана - создателя Groovy

«Хотя мой совет относительно долгосрочной замены javac - это Scala. Я очень впечатлен этим! Я могу честно сказать, если бы кто-то показал мне книгу« Программирование в Scala »Мартина Одерского, Lex Spoon & Bill Venners еще в 2003 году, я Наверное, никогда бы не создал Groovy. "

Вы можете прочитать всю историю здесь

Тайский тран
источник
72
Следует отметить, что это утверждение не говорит о том, что Scala лучше, чем Groovy. Джеймс также известен тем, что он сказал, что если бы он знал, сколько проблем создать язык, он бы никогда не создал его. В этом контексте ясно, почему он не разработал Groovy. И я смею сказать, что он дал много хороших идей, но он не является создателем нынешнего Groovy. он покинул проект задолго до 1.0 в 2007 году и с тех пор не участвовал. В нем как минимум столько же, сколько было с ним.
Blackdrag
31
А учитывая, что Джеймс Страчан активно работает над языком котлина, Скала явно не впечатляет его.
бдкошер
6
@bdkosher он работает над этим, потому что Scala слишком впечатляет для большинства программистов… и [что еще более важно] в некоторых местах слишком сложен
Отображаемое имя
30

Их можно отличить от того, откуда они берутся или на каких разработчиков они нацелены в основном.

Groovy немного похож на скриптовую версию Java. Долгое время программисты на Java чувствовали себя как дома при создании гибких приложений на основе больших архитектур. Groovy на Grails, как следует из названия, похож на фреймворк Rails. Для людей, которые не хотят постоянно беспокоиться о многословии Java.

Scala - это объектно-ориентированный и функциональный язык программирования, и программисты на Ruby или Python могут почувствовать себя ближе к этому. Он использует довольно много общих хороших идей, найденных в этих языках программирования.

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

Mehmet Duran
источник
24
Scala на самом деле не функциональный язык программирования. Это прежде всего объектно-ориентированный язык программирования с функциональными возможностями.
Даниэль С. Собрал
16
Я должен сказать, что этот ответ очень похож на выстрел в темноте. Я думаю, можно привести хороший пример того, что Python ближе к Groovy, чем к Scala, а Ruby (на мой взгляд) не слишком близок к чему-либо из вышеперечисленного, возможно, ближе всего к Groovy. Haskell не очень похож на (Common) Lisp или Scheme (и, следовательно, не очень похож на Clojure). Для меня этот ответ выглядит (в лучшем случае!) Как «Я тоже не знаю, дай мне Википедию, что для тебя».
Джон Y
21
Scala - это императивный язык с некоторыми функциональными возможностями. Если люди продолжат называть язык функциональным, как только он примет идиомы из функционального мира, тогда этот термин станет еще одним маркетинговым термином. Можно также начать называть C ++ функциональным и обязательным для Haskell.
Джон Хансон
9
@alanlcode Одерский может сказать, что хочет. В Scala нет системы для изоляции побочных эффектов, по умолчанию она не ленивая и не обрабатывает код как данные - она ​​обрабатывает вызовы функций как данные, которые отличаются. Это большие проблемы, если вы хотите быть полностью функциональным. С другой стороны, Scala делает все возможное, чтобы гарантировать, что ее объектная модель не имеет недостатков. Я люблю Scala, но она явно функциональна.
Даниэль С. Собрал
7
С другой стороны, семейство языков ML признано функциональным, но оно строгое и допускает побочные эффекты / императивный код.
GClaramunt
8

Я читаю книгу Скотта Дэвиса «Прагматичные программисты»: «Отличные рецепты: смазка колес Java», авторское право, 2008 год, напечатанную в апреле того же года.

Это немного устарело, но книга ясно дает понять, что Groovy буквально является расширением Java. Я могу написать код Java, который работает точно так же, как Java, и переименовать файл * .groovy, и он работает нормально. Согласно книге, верно обратное, если я включу необходимые библиотеки. Пока что эксперименты это подтверждают.

Джим Коллингс
источник
Это лучшая книга для изучения Groovy.
Topr
Вероятно, важно отметить, что не весь код будет вести себя одинаково. Некоторые из этих различий включают способ, которым Groovy понимает одинарные и двойные кавычки, и его предпочтение по сравнению с расширением. Большая часть кода будет работать одинаково.
Онтонатор
4

Очевидно, что синтаксис совершенно другой (Groovy ближе всего к Java), но я полагаю, это не то, что вы просите.

Если вы заинтересованы в их использовании для написания сценариев в Java-приложении, Scala, вероятно, не является хорошим выбором, поскольку нет простого способа оценить его с помощью Java, тогда как Groovy особенно подходит для этой цели.

Тило
источник
Я не понимаю вашу точку зрения об использовании Scala для написания сценариев Java. Вы, конечно, можете написать скрипт Scala, который управляет кодом Java; не evalтребуется
Даниэль Янковский
2
@Daniel, пожалуйста, посмотрите вопрос об использовании Scala для сценариев, который я связал. Принято ответить, что отсутствие средства «eval» и поддержки javax.scripting делает использование Scala для создания сценариев Java-приложения более хитрым, чем, скажем, в Groovy.
Тило