Каковы основные различия между Scala и Groovy?

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

  • Каковы другие ключевые отличия и преимущества каждого из них?
  • Насколько они похожи?
  • Есть ли конкуренция между ними?
    • Если да, то кто, по вашему мнению, победит в долгосрочной перспективе?

Ответ 1

Они являются объектно-ориентированными языками для JVM, которые имеют лямбды и замыкания и взаимодействуют с Java. Помимо этого, они совершенно разные.

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

Scala - это "статический" язык, поскольку он статически типизирован и практически не имеет динамического метапрограммирования за неудобными вещами, которые вы можете делать на Java. Примечание. Scala система статического типа существенно более однородна и сложна, чем Java.

Groovy синтаксически влияет на Java, но на семантически влияет больше на такие языки, как Ruby.

Scala синтаксически влияет как Ruby, так и Java. На него семантически больше влияют Java, SML, Haskell и очень неясный язык OO, называемый gBeta.

Groovy имеет "случайную" множественную отправку из-за способа перегрузки Java.

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

Оба Scala и Groovy поддерживают форму множественного наследования с mixins (хотя Scala вызывает их черты).

Scala поддерживает как приложение частичной функции, так и currying на уровне языка, Groovy имеет неудобный метод "curry" для выполнения приложения с частичными функциями.

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

Обе версии Scala и Groovy оцениваются по умолчанию. Однако Scala поддерживает параметры по умолчанию. Groovy нет - вызов по имени должен быть эмулирован с закрытием.

Scala имеет "для понимания", обобщение перечислимых понятий, найденных на других языках (технически это понимание монадов плюс бит - где-то между Haskell do и С# LINQ).

Scala не имеет понятия "статические" поля, внутренние классы, методы и т.д. Вместо этого он использует одноэлементные объекты. Groovy использует статическую концепцию.

Scala не имеет встроенного выбора арифметических операторов таким образом, как это делает Groovy. В Scala вы можете назвать методы очень гибко.

Groovy имеет оператор elvis для обращения с нулем. Scala программисты предпочитают использовать типы опций для использования нулевого значения, но легко написать оператор elvis в Scala, если хотите.

Наконец, есть ложь, есть проклятая ложь, а затем есть ориентиры. Уровень игры в компьютерных играх оценивается как Scala как между существенно быстрее, чем Groovy (от 2 до 93 раз быстрее), сохраняя при этом примерно одинаковый размер источника. тесты.

Я уверен, что есть много и много различий, которые я не затронул. Но, надеюсь, это дает вам смысл.

Есть ли конкуренция между ними? Да, конечно, но не так сильно, как вы думаете. Groovy Настоящая конкуренция - JRuby и Jython.

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

Ответ 2

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

Ответ 3

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

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

Ответ 4

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

Scala реализует списки немного по-другому; в Groovy почти все является экземпляром java.util.List, тогда как Scala использует как списки, так и примитивные массивы. Groovy имеет (я думаю) лучшую интерполяцию строк.

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

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

Ответ 5

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

Я не использовал Scala много и поэтому не могу много говорить об этом.

Ответ 6

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

Ответ 7

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