Jakie są kluczowe różnice między Scalą a Groovym? [Zamknięte]

129

Z pozoru Groovy i Scala wyglądają bardzo podobnie, poza tym, że Scala jest wpisywana statycznie i dynamicznie Groovy.

  • Jakie są inne kluczowe różnice i przewagi, które mają nad innymi?
  • Jak bardzo są do siebie podobni?
  • Czy istnieje między nimi konkurencja?
    • Jeśli tak, to kto Twoim zdaniem wygra na dłuższą metę?
Leif
źródło
Groovy 2.0 zawiera również statyczne wpisywanie: infoq.com/articles/new-groovy-20
HDave

Odpowiedzi:

230

Oba są językami obiektowymi dla JVM, które mają lambdy i zamknięcia oraz współpracują z Javą. Poza tym są skrajnie różni.

Groovy jest językiem „dynamicznym” nie tylko w tym sensie, że jest wpisywany dynamicznie, ale także z tego, że obsługuje dynamiczne metaprogramowanie.

Scala jest językiem „statycznym”, ponieważ jest zapisywany statycznie i praktycznie nie ma dynamicznego metaprogramowania poza niewygodnymi rzeczami, które można zrobić w Javie. Uwaga: statyczny system typów Scali jest znacznie bardziej jednolity i wyrafinowany niż Java.

Na Groovy ma wpływ Java, ale semantycznie większy wpływ mają języki takie jak Ruby.

Na Scalę wpływają zarówno Ruby, jak i Java. Pod względem semantycznym większy wpływ na to ma Java, SML, Haskell i bardzo mało znany język obiektowy o nazwie gBeta.

Groovy ma „przypadkowe” wysłanie wielokrotne ze względu na sposób, w jaki radzi sobie z przeciążeniem Java.

Scala obsługuje tylko jedną wysyłkę, ale ma inspirowane SML dopasowywanie wzorców, aby poradzić sobie z niektórymi tego samego rodzaju problemami, które mają rozwiązać wielokrotna wysyłka. Jednak gdy wielokrotne wysyłanie może być wysyłane tylko na podstawie typu środowiska uruchomieniowego, dopasowanie wzorców Scali może być wysyłane w przypadku typów i wartości środowiska uruchomieniowego. Dopasowywanie wzorców obejmuje również przyjemne składniowo wiązanie zmiennych. Trudno przecenić, jak przyjemna jest sama ta pojedyncza funkcja, która sprawia, że ​​programowanie w Scali.

Zarówno Scala, jak i Groovy obsługują formę wielokrotnego dziedziczenia z mieszankami (chociaż Scala nazywa je cechami).

Scala obsługuje zarówno częściowe zastosowanie funkcji, jak i currying na poziomie języka, Groovy ma niezręczną metodę "curry" do wykonywania częściowych aplikacji funkcji.

Scala dokonuje bezpośredniej optymalizacji rekurencji ogona. Nie wierzę, że Groovy wie. Jest to ważne w programowaniu funkcjonalnym, ale mniej ważne w programowaniu imperatywnym.

Zarówno Scala, jak i Groovy są domyślnie chętnie oceniane. Jednak Scala obsługuje parametry wywołania według nazwy. Groovy tego nie robi - wezwanie po imieniu musi być emulowane za pomocą domknięć.

Scala ma „do rozumienia”, uogólnienie list składanych, które można znaleźć w innych językach (technicznie rzecz biorąc są to wyrażenia monad plus trochę - gdzieś pomiędzy do Haskella i C # LINQ).

Scala nie ma koncepcji pól „statycznych”, klas wewnętrznych, metod itp. - zamiast tego używa pojedynczych obiektów. Groovy wykorzystuje koncepcję statyczną.

Scala nie ma wbudowanej opcji wyboru operatorów arytmetycznych w taki sposób, jak Groovy. W Scali można bardzo elastycznie nazywać metody.

Groovy ma operatora elvis do obsługi wartości null. Programiści Scali wolą używać typów opcji niż null, ale łatwo jest napisać operator elvis w Scali, jeśli chcesz.

Wreszcie są kłamstwa, są cholerne kłamstwa, a potem są punkty odniesienia. W benchmarku komputerowym Scala plasuje się pomiędzy znacznie większą szybkością niż Groovy (od dwóch do 93 razy szybciej), zachowując mniej więcej ten sam rozmiar źródła. wzorce .

Jestem pewien, że istnieje wiele, wiele różnic, których nie omówiłem. Ale mam nadzieję, że to daje ci sedno.

Czy istnieje między nimi konkurencja? Tak, oczywiście, ale nie tak bardzo, jak mogłoby się wydawać. Prawdziwą konkurencją Groovy'ego są JRuby i Jython.

Kto wygra? Moja kryształowa kula jest tak samo popękana, jak każda inna.

James Iry
źródło
21
byłoby wygraną dla obu, gdyby udało się skłonić uniwersytety do rozpoczęcia nauczania tych języków zamiast po prostu java =)
Chii
13
Czy niezmienność nie jest kluczową cechą Scali? A co z współbieżnością i aktorami? Powiedz nam więcej ...
Leonel
4
Jeśli jest jakaś konkurencja, będzie to Clojure, ale Clojure nie jest zainteresowana konkurencją.
Rayne
2
Biorąc pod uwagę, że Scala używa tej samej statycznej metody wysyłania, co java (którą hotspot może łatwo wbudować), a groovy wykonuje dynamiczne wysyłanie metod, będzie naprawdę trudno Groovy'emu zbliżyć się do wydajności Scali. Szczególnie z @specialised w celu optymalizacji autoboxingu Java, Scala może być czasami szybsza niż java. Jednak przypadek użycia Groovy jest podobny do używania Ruby / Python - jest to łatwy w użyciu język skryptowy z dynamicznym typowaniem, w którym wydajność zazwyczaj nie stanowi większego problemu. np. wiele frameworków Groovy zawiera mnóstwo kodu Javy zapewniającego wydajność (jak Grails)
James Strachan,
4
Ponieważ ta odpowiedź ma tak wiele głosów, jest jedna część, którą chciałbym poprawić. To prawda, że ​​multimetody oparte na dziedziczeniu w Groovy zaczęły się jako przypadek, ale na konferencji programistów Groovy, w której uczestniczył James, na długo przed Groovy 1.0 postanowiliśmy to zachować. Nie byłoby trudno to zmienić. Dodam też do tego, co napisał James ... invokedynamic zdjął tę barierę, o której mówi
blackdrag
12

