Scala - Groovy vs. Clojure [kapalı]


676

Birisi Scala, Groovy ve Clojure arasındaki büyük farklılıkları açıklayabilir mi? Bu derlemelerin her birinin JVM üzerinde çalışacağını biliyorum ama aralarında basit bir karşılaştırma yapmak istiyorum.

Yanıtlar:


873

Groovy , sözdizimi Java'ya çok yakın olan, daha hafif kod ve daha az kaynak plakasına izin veren bir dizi sözdizimi geliştirmesiyle dinamik olarak yazılan bir dildir. Yeni bir sözdizimi öğrenmek zorunda kalmadan (Java'yı bildiğiniz varsayılarak) hızlı prototipleme, komut dosyaları ve dinamik dilleri öğrenmeyi kolaylaştıran bir yorumlayıcı aracılığıyla derlenebilir. Groovy 2.0'dan itibaren statik derleme için büyüyen desteğe de sahiptir . Groovy, geleneksel fonksiyonel programlamanın geleneksel tanımından oldukça uzak olmasına rağmen, kapakları destekliyor ve biraz işlevsel bir tarzda programlama desteğine sahip.

Clojure , Lisp'in Yazılım İşlem Belleği gibi birkaç gelişmiş özelliğe sahip bir lehçesidir . Lisp'i seviyorsanız ve JVM altında böyle bir şey kullanmak istiyorsanız, Clojure tam size göre. Muhtemelen JVM'de çalışan en işlevsel dil ve kesinlikle en ünlü dil . Ayrıca, diğer Lisp lehçelerinden daha değişmezliğe daha güçlü bir vurgu yapar , bu da onu fonksiyonel dil meraklılarının kalbine yaklaştırır.

Scala , tamamen nesne yönelimli bir dildir, Java'dan daha çok, araştırma dışı dillerde mevcut en gelişmiş tür sistemlerinden biri ve kesinlikle JVM'deki en gelişmiş tür sistemidir. Ayrıca, nesne yönünden ödün vermeden fonksiyonel dillerin birçok kavramını ve özelliğini birleştirir, ancak işlevsel dil özelliklerinden ödün vermek, bu dilin bazı meraklılarını erteler.

Groovy, Grails'te iyi bir kabul ve popüler bir web çerçevesine sahiptir. Ayrıca Maven'e popüler bir alternatif haline gelen Gradle inşa sistemine de güç veriyor. Kişisel olarak, özellikle Jython ve JRuby'nin diğerlerine kıyasla JVM ülkesinde yollara girmeye başlamasıyla sınırlı faydaya sahip bir dil olduğunu düşünüyorum.

Clojure, bazı çok ilginç özellikleri bile azaltsa bile, sadece JVM'de bir Lisp lehçesi olarak güçlü bir çekiciliğe sahiptir. Bu popülerliğini sınırlayabilir, ancak uzun bir süre onun sadık topluluğuna sahip olmasını bekliyorum.

Scala, Java ile doğrudan rekabet edebilir ve hemen hemen tüm yönleriyle parası için koşabilir. Şu anda popülerlikle rekabet edemez elbette ve güçlü bir kurumsal desteğin olmaması, kurumsal ortamlarda kabul edilmesini engelleyebilir. Ayrıca dilin nasıl geliştiği anlamında Java'dan çok daha dinamik bir dildir. Dil açısından bakıldığında, bu iyi bir şey. Binlerce kod satırı yazmayı planlayan kullanıcılar açısından, öyle değil.

Son bir açıklama olarak, Scala'ya çok aşinayım ve sadece diğer ikisini tanıyorum.


1
Güzel bir. Scala'nın Lightbend kurumsal desteğine sahip olduğunu ve LinkedIn, Twitter, Spark ve birçok banka gibi büyük isimler tarafından kullanıldığını söylemeliyim. Çalıştığım yerde 11 milyon satırlık Scala kod tabanımız var, bu iyi bir fikir değil ama işe yarıyor.
Joan

219

Scala

Scala, Huni olarak bilinen saf bir işlevsel dilden evrimleşti ve hemen hemen tüm Java'nın sözdiziminin temiz oda uygulamasını temsil ediyor, sadece net bir iyileştirmenin yapılabileceği yer veya dilin işlevsel doğasını tehlikeye atacağı yerde farklılık gösteriyor. Bu farklılıklar arasında statik yöntemler yerine tektonlu nesneler ve tür çıkarımı bulunur.

Bunların çoğu Martin Odersky'nin Pizza diliyle önceki çalışmalarına dayanıyordu . OO / FP entegrasyonu sadece kapanışların çok ötesine geçiyor ve dilin post-fonksiyonel olarak tanımlanmasına yol açtı.

