Quali sono le differenze chiave tra Scala e Groovy? [chiuso]


128

In apparenza Groovy e Scala sembrano abbastanza simili, a parte Scala che è staticamente digitata e Groovy dinamico.

  • Quali sono le altre differenze chiave e quali vantaggi hanno ciascuno rispetto all'altro?
  • Quanto sono simili davvero?
  • C'è competizione tra i due?
    • In tal caso, chi pensi vincerà a lungo termine?

Groovy 2.0 include anche la digitazione statica: infoq.com/articles/new-groovy-20
HDave

Risposte:


230

Sono entrambi linguaggi orientati agli oggetti per la JVM che hanno lambda e chiusure e interagiscono con Java. Oltre a ciò, sono estremamente diversi.

Groovy è un linguaggio "dinamico" non solo nel senso che è tipizzato in modo dinamico ma che supporta la meta-programmazione dinamica.

Scala è un linguaggio "statico" in quanto è tipizzato staticamente e non ha praticamente alcuna meta-programmazione dinamica oltre alle cose scomode che puoi fare in Java. Nota, il sistema di tipo statico di Scala è sostanzialmente più uniforme e sofisticato di quello di Java.

Groovy è influenzato sintatticamente da Java ma semanticamente influenzato da linguaggi come Ruby.

Scala è sintatticamente influenzato sia da Ruby che da Java. È semanticamente influenzato maggiormente da Java, SML, Haskell e da un linguaggio OO molto oscuro chiamato gBeta.

Groovy ha un invio multiplo "accidentale" dovuto al modo in cui gestisce il sovraccarico Java.

Scala è solo spedizione singola, ma ha una corrispondenza dei modelli ispirata a SML per affrontare alcuni degli stessi tipi di problemi che la spedizione multipla è destinata a gestire. Tuttavia, dove la spedizione multipla può essere spedita solo su un tipo di runtime, la corrispondenza dei modelli di Scala può essere inviata su tipi, valori o entrambi di runtime. La corrispondenza del modello include anche la rilegatura variabile sintatticamente piacevole. È difficile sopravvalutare quanto sia piacevole questa sola funzione che rende la programmazione alla Scala.

Sia Scala che Groovy supportano una forma di eredità multipla con i mixin (anche se Scala li chiama tratti).

Scala supporta sia l'applicazione di funzioni parziali sia il curry a livello linguistico, Groovy ha un metodo "curry" scomodo per fare un'applicazione di funzioni parziali.

Scala dirige l'ottimizzazione della ricorsione della coda. Non credo che Groovy lo faccia. Questo è importante nella programmazione funzionale ma meno importante nella programmazione imperativa.

Sia Scala che Groovy sono valutati con entusiasmo per impostazione predefinita. Tuttavia, Scala supporta i parametri di chiamata per nome. Groovy no: la chiamata per nome deve essere emulata con chiusure.

Scala ha "per le comprensioni", una generalizzazione delle comprensioni di elenchi trovate in altre lingue (tecnicamente sono comprensioni di monade più un po '- da qualche parte tra il fare di Haskell e il LINQ di C #).

Scala non ha il concetto di campi "statici", classi interne, metodi, ecc. - usa invece oggetti singleton. Groovy usa il concetto statico.

Scala non ha incorporato una selezione di operatori aritmetici esattamente come Groovy. In Scala puoi nominare i metodi in modo molto flessibile.

Groovy ha l'operatore elvis per gestire null. I programmatori Scala preferiscono usare i tipi di Opzione per usare null, ma è facile scrivere un operatore elvis in Scala se lo si desidera.

Infine, ci sono bugie, ci sono dannatamente bugie e poi ci sono parametri di riferimento. Il gioco di benchmark in linguaggio informatico classifica Scala come sostanzialmente più veloce di Groovy (che va da due volte a 93 volte più veloce) pur mantenendo all'incirca le stesse dimensioni della fonte. parametri di riferimento .

Sono sicuro che ci sono molte, molte differenze che non ho coperto. Ma spero che questo ti dia un'idea.

C'è una competizione tra loro? Sì, certo, ma non tanto quanto potresti pensare. La vera competizione di Groovy è JRuby e Jython.

Chi vincerà? La mia sfera di cristallo è rotta come quella di chiunque altro.


21
sarebbe una vittoria per entrambi se si riuscisse a convincere le università a iniziare a insegnare queste lingue invece che solo java =)
Chii

