Soru Scala'nın çözümünde hangi sınıflar Clojure iyi / kötü?


Her iki dil de fonksiyonel programlama için güçlü destekle JVM'dir. Her iki dilin de mükemmel çözümler sunabileceği büyük bir problem sınıfı olacağının farkındayım. Ne bilmek isterim ki, Clojure'un özellikleri onu Scala'ya karşı kayda değer bir kenar kazandıracak özel bir problem türü varsa, tersine. Şu anda Scala'da yaptığımız çalışmaların çoğunu yapıyoruz, ancak Clojure'un potansiyel olarak daha iyi bir çözüm sunabileceği özel problem alanlarına dikkat etmek istiyorum.


25
2017-10-01 04:06


Menşei




Cevaplar:


Her iki dil de neredeyse tüm alanlar için son derece yetenekli ve uygundur. Her iki dil ile özellikle yanlış gidemezsiniz - muhtemelen şu andaki en umut verici iki dil olduğunu söyleyecek kadar ileri giderim.

Hala her birinin kendine özgü avantajları olduğu birkaç alan olduğunu düşünüyorum:

Clojure'nin Scala'ya göre güçlü yönleri:

  • eşzamanlılık - Clojure, nesne kimliği ve değişken durum hakkında yeni bir düşünce tarzına dayanan, dile yerleşik, benzersiz ve çok güçlü bir eşzamanlılık desteğine sahiptir. Bu, başka yerlerde çok iyi açıklanmıştı, bu yüzden özellikle ayrıntılara girmeyeceğim, ama bu video Rich Hickey bazı anlayışlar elde etmek için harika bir yerdir.
  • metaprogramming - Clojure bir homoiconic Makro tabanlı meta programlama, DSL oluşturma ve kod oluşturma için özellikle uygun olan dil. Bu bağlamda Lisp "kod veri" felsefesini takip eder.
  • Dinamik yazarak - Clojure, dinamik dillerle (daha az kazan, hızlı prototipleme, çok özlü kod vb.) İlişkili tüm avantajlara sahip dinamik bir dildir.
  • Fonksiyonel programlama - Scala'da FP yapabilmenize rağmen, Clojure kesinlikle daha işlevsel bir langataja benziyor (oysa Scala muhtemelen en çok paradigma olarak tanımlanıyor). Clojure'deki bu işlevsel vurgu kendini çeşitli şekillerde ortaya koyar, örneğin tüm temel kütüphaneler arasında tembel değerlendirme desteğinde yerleşik, tüm veri yapıları değişmez, deyimsel Clojure "kodlama stili" zorunlu / OOP yerine işlevseldir.

Scala'nın Clojure'a göre güçlü yanları:

  • Nesne yönelimi - Scala, kavramsal olarak Java'ya daha yakın ve Java tarzı OOP yaklaşımları için daha iyi bir desteğe sahip. Clojure'da OOP yapabiliyorken, rahat bir uyum değil.
  • Sözdizimsel aşinalık - Scala sözdizimi, Lisp dışındaki diğer dillerden gelen insanlar için muhtemelen daha rahat olacaktır.
  • Statik yazma - Scala'nın çok sofistike bir statik tipi sistemi var. Statik yazmanın avantajlı olduğu durumlarda, Scala'nın net bir kenarı olacaktır. Statik yazmanın genel avantajları geçerlidir - derleyici daha fazla potansiyel "tip" hatası yakalayabilir, derleyici performans optimizasyonları yapmak için daha fazla fırsata sahiptir.
  • Daha olgun- Scala, Clojure'den (2003 ve 2007'ye) biraz daha uzun bir süre geçti ve sonuç olarak, daha olgun bir dilde (daha iyi araç desteği, biraz daha büyük bir topluluktan) beklediğiniz bazı faydalar var.