Buna rağmen, birçok yönden Java'ya en yakın olanıdır. Temel olarak OO desteği ve statik yazmanın bir kombinasyonu nedeniyle, aynı zamanda dil tasarımındaki açık bir amaç nedeniyle Java ile çok sıkı bir şekilde entegre olması gerekir.

harika

Groovy, Java'nın en büyük eleştirilerinden ikisini açıkça ele alıyor:

  • dinamik olarak yazılan, çok sayıda kazan plakasını ve
  • dile kapanışlar ekleyerek.

Belki de Java'ya sözdizimsel olarak en yakın olan, Clojure ve Scala'nın sağladığı daha zengin fonksiyonel yapıların bazılarını sunmuyor, ancak yine de özellikle script-syle programları yazmak için kesin bir evrimsel gelişme sunuyor.

Groovy, çoğunlukla yay kaynağı aracılığıyla üç dilin en güçlü ticari desteğine sahiptir.

Clojure

Clojure, LISP ailesinde işlevsel bir dildir, aynı zamanda dinamik olarak yazılmıştır.

STM desteği gibi özellikler ona en iyi kullanıma hazır eşzamanlılık desteğini verirken, Scala bunu çoğaltmak için Akka gibi bir üçüncü taraf kütüphaneye ihtiyaç duyuyor .

Sözdizimsel olarak, aynı zamanda tipik Java kodundan üç dilden en uzunu.

Ayrıca en çok Scala ile tanıştığımı da açıklamalıyım :)


11
Bu Dönüşüm Hunisi dilini daha önce hiç duymamıştım. Tarihsel kayıttaki küçük bir boşluğu doldurduğunuz için teşekkür ederiz.
Randall Schulz

8
Gerçekten Clojure bir diyemezsin saf işlevsel dil. Zorunlu kod yazmak kesinlikle mümkündür.
dbyrne

2
Scala, akka bazlı eşzamanlılık için Akka kütüphanesinde inşa etti. Artık bir üçüncü taraf bağımlılığı değil.
scott m gardner

2
@Orubel Baytkodunda, bir scala sınıfı, eşdeğer Java sınıfı türleriyle ve hepsiyle aynıdır . Özetle, tüm Akka Java API'sı Scala'da yazılmıştır. Lütfen burada "bütünleşemiyorum" ile ne demek istediğinizi açıklayın - çünkü bana FUD gibi geliyor.
Kevin Wright

3
Bu belgeyi özetlemek gerekirse: "Java'da bulunmayan Scala özellikleri doğrudan Java'da kullanılamaz". Ancak ... soyut tür üyeler ve daha yüksek tür türler kesinlikle kullanmak zorunda olmadığınız oldukça gelişmiş özelliklerdir! Java, Groovy'den parametreler, oluşturucular veya genişletme modülleri olmadan da yöntemleri kullanamaz, böylece Groovy'yi kendi tanımınıza göre "sıkıca entegre edilmez".
Kevin Wright

68

Clojure ile oynamak için hiç zamanım olmadı. Ama scala vs groovy için, bu James Strachan'ın kelimeleri - Groovy yaratıcısı

"Her ne kadar benim önerim javac'ın uzun vadeli değişimi için olsa da Scala. Çok etkilendim! Birisi bana Martin Odersky, Lex Spoon & Bill Venners tarafından 2003 yılında geri dönerek Scala'da Programlama kitabını göstermişse söyleyebilirim. Muhtemelen Groovy'i hiç yaratmamıştım. "

Bütün hikayeyi okuyabilir burada


72
Bu ifadenin Scala'nın Groovy'den daha iyi olduğunu söylemediği belirtilmelidir. James ayrıca bir dil yaratmanın ne kadar sıkıntısı olduğunu bilseydi asla bir dil yaratmayacağını söyleyerek de bilinir. Bu bağlamda bakıldığında neden Groovy'yi geliştirmeyeceği açıktır. Ve çok iyi fikirler verdiğini söylemeye cesaret ediyorum, ama şu anki Groovy'nin yaratıcısı değil. 2007'de 1.0'dan çok önce projeden ayrıldı ve o zamandan beri katılmadı. Projede en az onun olmadan projede olduğu kadar var.
blackdrag

31
James Strachan'ın Kotlin dili üzerinde aktif olarak çalıştığı göz önüne alındığında, Scala görünüşe göre onun için yeterince etkileyici değil.
bdkosher

6
@bdkosher üzerinde çalışıyor çünkü Scala çoğu programcı için çok etkileyici … ve (daha da önemlisi,] bazı yerlerde de çok karmaşık
Görünen Ad

30

Nereden geldikleri veya esas olarak hangi geliştiricileri hedefledikleri ile ayırt edilebilirler.

