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.