Scala vs. Groovy vs. Clojure [chiuso]


676

Qualcuno può spiegare le principali differenze tra Scala, Groovy e Clojure. Conosco ognuna di queste compilazioni da eseguire sulla JVM ma vorrei un semplice confronto tra di loro.

Risposte:


873

Groovy è un linguaggio tipizzato in modo dinamico, la cui sintassi è molto simile a Java, con una serie di miglioramenti alla sintassi che consentono un codice più leggero e meno plate. Può funzionare attraverso un interprete oltre ad essere compilato, il che lo rende utile per la prototipazione rapida, gli script e l'apprendimento di linguaggi dinamici senza dover imparare una nuova sintassi (supponendo che tu sappia Java). A partire da Groovy 2.0, ha anche un supporto crescente per la compilazione statica . Groovy supporta le chiusure e supporta la programmazione in uno stile un po 'funzionale, sebbene sia ancora abbastanza lontano dalla definizione tradizionale di programmazione funzionale.

Clojure è un dialetto di Lisp con alcune funzionalità avanzate come la memoria transazionale del software . Se ti piace Lisp e desideri utilizzare qualcosa di simile nell'ambito della JVM, Clojure è per te. È forse il linguaggio più funzionale in esecuzione su JVM, e sicuramente il più famoso. Inoltre, ha un'enfasi maggiore sull'immutabilità rispetto agli altri dialetti Lisp, che lo avvicina al cuore degli appassionati di linguaggio funzionale.

Scala è un linguaggio completamente orientato agli oggetti, più che Java, con uno dei sistemi di tipi più avanzati disponibili su linguaggi non di ricerca, e sicuramente il sistema di tipi più avanzato sulla JVM. Combina anche molti concetti e caratteristiche dei linguaggi funzionali, senza compromettere l'orientamento agli oggetti, ma il suo compromesso sulle caratteristiche del linguaggio funzionale rimanda alcuni appassionati di questi ultimi.

Groovy ha una buona accettazione e un popolare framework web in Grails. Alimenta anche il sistema di costruzione Gradle, che sta diventando una popolare alternativa a Maven. Personalmente penso che sia un linguaggio con utilità limitata, in particolare quando Jython e JRuby iniziano a farsi strada nella terra della JVM, rispetto agli altri.

Clojure, pur scontando alcune caratteristiche molto interessanti, ha un forte richiamo solo essendo un dialetto Lisp su JVM. Potrebbe limitare la sua popolarità, scontato, ma mi aspetto che avrà una comunità fedele intorno per molto tempo.

Scala può competere direttamente con Java e dargli una corsa per i suoi soldi su quasi tutti gli aspetti. Non può competere in popolarità al momento, ovviamente, e la mancanza di un forte sostegno aziendale può ostacolare la sua accettazione negli ambienti aziendali. È anche un linguaggio molto più dinamico di Java, nel senso di come il linguaggio si evolve. Dal punto di vista della lingua, questa è una buona cosa. Dal punto di vista degli utenti che intendono avere migliaia di righe di codice scritte al suo interno, non così.

Come ultima rivelazione, conosco molto bene Scala e conosco solo gli altri due.


1
Ben fatto. Anche se devo dire che Scala ha il supporto aziendale di Lightbend ed è utilizzato da grandi nomi come LinkedIn, Twitter, Spark e molte banche. Dove lavoro, abbiamo una base di codice di 11 milioni di righe di Scala, che non è una buona idea ma funziona.
Joan

219

Scala

Scala si è evoluto da un linguaggio funzionale puro noto come Funnel e rappresenta un'implementazione in clean room di quasi tutta la sintassi di Java, differendo solo dove si potrebbe apportare un chiaro miglioramento o dove comprometterebbe la natura funzionale del linguaggio. Tali differenze includono oggetti singleton invece di metodi statici e inferenza di tipo.

Gran parte di questo era basato sul precedente lavoro di Martin Odersky con il linguaggio della pizza . L'integrazione OO / FP va ben oltre le semplici chiusure e ha portato al linguaggio descritto come post-funzionale.