Groovy , Java'nın komut dosyası sürümü gibidir. Büyük mimariler tarafından desteklenen çevik uygulamalar geliştirirken uzun zamandır Java programcıları kendilerini evlerinde hissederler. Grails on Groovy, adın Rails çerçevesine benzer şekilde belirtildiği gibi. Her zaman Java'nın ayrıntılarıyla uğraşmak istemeyen insanlar için.

Scala nesne yönelimli ve işlevsel bir programlama dilidir ve Ruby veya Python programcıları buna daha yakın olabilirler. Bu programlama dillerinde birçok ortak iyi fikir kullanır.

Clojure , Lisp programlama dilinin bir lehçesidir, bu nedenle Lisp, Scheme veya Haskell geliştiricileri bu dil ile gelişirken kendilerini evlerinde hissedebilirler.


24
Scala gerçekten işlevsel bir programlama dili değil. Fonksiyonel özelliklere sahip, önce nesne yönelimli bir programlama dilidir.
Daniel C. Sobral

16
Söylemeliyim ki, bu cevap karanlıkta bir atış gibi hissettiriyor. Bence Python Groovy'a Scala'dan daha yakın ve Ruby (bence) yukarıdakilerden herhangi birine çok yakın değil, belki de yine Groovy'e en yakın. Haskell, (Common) Lisp veya Scheme (ve dolayısıyla Clojure gibi) gibi değildir. Bana göre bu cevap (en azından!)
John Y

21
Scala, bazı fonksiyonel özelliklere sahip olan zorunlu bir dildir. Eğer insanlar fonksiyonel dünyadan deyimleri alır almaz işlevsel bir dili aramaya devam ederse, bu terim sadece başka bir pazarlama terimi haline gelecektir. C ++ işlevsel ve Haskell zorunluluğu da aramaya başlayabilir.
jon-hanson

9
@alanlcode Odersky ne istediğini söyleyebilir. Scala'nın yan etkileri izole etmek için herhangi bir sistemi yoktur, varsayılan olarak tembel değildir ve kodu veri olarak ele almaz - işlev çağrılarını farklı veri olarak ele alır . Tamamen işlevsel olmak istiyorsanız bunlar büyük problemlerdir. Öte yandan, Scala, Nesne Modelinin kusurlu olmadığından emin olmak için sonuna kadar gider. Scala'yı seviyorum, ama açıkça işlevsel ikinci.
Daniel C.Sobral

7
Öte yandan, ML dil ailesi işlevsel olarak tanınır, ancak katıdır ve yan etkilere / zorunlu koda izin verir.
GClaramunt

8

Scott Davis, Telif Hakkı 2008 tarafından basılan ve aynı yılın Nisan ayında basılan Pragmatik Programcılar kitabı "Groovy Tarifler: Java'nın tekerleklerini yağlamak" kitabını okuyorum.

Biraz eski ama kitap Groovy'nin kelimenin tam anlamıyla Java'nın bir uzantısı olduğunu açıkça gösteriyor. Tam olarak Java gibi çalışan Java kodu yazabilir ve dosyayı * .groovy olarak yeniden adlandırabilir ve iyi çalışır. Kitaba göre, gerekli kütüphaneleri eklersem bunun tersi doğrudur. Şimdiye kadar, deneyler bunu kanıtlıyor gibi görünüyor.


Groovy'yi öğrenmek için en iyi kitap bu.
topr

Tüm kodların tamamen aynı şekilde davranmayacağını belirtmek muhtemelen önemlidir. Bu farklılıklardan bazıları, Groovy'nin tek ve çift tırnak işaretlerini anlama şeklini ve genişletme yerine boks tercihini içerir. Yine de çoğu kod aynı şekilde çalışır.
Ontonator

4

Açıkçası, sözdizimi tamamen farklı (Groovy Java'ya en yakın), ama sanırım bu sizin istediğin şey değil.

Bir Java uygulaması yazmak için bunları kullanmakla ilgileniyorsanız, Scala muhtemelen iyi bir seçim değildir, çünkü Java'dan değerlendirmenin kolay bir yolu yoktur , oysa Groovy özellikle bu amaç için uygundur.


Java'yı kodlamak için Scala'yı kullanma konusundaki fikrinizi anlamıyorum. Java kodunu çalıştıran bir Scala betiği yazabilirsiniz; gerek yok eval.
Daniel Yankowsky

2
@Daniel, lütfen bağladığım komut dosyaları için Scala'yı kullanma hakkındaki soruya bakın. Kabul edilen cevap, bir "eval" tesisi ve javax.scripting desteğinin eksikliğinin Scala'yı bir Java uygulaması komut dosyası olarak kullanmak için daha karmaşık hale getirmesidir, örneğin Groovy.
Thilo
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.