Tamlık için, her iki dilin paylaştığı birkaç farklı avantaj vardır:

  • Aktif ve yenilikçi topluluklar - Her iki dil de çok çeşitli katılımcılar ile aktif bir topluluk oluşturdu
  • Java ile mükemmel birlikte çalışabilirlik - Her iki dil de Java ekosistemindeki büyük kütüphane ve araç dizisini kolaylıkla kullanabilir
  • JVM avantajları - Her iki dil JVM'deki (JIT derleyici, çöp toplama algoritmaları, optimize edilmiş yürütme ortamı vb.) tüm büyük mühendislikten yararlanır.

38
2017-10-01 07:58



Böyle bir sorunun ortaya çıkmış olabileceği cevapları aldattım. Böyle mükemmel bir cevap oluşturduğunuz için teşekkür ederim! - Daniel C. Sobral


Clojure'un makro sistemi nedeniyle DSL'ler yazmak için Clojure'ı kullanmayı tercih ediyorum. Ayrıca, bazı eşzamanlı sistemler için Clojure'ı tercih ederim. Clojure'un yerel desteği yazılımsal işlem belleği Scala'nın aktör modelinden oldukça farklıdır.

Clojure, nesne yönelimli programlama için büyük desteğe sahip değildir. Nesne yönelimli paradigmanın iyi çalıştığı ya da Java kütüphaneleri / çerçeveleri üzerinde yoğunlaşacağınız projeler için Scala'yı tercih ederim.


11
2017-10-01 05:49



İyi cevap, Scala daha doğal (daha az (parantez)) DSL'ler için daha iyi olsa da. - Duncan McGregor
Bunu not et Akka benzer sağlar STM desteği Scala / Java için. - Aaron Novstrup
@Duncan - Clojure DSL'lerinin, içinde sardığınız makro / işlev çağrısından ayrı herhangi bir parantez bulundurmasına gerek olmadığını unutmayın. Örneğin, bir şeyi yapan bir DSL yazabilirsin (örneğin, denklem-kökler [x] "0,5x ^ 3 - 6x ^ 2 + 2x -1 = sin x") - mikera
Mikera ama sonra sadece bir tokenised listesini yorumlamak için azalmadınız değil mi? Bir referans görmeyi çok isterim. - Duncan McGregor
@Duncan - ne istersen yapabilirsin, ör. fnparse gibi bir şey kullanarak bir BNF dilbilgisinden keyfi karmaşıklığın AST'sini oluştururgithub.com/joshua-choi/fnparse). Clojure'un makro sisteminin bütün noktası, kodunuzu derleme zamanında dönüştürmek için kullanabileceğiniz tüm dile sahip olmanızdır, böylece seçtiğiniz herhangi bir DSL sözdizimini ayrıştırabilirsiniz. Tabii ki, deyimsel olmak ve ayrıştırmanın basitliği için böyle bir durumda Lisp tarzı ifadelerin seçilmesi normal olacaktır, benim amacım sizden, DSL'iniz için böyle bir gösterimi seçmeye zorlayan hiçbir şeyin olmadığıdır. - mikera


Clojure ve Scala ile ilgili harika şeylerden biri de her ikisi de En az sürtünme ile aynı yerde. Clojure'deki etkileşimin çoğunu yapmayı öneririm, çünkü orada bir kenara sahip olduğunu düşünüyorum.

Sadece ikisini deneyin ve hangi problemlerin ve dillerin birbirine uyduğunu görün. Aynı sistemdeki Java, Scala ve Clojure kodları arasında her zaman birlikte çalışabilirsiniz.


4
2017-10-01 17:49



Neyle etkileştin? - soc
JVM'deki diller arasındaki ilişki. Yani Java kullanarak Clojure, Scala kullanarak Java, Clojure kullanarak Scala, vb. - John Cromartie
Oldukça garip. Bu iddiayı sıklıkla Clojure'nin daha iyi bir ilişkiye sahip olduğunu duydum, ancak maalesef bu hiçbir zaman gerçek bir gerçekle desteklenmedi. - soc