Каковы ключевые различия между Scala и Groovy? [закрытый]

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

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

7 ответов


Они оба объектно-ориентированные языки для JVM, которые имеют лямбды и замыкания и взаимодействуют с Java. В остальном они очень разные.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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


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


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

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

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

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


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

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


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


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