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ę?
Odpowiedzi:
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.
źródło
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.
źródło
Scala ma aktorów, które znacznie ułatwiają implementację współbieżności. Oraz cechy, które dają prawdziwe, bezpieczne dla wielu dziedziczenie.
źródło
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.
źródło
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.
źródło
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
źródło