Scala ma być językiem hybrydowym oo / funkcjonalnym i jest bardzo dobrze zaplanowana i zaprojektowana. groovy bardziej przypomina zestaw ulepszeń, których wiele osób chciałoby używać w javie. przyjrzałem się bliżej obu, więc mogę powiedzieć :)

żaden z nich nie jest lepszy ani gorszy od drugiego. groovy jest bardzo dobry w metaprogramowaniu, scala jest bardzo dobry we wszystkim, co nie wymaga metaprogramowania, więc ... zwykle używam obu.

hamsterofdeath
źródło
11

Scala ma aktorów, które znacznie ułatwiają implementację współbieżności. Oraz cechy, które dają prawdziwe, bezpieczne dla wielu dziedziczenie.

jasonnerothin
źródło
9
Na przyszłość, podobnie Groovy za pośrednictwem GPars lub Akka.
Xorlev
4
Na przyszłość, podobnie Groovy poprzez cechy
vicsz
7

Trafiłeś w sedno dzięki statycznemu i dynamicznemu pisaniu. Oba są częścią nowej generacji języków dynamicznych, z domknięciami, wyrażeniami lambda i tak dalej. Istnieje również kilka różnic składniowych między nimi, ale funkcjonalnie nie widzę dużej różnicy między Groovym i Scalą.

Scala implementuje listy nieco inaczej; w Groovy prawie wszystko jest instancją java.util.List, podczas gdy Scala używa zarówno list, jak i tablic prymitywnych. Groovy ma (jak sądzę) lepszą interpolację strun.

Wygląda na to, że Scala jest szybsza, ale ludzie z Groovy naprawdę naciskają na wydajność w wersji 2.0. 1.6 dał ogromny skok prędkości w stosunku do serii 1.5.

Nie sądzę, aby którykolwiek z języków naprawdę „wygrał”, ponieważ dotyczą dwóch różnych klas problemów. Scala to wysokowydajny język, który jest bardzo podobny do języka Java, ale nie ma takiego samego poziomu standardowego jak Java. Groovy służy do szybkiego prototypowania i rozwoju, gdzie szybkość jest mniej ważna niż czas potrzebny programistom na wdrożenie kodu.

Don Werve
źródło
3
„Groovy służy do szybkiego prototypowania i rozwoju” - to sugeruje, że Groovy nie nadaje się do zastosowań produkcyjnych, z czym bym się nie zgadzał. Jest sporo zakładów w Grails, które są wykorzystywane produkcyjnie, na przykład
Dónal
10
Scala nie jest językiem dynamicznym.
John Oxley
2
„Groovy ma (myślę) lepszą interpolację strun”. - w przypadku Scala-2.10.0 nie jest to już prawdą (Scala ma fajną interpolację ciągów).
VasiliNovikov
5

Scala ma znacznie bardziej stromą krzywą uczenia się niż Groovy. Scala ma znacznie większe wsparcie dla programowania funkcjonalnego dzięki dopasowaniu wzorców i rekurencji opartej na ogonach, co oznacza więcej narzędzi dla czystego FP.

Więcej niż pięć
źródło
0

Scala ma również kompilację dynamiki i zrobiłem to za pomocą twittera eval lib ( https://github.com/twitter/util ). Trzymałem kod scala w płaskim pliku (bez żadnego rozszerzenia) i używając eval utworzonej klasy scala w czasie wykonywania. Powiedziałbym, że scala jest metaprogramowaniem i ma cechę dynamicznej komplikacji

Veerbhan Tahlani
źródło