В чем основные различия между 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 имеет неудобный метод «карри» для выполнения частичного приложения функций.

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.

Кто победит? Мой хрустальный шар так же треснул, как и любой другой.

Джеймс Айри
источник
21
было бы победой для обоих, если бы можно было заставить университеты начать преподавать эти языки, а не просто java =)
Chii
13
Разве неизменность - не ключевая характеристика Scala? А как насчет параллелизма и субъектов? Расскажи нам еще ...
Леонель
4
Если есть конкуренция, то это будет Clojure, но Clojure не заинтересован в конкуренции.
Rayne
2
Учитывая, что Scala использует ту же отправку статических типизированных методов, что и java (горячая точка может легко встроиться), а Groovy отправляет динамические методы, Groovy будет очень сложно когда-либо приблизиться к производительности Scala. В частности, с @specialized для оптимизации автобоксов java, Scala иногда может быть быстрее java. Однако вариант использования Groovy аналогичен использованию Ruby / Python - это простой в использовании язык сценариев с динамической типизацией, где производительность обычно не является большой проблемой. например, многие фреймворки Groovy содержат тонны кода Java для повышения производительности (например, Grails)
Джеймс Страчан
4
Поскольку за этот ответ так много голосов, я хотел бы исправить одну часть. Правильно, что основанные на наследовании мультиметоды в Groovy зародились случайно, но на конференции разработчиков Groovy, в которой участвовал Джеймс, а это было задолго до Groovy 1.0, мы решили сохранить это. Изменить это было нетрудно. Кроме того, чтобы добавить к тому, что написал Джеймс ... invokedynamic снял тот барьер, о котором он говорит
blackdrag
12

scala задуман как функционально-функциональный гибридный язык, он очень хорошо спланирован и разработан. Groovy больше похож на набор улучшений, которые многие люди хотели бы использовать в java. я внимательно посмотрел на оба, так что могу сказать :)

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

hamsterofdeath
источник
11

В Scala есть акторы, которые значительно упрощают реализацию параллелизма. И черты, обеспечивающие истинное, безопасное для типов множественное наследование.

jasonnerothin
источник
9
Для справки в будущем, Groovy через GPars или Akka тоже.
Xorlev
4
На будущее, Groovy через черты характера
тоже
1
Ну, больше нет: docs.scala-lang.org/overviews/core/actors-migration-guide.html
Морти 08
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 используются в производственной среде
Дональ
10
Scala - это не динамический язык.
Джон Оксли
2
«В Groovy (я думаю) лучшая интерполяция строк». - в Scala-2.10.0 это больше не так (в Scala появилась классная интерполяция строк).
VasiliNovikov 01
5

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

Более пяти
источник
0

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

Вирбхан Тахлани
источник