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.