Scala ve Groovy arasındaki temel farklar nelerdir? [kapalı]


128

Yüzeyde Groovy ve Scala, Scala'nın statik olarak yazılması ve Groovy dinamik dışında oldukça benzer görünüyor.

  • Diğer önemli farklılıklar ve her birinin diğerine göre avantajları nelerdir?
  • Gerçekten ne kadar benzerler?
  • İkisi arasında rekabet var mı?
    • Eğer öyleyse, uzun vadede kimin kazanacağını düşünüyorsunuz?

Groovy 2.0 ayrıca statik yazmayı da içerir: infoq.com/articles/new-groovy-20
HDave

Yanıtlar:


230

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.


21
Üniversitelerin sadece java yerine bu dilleri öğretmeye başlaması her ikisi için de bir kazanç olacaktır =)
Chii

13
Değişmezlik, Scala'nın temel bir özelliği değil mi? Eşzamanlılık ve aktörler ne olacak? Bize biraz daha anlatın ...
Leonel

4
Herhangi bir rekabet varsa, Clojure ile olur, ancak Clojure rekabetle ilgilenmez.
Rayne

2
Scala'nın java ile aynı statik tipte yöntem gönderimini kullandığı (ki bu sıcak nokta kolayca satır içi olabilir) ve groovy'nin dinamik yöntem gönderdiği göz önüne alındığında, Groovy'nin Scala'nın performansına yaklaşması gerçekten zor olacaktır. Özellikle java'nın otomatik kutulamasını optimize etmek için @specialised ile Scala, bazen java'dan daha hızlı olabilir. Bununla birlikte, Groovy'nin kullanım durumu Ruby / Python kullanmaya benzer - bu, performansın genellikle o kadar da önemli olmadığı dinamik olarak yazılmış bir komut dosyası yazma dili içindir. Örneğin, birçok Groovy çerçevesi performans için bir ton Java kodu içerir (Grails gibi)
James Strachan

4
Bu cevabın çok fazla oyu olduğu için düzeltmek istediğim bir kısım var. Groovy'de kalıtım temelli çoklu yöntemlerin bir kaza olarak başladığı doğrudur, ancak James'in de dahil olduğu ve Groovy 1.0'dan çok önce yapılan bir Groovy Geliştiriciler Konferansı'nda bunu korumaya karar verdik. Bunu değiştirmek zor olmazdı. Ayrıca James'in yazdıklarına eklemek için ... invokedynamic, bahsettiği engeli
kaldırdı

12

scala, bir oo / fonksiyonel hibrit dil olması anlamına gelir ve çok iyi planlanmış ve tasarlanmıştır. groovy, daha çok birçok insanın java'da kullanmak isteyeceği bir dizi geliştirme gibidir. ikisine de yakından baktım, böylece anlayabilirim :)

hiçbiri diğerinden daha iyi ya da daha kötü değil. groovy meta programlamada çok iyidir, scala meta programlamaya ihtiyaç duymayan her şeyde çok iyidir, bu yüzden ... ikisini de kullanma eğilimindeyim.



7

Statik ve dinamik yazımla kafanıza çivi çarptınız. Her ikisi de yeni nesil dinamik dillerin bir parçasıdır; kapanışlar, lambda ifadeleri vb. İkisi arasında da bir avuç sözdizimsel farklılık var, ancak işlevsel olarak Groovy ve Scala arasında çok büyük bir fark görmüyorum.

Scala Listeleri biraz farklı bir şekilde uygular; Groovy'de hemen hemen her şey java.util.List'in bir örneğidir, oysa Scala hem Listeleri hem de ilkel dizileri kullanır. Groovy'nin (bence) daha iyi dize enterpolasyonu var.

Görünüşe göre Scala daha hızlı, ancak Groovy milleti 2.0 sürümü için performansı gerçekten zorluyor. 1.6, 1.5 serisine göre hızda büyük bir sıçrama yaptı.

İki farklı problem sınıfını hedefledikleri için her iki dilin de gerçekten 'kazanacağını' düşünmüyorum. Scala, Java ile tamamen aynı düzeye sahip olmayan Java benzeri yüksek performanslı bir dildir. Groovy, hızın programcıların kodu uygulaması için geçen süreden daha az önemli olduğu hızlı prototip oluşturma ve geliştirme içindir.


3
"Groovy hızlı prototipleme ve geliştirme içindir" - bu, Groovy'nin benim katılmadığım üretim kullanımı için uygun olmadığını gösteriyor. Örneğin, üretimde kullanılan pek çok Grails tesisi var
Dónal

10
Scala dinamik bir dil değildir.
John Oxley

2
"Groovy'nin (bence) daha iyi dizgi enterpolasyonu var." - Scala-2.10.0 ile bu artık doğru değil (Scala harika dizge enterpolasyonuna sahip).
VasiliNovikov

5

Scala, Groovy'den çok daha dik bir öğrenme eğrisine sahiptir. Scala, desen eşleştirme ve kuyruk tabanlı özyineleme ile işlevsel programlama için çok daha fazla desteğe sahiptir, bu da saf FP için daha fazla araç anlamına gelir.


0

Scala'da ayrıca dinamika derlemesi var ve bunu twitter eval lib ( https://github.com/twitter/util ) kullanarak yaptım . Scala kodunu düz bir dosyada (herhangi bir uzantı olmadan) ve çalışma zamanında eval oluşturulmuş scala sınıfını kullanarak tuttum. Scala'nın meta programlama olduğunu ve dinamik karmaşıklık özelliğine sahip olduğunu söyleyebilirim.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.