Scala vs. Groovy vs. Clojure [zamknięte]

676

Czy ktoś może wyjaśnić główne różnice między Scalą, Groovy i Clojure. Wiem, że każdy z tych kompilatorów działa na JVM, ale chciałbym proste porównanie między nimi.

James Fassett
źródło

Odpowiedzi:

873

Groovy jest językiem dynamicznie typowanym, którego składnia jest bardzo zbliżona do Javy, z kilkoma ulepszeniami składni, które pozwalają na lżejszy kod i mniejszą liczbę poprawek. Może działać zarówno przez interpreter, jak i być kompilowany, co czyni go dobrym do szybkiego prototypowania, skryptów i nauki języków dynamicznych bez konieczności uczenia się nowej składni (zakładając, że znasz Javę). Począwszy od Groovy 2.0, ma także coraz większą obsługę kompilacji statycznej . Groovy obsługuje zamykanie i ma wsparcie dla programowania w nieco funkcjonalnym stylu, chociaż wciąż jest to dość dalekie od tradycyjnej definicji programowania funkcjonalnego.

Clojure to dialekt Lisp z kilkoma zaawansowanymi funkcjami, takimi jak Software Transactional Memory . Jeśli lubisz Lisp i chciałbyś użyć czegoś takiego w JVM, Clojure jest dla Ciebie. Jest to prawdopodobnie najbardziej funkcjonalny język działający w JVM, a na pewno najbardziej znany. Ponadto kładzie większy nacisk na niezmienność niż inne dialekty Lisp, co przybliża go do serca entuzjastów języka funkcjonalnego.

Scala jest w pełni obiektowym językiem, bardziej niż Java, z jednym z najbardziej zaawansowanych systemów typów dostępnych w językach innych niż badawcze, a na pewno najbardziej zaawansowanym systemem typów w JVM. Łączy także wiele pojęć i funkcji języków funkcjonalnych, bez uszczerbku dla orientacji obiektu, ale jego kompromis w zakresie cech języka funkcjonalnego zniechęca niektórych entuzjastów tego ostatniego.

Groovy ma dobrą akceptację i popularny framework internetowy w Grails. Obsługuje także system budowania Gradle, który staje się popularną alternatywą dla Maven. Osobiście uważam, że jest to język o ograniczonej użyteczności, szczególnie gdy Jython i JRuby zaczynają robić inwazję na ziemi JVM w porównaniu do innych.

Clojure, nawet pomijając niektóre bardzo interesujące funkcje, ma silny urok tylko dlatego, że jest dialektem Lisp na JVM. To może ograniczać jego popularność, oczywiście, ale spodziewam się, że przez długi czas będzie miała wokół siebie lojalną społeczność.

Scala może konkurować bezpośrednio z Javą i dać jej szansę na prawie wszystkie aspekty. Oczywiście nie może obecnie konkurować pod względem popularności, a brak silnego wsparcia korporacyjnego może utrudniać jego akceptację w środowiskach korporacyjnych. Jest to również język o wiele bardziej dynamiczny niż Java, w sensie ewolucji języka. Z perspektywy języka to dobra rzecz. Z perspektywy użytkowników, którzy planują mieć tysiące wierszy kodu w nim zapisanych, nie tak.

Ostatecznie ujawniam, że bardzo dobrze znam Scalę i tylko dwie pozostałe.

Daniel C. Sobral
źródło
1
Niezłe. Chociaż muszę powiedzieć, że Scala ma wsparcie korporacyjne Lightbend i jest używane przez wielkie nazwiska, takie jak LinkedIn, Twitter, Spark i wiele banków. Tam, gdzie pracuję, mamy bazę kodów 11 milionów linii Scali, co nie jest dobrym pomysłem, ale działa.
Joan
219

Scala

Scala wyewoluowała z czysto funkcjonalnego języka znanego jako Funnel i reprezentuje czystą implementację prawie całej składni Javy, różniącą się tylko tam, gdzie można wprowadzić wyraźną poprawę lub gdzie zagroziłaby funkcjonalnej naturze języka. Do takich różnic należą obiekty singletonowe zamiast metod statycznych i wnioskowanie o typie.

Wiele z nich opierało się na wcześniejszej pracy Martina Oderskiego z językiem Pizza . Integracja OO / FP wykracza daleko poza zwykłe zamykanie i doprowadziła do tego, że język został opisany jako postfunkcyjny.

Mimo to jest pod wieloma względami najbliższa Javie. Głównie ze względu na połączenie obsługi OO i pisania statycznego, ale także ze względu na wyraźny cel w projekcie języka, który powinien być bardzo ściśle zintegrowany z Javą.