Nonostante ciò, è il più vicino a Java in molti modi. Principalmente a causa di una combinazione di supporto OO e tipizzazione statica, ma anche a causa di un obiettivo esplicito nella progettazione del linguaggio che dovrebbe integrarsi molto strettamente con Java.

Groovy

Groovy affronta esplicitamente due delle maggiori critiche di Java di

  • essendo dinamicamente digitato, che rimuove molta caldaia e
  • aggiungendo chiusure alla lingua.

È forse sintatticamente più vicino a Java, non offre alcuni dei costrutti funzionali più ricchi forniti da Clojure e Scala, ma offre comunque un netto miglioramento evolutivo, specialmente per la scrittura di programmi di sceneggiatura.

Groovy ha il più forte supporto commerciale delle tre lingue, principalmente via fonte.

Clojure

Clojure è un linguaggio funzionale nella famiglia LISP, inoltre è tipizzato in modo dinamico.

Funzionalità come il supporto STM offrono alcuni dei migliori supporti di concorrenza pronti all'uso, mentre Scala richiede una libreria di terze parti come Akka per duplicare questo.

Sintatticamente, è anche la più lontana delle tre lingue dal tipico codice Java.

Devo anche rivelare di conoscere meglio Scala :)


11
Non avevo mai sentito parlare di questo linguaggio dell'imbuto prima d'ora. Grazie per colmare un piccolo vuoto nel record storico.
Randall Schulz,

8
Non puoi davvero chiamare Clojure un linguaggio puramente funzionale. È certamente possibile scrivere un codice imperativo.
dbyrne,

2
Scala ha costruito nella libreria Akka per la concorrenza basata sugli attori. Non è più una dipendenza di terze parti.
Scott Gardner

2
@Orubel Nel bytecode, una classe scala è identica alla classe Java equivalente - tipi e tutto. Ad esempio, l'intera API Java di Akka è scritta in Scala. Quindi, per favore, spiega cosa intendi per "impossibile integrare" qui, perché mi sembra FUD.
Kevin Wright,

3
Per riassumere quel documento: "Le funzionalità di Scala che non esistono in Java non possono essere utilizzate direttamente in Java". Tuttavia ... i membri di tipo astratto e i tipi di tipo superiore sono funzioni abbastanza avanzate che sicuramente non sei costretto a usare! Inoltre, Java non può utilizzare metodi senza parametri, builder o moduli di estensione di Groovy, rendendo così Groovy "non strettamente integrato" secondo la propria definizione.
Kevin Wright,

68

Non ho mai avuto il tempo di giocare con il clojure. Ma per scala vs groovy, queste sono le parole di James Strachan - creatore di Groovy

"Anche se il mio consiglio per la sostituzione a lungo termine di javac è Scala. Ne sono rimasto molto colpito! Posso dire onestamente se qualcuno mi avesse mostrato il libro Programmazione in Scala di Martin Odersky, Lex Spoon e Bill Venners nel 2003 I probabilmente non avrebbe mai creato Groovy. "

Puoi leggere l'intera storia qui


72
Va detto che questa affermazione non sta dicendo che Scala è meglio di Groovy. James è anche noto per aver detto che se avesse saputo quanti problemi creare una lingua non ne avrebbe mai creata una. Visto in questo contesto, è chiaro perché non avrebbe sviluppato Groovy, ovviamente. E oso dire che ha dato molte buone idee, ma non è il creatore dell'attuale Groovy. ha lasciato il progetto molto prima dell'1.0 nel 2007 e da allora non ha più partecipato. C'è almeno tanto senza di lui nel progetto come c'era con lui.
blackdrag

31
E dato che James Strachan sta lavorando attivamente sul linguaggio Kotlin, Scala apparentemente non è abbastanza impressionante per lui.
bdkosher,

6
@bdkosher ci sta lavorando perché Scala è troppo impressionante per la maggior parte dei programmatori ... e [cosa ancora più importante], anche in alcuni punti troppo complicata
Visualizza nome

30

Possono essere differenziati da dove provengono o quali sviluppatori stanno prendendo di mira principalmente.