13
L'immutabilità non è una caratteristica chiave di Scala? Che dire di concorrenza e attori? Dicci qualcosa in più ...
Leonel,

4
Se c'è competizione sarebbe con Clojure, ma Clojure non è interessato alla competizione.
Rayne,

2
Dato che Scala utilizza lo stesso metodo di invio con metodo statico di java (che l'hotspot può facilmente incorporare) e groovy esegue un metodo dinamico, sarà davvero difficile per Groovy avvicinarsi alle prestazioni di Scala. In particolare con @specialized per ottimizzare l'autoboxing di java, Scala può essere più veloce di java a volte. Tuttavia, il caso d'uso di Groovy è simile all'utilizzo di Ruby / Python - è per un linguaggio di scripting tipizzato dinamicamente di facile utilizzo in cui le prestazioni non sono in genere un grosso problema. ad esempio, molti framework Groovy contengono un sacco di codice Java per le prestazioni (come Grails)
James Strachan,

4
Poiché questa risposta ha così tanti voti, c'è una parte che vorrei correggere. È giusto che i metodi multipli basati sull'eredità in Groovy siano iniziati come incidenti, ma in una Conferenza degli sviluppatori Groovy, che includeva James e che era molto prima che Groovy 1.0 decidessimo di mantenerlo. Non sarebbe stato difficile cambiarlo. Anche per aggiungere a ciò che James ha scritto ... invokedynamic ha abbattuto quella barriera di cui sta parlando
blackdrag

12

Scala è destinata ad essere un / linguaggio ibrido funzionale oo ed è molto ben pianificato e progettato. groovy è più simile a una serie di miglioramenti che molte persone vorrebbero usare in Java. ho dato un'occhiata più da vicino ad entrambi, così posso dirlo :)

nessuno dei due è migliore o peggiore dell'altro. groovy è molto bravo in meta-programmazione, scala è molto bravo in tutto ciò che non ha bisogno di meta-programmazione, quindi ... tendo ad usare entrambi.



7

Hai colpito l'unghia sulla testa con la digitazione statica e dinamica. Entrambi fanno parte della nuova generazione di linguaggi dinamici, con chiusure, espressioni lambda e così via. Ci sono anche alcune differenze sintattiche tra i due, ma funzionalmente non vedo un'enorme differenza tra Groovy e Scala.

Scala implementa gli elenchi in modo leggermente diverso; in Groovy, praticamente tutto è un'istanza di java.util.List, mentre Scala utilizza sia Elenchi che array primitivi. Groovy ha (penso) una migliore interpolazione delle stringhe.

Scala è più veloce, a quanto pare, ma la gente di Groovy sta davvero spingendo le prestazioni per la versione 2.0. 1.6 ha fatto un enorme balzo in avanti rispetto alla serie 1.5.

Non penso che nessuna delle due lingue "vincerà", poiché si rivolgono a due diverse classi di problemi. Scala è un linguaggio ad alte prestazioni che è molto simile a Java senza avere lo stesso livello di boilerplate di Java. Groovy è per la prototipazione e lo sviluppo rapidi, dove la velocità è meno importante del tempo impiegato dai programmatori per implementare il codice.


3
"Groovy è per prototipazione e sviluppo rapidi" - questo suggerisce che Groovy non è adatto per l'uso in produzione con cui non sarei d'accordo. Ci sono molti siti Grails in uso nella produzione, ad esempio
Dónal,

10
Scala non è un linguaggio dinamico.
John Oxley,

2
"Groovy ha (penso) una migliore interpolazione delle stringhe." - con Scala-2.10.0 questo non è più vero (Scala ha un'interpolazione di stringhe interessante).
VasiliNovikov

5

Scala ha una curva di apprendimento molto più ripida di Groovy. Scala ha molto più supporto per la programmazione funzionale con il suo abbinamento di schemi e la ricorsione basata sulla coda, il che significa più strumenti per FP puro.


0

Scala ha anche una compilation dynamica e l'ho fatto usando twitter eval lib ( https://github.com/twitter/util ). Ho mantenuto il codice scala in un file flat (senza alcuna estensione) e usando eval creato scala class in fase di esecuzione. Direi che scala è una meta-programmazione e ha una caratteristica di complicazione dinamica

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.