Groovy

Groovy wyraźnie zajmuje się dwiema największymi krytykami Javy

  • są dynamicznie wpisywane, co usuwa wiele płyt kotłowych i
  • dodawanie zamknięć do języka.

Być może jest on syntaktycznie najbliższy Javie, nie oferuje niektórych bogatszych konstruktów funkcjonalnych, które zapewniają Clojure i Scala, ale wciąż oferuje zdecydowane ulepszenia ewolucyjne - szczególnie w przypadku pisania programów skryptowych.

Groovy ma najsilniejsze wsparcie handlowe z tych trzech języków, głównie poprzez springsource.

Clojure

Clojure to funkcjonalny język w rodzinie LISP, jest także dynamicznie wpisywany.

Funkcje takie jak obsługa STM zapewniają jedne z najlepszych gotowych rozwiązań do współbieżności, podczas gdy Scala wymaga biblioteki innej firmy, takiej jak Akka, aby to powielić.

Składniowo jest to także najdalszy z trzech języków od typowego kodu Java.

Muszę też ujawnić, że najbardziej znam Scalę :)

Kevin Wright
źródło
11
Nigdy wcześniej nie słyszałem o tym języku ścieżki. Dzięki za wypełnienie małej luki w zapisie historycznym.
Randall Schulz,
8
Naprawdę nie można nazwać Clojure czysto funkcjonalnym językiem. Z pewnością można napisać kod imperatywny.
dbyrne,
2
Scala ma wbudowaną bibliotekę Akka dla współbieżności opartej na aktorach. To już nie jest zależność innej firmy.
Scott M Gardner
2
@Orubel W bajtecode klasa scala jest identyczna z równoważną klasą Java - typami i wszystkimi innymi. Na przykład cały interfejs API języka Akka Java jest napisany w języku Scala. Wyjaśnij więc, co rozumiesz przez „nie można zintegrować” tutaj, ponieważ dla mnie brzmi to jak FUD.
Kevin Wright
3
Podsumowując ten dokument: „Funkcji Scala, które nie istnieją w Javie, nie można bezpośrednio używać w Javie”. Jednak ... członkowie typu abstrakcyjnego i typy wyższego rodzaju są dość zaawansowanymi funkcjami, których z pewnością nie musisz używać! Java również nie może używać metod bez parametrów, konstruktorów lub modułów rozszerzeń Groovy, przez co Groovy jest „nie ściśle zintegrowany” według twojej własnej definicji.
Kevin Wright,
68

Nigdy nie miałem czasu na zabawę clojure. Ale dla Scali kontra Groovy są to słowa Jamesa Strachana - Groovy Creator

„Chociaż moją wskazówką dotyczącą długoterminowej wymiany javaca jest Scala. Jestem pod wielkim wrażeniem! Mogę szczerze powiedzieć, że ktoś pokazał mi książkę o programowaniu w Scali autorstwa Martina Odersky'ego, Lexa Spoon i Billa Vennersa w 2003 r. I prawdopodobnie nigdy nie stworzyłbym Groovy. ”

Możesz przeczytać całą historię tutaj

Thai Tran
źródło
72
Należy wspomnieć, że to stwierdzenie nie mówi, że Scala jest lepszy niż Groovy. James jest również znany z tego, że powiedziałby, że gdyby wiedział, jak trudno jest stworzyć język, nigdy by go nie stworzył. Patrząc w tym kontekście, jasne jest, dlaczego nie rozwinąłby Groovy'ego. I odważę się powiedzieć, że dał wiele dobrych pomysłów, ale nie jest twórcą obecnego Groovy. opuścił projekt na długo przed 1.0 w 2007 roku i od tego czasu nie brał udziału. W projekcie jest co najmniej tyle samo, co z nim.
blackdrag
31
Biorąc pod uwagę, że James Strachan aktywnie pracuje nad językiem Kotlin, Scala najwyraźniej nie jest dla niego imponujący.
bdkosher
6
@bdkosher pracuje nad tym, ponieważ Scala jest zbyt imponująca dla większości programistów… i [co ważniejsze] w niektórych miejscach też jest zbyt skomplikowana
Nazwa wyświetlana
30

Można je rozróżnić w zależności od tego, skąd pochodzą lub do których programistów są głównie kierowani.

Groovy jest trochę jak skryptowa wersja Java. Długo programiści Java czują się jak w domu, budując zwinne aplikacje wspierane przez duże architektury. Groovy on Grails jest, jak sama nazwa wskazuje, podobny do frameworka Rails. Dla osób, które nie chcą cały czas zawracać sobie głowy gadatliwością Javy.