Groovy è un po 'come la versione di scripting di Java. I programmatori Java da molto tempo si sentono a casa durante la creazione di applicazioni agili supportate da grandi architetture. Groovy on Grails è, come suggerisce il nome simile al framework Rails. Per le persone che non vogliono preoccuparsi sempre della verbosità di Java.

Scala è un linguaggio di programmazione orientato agli oggetti e funzionale e i programmatori Ruby o Python potrebbero sentirsi più vicini a questo. Impiega molte buone idee comuni che si trovano in questi linguaggi di programmazione.

Clojure è un dialetto del linguaggio di programmazione Lisp, quindi gli sviluppatori Lisp, Scheme o Haskell possono sentirsi a casa durante lo sviluppo con questo linguaggio.


24
Scala non è in realtà un linguaggio di programmazione funzionale. È innanzitutto un linguaggio di programmazione orientato agli oggetti, con caratteristiche funzionali.
Daniel C. Sobral,

16
Devo dire che questa risposta sembra molto simile a uno sparo nel buio. Penso che si possa sostenere che Python è più vicino a Groovy che a Scala, e Ruby (secondo me) non è troppo vicino a nessuno dei precedenti, forse più vicino a Groovy. Haskell non è molto simile a (Common) Lisp o Scheme (e quindi non molto simile a Clojure). Per me, questa risposta sembra (nella migliore delle ipotesi!) Come "Neanche io lo so, lasciami Wikipedia per te".
John Y,

21
Scala è un linguaggio imperativo con alcune caratteristiche funzionali. Se le persone continuano a chiamare un linguaggio funzionale non appena adotta idiomi dal mondo funzionale, il termine diventerà solo un altro termine di marketing. Potrebbe anche iniziare a chiamare C ++ funzionale e imperativo di Haskell.
Jon-Hanson,

9
@alanlcode Odersky può dire quello che vuole. Scala non ha alcun sistema per isolare gli effetti collaterali, non è pigro per impostazione predefinita e non tratta il codice come dati - tratta le chiamate di funzione come dati, il che è diverso. Questi sono grandi problemi se vuoi essere pienamente funzionale. D'altra parte, Scala fa tutto il possibile per garantire che il suo modello a oggetti non sia difettoso. Adoro Scala, ma è chiaramente il secondo funzionale.
Daniel C. Sobral,

7
D'altra parte, la famiglia di lingue ML è riconosciuta come funzionale ma è rigorosa e consente effetti collaterali / codice imperativo.
GClaramunt,

8

Sto leggendo il libro dei programmatori pragmatici "Groovy Recipes: Greasing the wheels of Java" di Scott Davis, Copyright 2008 e stampato nell'aprile dello stesso anno.

È un po 'obsoleto ma il libro chiarisce che Groovy è letteralmente un'estensione di Java. Posso scrivere codice Java che funziona esattamente come Java e rinominare il file * .groovy e funziona benissimo. Secondo il libro, è vero il contrario se includo le librerie necessarie. Finora, la sperimentazione sembra confermarlo.


Questo è il miglior libro per imparare Groovy.
TOPR

È probabilmente importante notare che non tutto il codice si comporterà esattamente allo stesso modo. Alcune di queste differenze includono il modo in cui Groovy comprende le virgolette singole e doppie e la sua preferenza per la boxe rispetto all'ampliamento. Tuttavia, la maggior parte del codice funzionerà allo stesso modo.
Ontonator,

4

Ovviamente, la sintassi è completamente diversa (Groovy è il più vicino a Java), ma suppongo che non sia quello che stai chiedendo.

Se sei interessato a usarli per eseguire lo script di un'applicazione Java, Scala non è probabilmente una buona scelta, in quanto non esiste un modo semplice per valutarlo da Java, mentre Groovy è particolarmente adatto a tale scopo.


Non capisco il tuo punto sull'uso di Scala per lo script Java. Puoi sicuramente scrivere uno script Scala che guida il codice Java; non evalrichiesto.
Daniel Yankowsky il

2
@Daniel, vedi la domanda sull'uso di Scala per gli script che ho collegato. La risposta accettata è che la mancanza di una funzione "eval" e del supporto javax.scripting rende più complicato l'uso di Scala per lo scripting di un'applicazione Java rispetto a Groovy.
Thilo,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.