Her ikisi de JVM için lambdalar ve kapanışları olan ve Java ile birlikte çalışan nesne yönelimli dillerdir. Bunun dışında son derece farklılar.
Groovy, yalnızca dinamik olarak yazılmış olması değil, aynı zamanda dinamik meta programlamayı desteklemesi anlamında da "dinamik" bir dildir.
Scala, statik olarak yazılmış olması ve Java'da yapabileceğiniz garip şeylerin dışında neredeyse hiçbir dinamik meta programlamaya sahip olmaması nedeniyle "statik" bir dildir. Scala'nın statik tip sistemi, Java'nınkinden önemli ölçüde daha düzgün ve karmaşıktır.
Groovy, sözdizimsel olarak Java'dan etkilenir, ancak anlamsal olarak Ruby gibi dillerden daha fazla etkilenir.
Scala sözdizimsel olarak hem Ruby hem de Java'dan etkilenir. Java, SML, Haskell ve gBeta adı verilen çok belirsiz bir OO dilinden anlamsal olarak daha fazla etkilenir.
Groovy, Java'nın aşırı yüklemesini işleme biçimi nedeniyle "yanlışlıkla" birden çok gönderime sahip.
Scala yalnızca tek gönderimdir, ancak birden çok gönderimin ele alması gereken aynı türden bazı sorunların üstesinden gelmek için SML'den esinlenen desen eşleştirmesine sahiptir. Bununla birlikte, birden çok gönderimin yalnızca çalışma zamanı türünde gönderilebildiği durumlarda, Scala'nın desen eşleştirmesi çalışma zamanı türleri, değerleri veya her ikisini birden gönderebilir. Desen eşleştirme ayrıca sözdizimsel olarak hoş değişken bağlamayı içerir. Bu tek özelliğin tek başına Scala'da programlamayı ne kadar hoş hale getirdiğini vurgulamak zor.
Hem Scala hem de Groovy, mixin'lerle çoklu kalıtım biçimini destekler (Scala bunları özellikler olarak adlandırsa da).
Scala, hem kısmi işlev uygulamasını hem de dil düzeyinde currying'i destekler, Groovy, kısmi işlev uygulaması yapmak için garip bir "curry" yöntemine sahiptir.
Scala, doğrudan kuyruk özyineleme optimizasyonu yapar. Groovy'nin yaptığına inanmıyorum. Bu, işlevsel programlamada önemlidir, ancak zorunlu programlamada daha az önemlidir.
Hem Scala hem de Groovy, varsayılan olarak hevesle değerlendirilir. Ancak Scala, ada göre arama parametrelerini destekler. Groovy yapmaz - isme göre çağrı kapanışlarla öykünmelidir.
Scala, diğer dillerde bulunan liste anlamalarının bir genellemesi olan "kavramalar için" ye sahiptir (teknik olarak bunlar monad anlamalar ve biraz - Haskell'in do ve C # LINQ arasında bir yerde).
Scala'nın "statik" alanlar, iç sınıflar, yöntemler vb. Kavramı yoktur - bunun yerine tek nesneler kullanır. Groovy, statik kavramı kullanır.
Scala, Groovy'nin yaptığı gibi yerleşik aritmetik operatör seçimine sahip değildir. Scala'da yöntemleri çok esnek bir şekilde adlandırabilirsiniz.
Groovy, null ile başa çıkmak için elvis operatörüne sahiptir. Scala programcıları null kullanmak yerine Seçenek türlerini kullanmayı tercih ederler, ancak isterseniz Scala'da bir elvis operatörü yazmak kolaydır.
Son olarak, yalanlar var, lanet olası yalanlar var ve sonra ölçütler var. Bilgisayar dili kıyaslama oyunu Scala'yı Groovy'den önemli ölçüde daha hızlı (iki kattan 93 kat daha hızlı) olarak derecelendirirken, kabaca aynı kaynak boyutunu koruyor. kıyaslamalar .
Eminim ele almadığım pek çok farklılık vardır. Ama umarım bu size bir fikir verir.
Aralarında bir rekabet var mı? Evet, elbette, ama düşündüğünüz kadar değil. Groovy'nin gerçek rakibi JRuby ve Jython.
Kim kazanacak? Kristal kürem de herkes kadar çatlak.