Scala jest zorientowanym obiektowo i funkcjonalnym językiem programowania, a programiści Ruby lub Python mogą się do tego zbliżyć. Wykorzystuje całkiem sporo wspólnych dobrych pomysłów znalezionych w tych językach programowania.

Clojure jest dialektem języka programowania Lisp, więc programiści Lisp, Scheme lub Haskell mogą czuć się jak w domu podczas rozwijania tego języka.

Mehmet Duran
źródło
24
Scala nie jest tak naprawdę funkcjonalnym językiem programowania. Jest to najpierw obiektowy język programowania z funkcjami.
Daniel C. Sobral
16
Muszę powiedzieć, że ta odpowiedź jest jak strzał w ciemność. Myślę, że można by uzasadnić, że Python jest bliżej Groovy niż Scali, a Ruby (moim zdaniem) nie jest zbyt blisko żadnego z powyższych, być może najbliżej Groovy. Haskell nie jest zbyt podobny do (Common) Lisp lub Scheme (a zatem nie bardzo podobny do Clojure). Dla mnie ta odpowiedź brzmi (w najlepszym razie!) W stylu „ja też nie wiem, pozwól mi, że Wikipedia to dla ciebie”.
John Y
21
Scala jest językiem imperatywnym z niektórymi funkcjami. Jeśli ludzie będą nadal nazywać język funkcjonalny, gdy tylko zacznie przyjmować idiomy ze świata funkcjonalnego, termin ten stanie się kolejnym terminem marketingowym. Równie dobrze może zacząć nazywać C ++ funkcjonalny i imperatyw Haskella.
jon-hanson
9
@alanlcode Odersky może powiedzieć, co chce. Scala nie ma żadnego systemu izolowania skutków ubocznych, domyślnie nie jest leniwy i nie traktuje kodu jako danych - traktuje wywołania funkcji jak dane, co jest inne. Są to duże problemy, jeśli chcesz być w pełni funkcjonalny. Z drugiej strony Scala robi wszystko, aby upewnić się, że jego model obiektu nie jest wadliwy. Uwielbiam Scalę, ale to wyraźnie funkcjonalna sekunda.
Daniel C. Sobral
7
Z drugiej strony rodzina języków ML jest uznawana za funkcjonalną, ale jest ścisła i pozwala na efekty uboczne / kod imperatywny.
GClaramunt
8

Czytam książkę Pragmatic Programmers „Groovy Recipes: Greasing the wheel of Java” Scott Davis, Copyright 2008 i wydrukowaną w kwietniu tego samego roku.

To trochę nieaktualne, ale książka wyjaśnia, że ​​Groovy jest dosłownie rozszerzeniem Java. Mogę napisać kod Java, który działa dokładnie jak Java i zmienić nazwę pliku * .groovy i działa dobrze. Według książki odwrotność jest prawdą, jeśli dołączę wymagane biblioteki. Jak dotąd eksperymenty wydają się to potwierdzać.

Jim Collings
źródło
To najlepsza książka do nauki Groovy.
topr
Prawdopodobnie ważne jest, aby pamiętać, że nie cały kod zachowuje się dokładnie tak samo. Niektóre z tych różnic obejmują sposób, w jaki Groovy rozumie pojedyncze i podwójne cudzysłowy oraz jego preferencje dla boksu zamiast poszerzania. Jednak większość kodu będzie działać tak samo.
Ontonator
4

Oczywiście składnia jest zupełnie inna (Groovy jest najbliższy Javie), ale przypuszczam, że nie o to prosisz.

Jeśli jesteś zainteresowany wykorzystaniem ich do skryptowania aplikacji Java, Scala prawdopodobnie nie jest dobrym wyborem, ponieważ nie ma łatwego sposobu oceny jej z Java, podczas gdy Groovy jest szczególnie odpowiedni do tego celu.

Thilo
źródło
Nie rozumiem, o co ci chodzi z użyciem Scali do pisania skryptów w Javie. Z pewnością możesz napisać skrypt Scala, który steruje kodem Java; nie evalwymagane
Daniel Yankowsky
2
@ Daniel, zobacz pytanie o używanie Scali do skryptów, które połączyłem. Przyjęta odpowiedź brzmi, że brak funkcji „eval” i obsługi skryptów javax.scripting sprawia, że ​​trudniej jest używać Scali do pisania skryptów w aplikacji Java, niż jest to, powiedzmy, Groovy.
Thilo,