Performans ve Java Birlikte Çalışabilirliği Üzerine: Clojure ve Scala


82

Daha önce Clojure ve Scala'nın çeşitli hesaplarını okudum ve her ikisinin de kendi yerlerini aldığını anladım. Her iki Clojure'u Scala ile karşılaştırmaya geldiğinde tam bir açıklama yapmadığım birkaç önemli nokta var:

1.) İki dilden hangisi genellikle daha hızlıdır ? Bunun bir dil özelliğinden diğerine değişeceğinin farkındayım, ancak genel bir performans değerlendirmesi faydalı olacaktır. Örneğin: Python sözlüklerinin gerçekten hızlı olduğunu biliyorum. Ancak bir bütün olarak, Java'dan çok daha yavaş bir dildir. Clojure ile gitmek ve yolun sonunda bu problemle karşılaşmak istemiyorum.

2.) Java ile birlikte çalışabilirlik nasıl? Şimdiye kadar okuduğum tek şey, Scala'nın büyük bir Java kod tabanıyla bütünleşmeyi biraz beceriksiz hale getiren yerel koleksiyon türlerine sahip olduğu, oysa Clojure Java sınıflarıyla birlikte çalışmak için basit bir Yinelenebilir / Yineleyici merkezli yol izlediğidir. Bununla ilgili başka düşünceleriniz / ayrıntılarınız var mı?

Nihayetinde, eğer clojure ve scala arasında yeterince yakın bir çekilişse, ikisini de deneyebilirim. Clojure ile ilgili bir şey, dilin çok basit görünmesidir . Ama yine de Scala'nın çok esnek bir tip sistemi var. Ancak, Scala'nın hızlı olduğunu biliyorum (birden fazla kişisel hesaba göre). Yani, Clojure önemli ölçüde yavaşsa: Daha sonra değil, daha önce bilmek isterim.


1
Clojure 1.2 ile Clojure ek yük olmadan java çağırabilir. Bak assembla.com/wiki/show/clojure/Datatypes ve assembla.com/wiki/show/clojure/New_new . Bu, Clojure'un Java'ya yakın olmak istemesi, ancak Clojure'da uygulanması nedeniyle yapılır.
nickik

Yanıtlar:


73

Her iki dilin de senin için yeterince hızlı olacağını düşünüyorum. Python ve Java'yı karşılaştırırken, hız farkı için dili suçlamak biraz mantıksız görünüyor. Java, JIT (mobil cihazlar * hariç) derlenirken Python yorumlanır. Her ikisinin de bir bayt kodu kullanması, uygulamaların uzaktan karşılaştırılabilir performansa sahip olacağı anlamına gelmez. Ancak hem Scala hem de Clojure JVM dilleridir, dolayısıyla benzer performansa sahip olmaları gerekir.

Scala'nın Clojure'e göre birkaç uygulama avantajı var ve ben biraz daha yüksek performans bekliyorum. Scala'nın statik yazımı normalde Clojure'ün ördek yazımına göre bir hız avantajına dönüşse de Clojure , kodu önemli ölçüde hızlandırabilen tür ipuçlarını destekler. Muhtemelen sıradan Scala, sıradan Clojure'den daha hızlıdır, ancak yalnızca darboğazları optimize etmeniz gerekir. Bir programın çalışma süresinin çoğu, gerçek kodun küçük bir miktarı tarafından oluşturulur.

Java ile birlikte çalışmayla ilgili olarak, Scala Java'ya daha yakındır, ancak her iki dilin de iyi çalıştığından eminim. In Clojure Programlama Stuart Halloway yazıyor: "[erişebileceğiniz] Java kodundan ulaşabilir şey. ".

Ve Scala yazarı Martin Odersky , Sun'ın Java derleyicisini yazdığından beri , Scala tarafında da hiçbir topun düşmediğini düşünüyorum. :-)

Ruby'yi de sevmeme rağmen, daha iyi iki dil seçmekte zorlanacaksınız. Hangisini deneyeceğiniz konusunda neden endişeleniyorsunuz? Neden ikisini de denemiyorsunuz? Scala'nın "bir sonraki Java" olma olasılığı daha yüksektir, ancak Lisp'in 50 yılı aşkın bir süredir bunu yapmadığında nihayet havalanacağını hayal etmek zor. Ancak Lisp'in kendine özgü bir soyutlama seviyesinde olduğu ve Clojure'un oldukça basit olduğu açıktır, bu nedenle Scala + Clojure sadece (oldukça karmaşık olan) Scala'dan daha zor olmayacak ve eminim bunu yaptığınıza sevineceksiniz. o.

Ve bu konuda birlikte çalışırlar ...

* dalvik (android'in JVM'si) 2010'da 2.2 sürümünde bir JIT derleyicisi aldı


6
Huh. Tüm görüşler için teşekkürler. İlk başta, sadece birini seçip onunla koşmak istediğim moddaydım. Ancak bazı nedenlerden dolayı, ikisini birden kullanabileceğim ve birlikte çalıştıkları aklıma gelmedi. Yani, belki ikisini de seçerim ve onlarla hızlı bir yürüyüş yaparım :-)
Ryan Delucchi 01.09

7
Ve LISP için biraz "yumuşak noktam" olduğunu da eklemek isterim, bu yüzden Clojure'un parazitten muzdarip olması beni korkutmaya yetmiyor.
Ryan Delucchi

8
JVM'de yazılan bir dilin en yüksek hızda performans göstereceği her zaman doğru değildir. Orijinal JRuby, kaynak kodu değil JVM için derlenen bir yorumlayıcı olduğu için kötü bir performans sergiliyordu. Dil de suçlanabilir. Statik olarak yazılan dilleri optimize etmek, dinamik dillere vb. Göre genellikle daha kolaydır.
Bill K

7
-1 "Scala ve Clojure JVM dilleridir, bu nedenle benzer performansa sahip olmaları gerekir" kesinlikle mantıklı değil. Gerek edilir Java gibi statik bir dil ile birlikte çalışabilir kalmak olduğuna Dinamik diller hep daha yavaş (aşırı yükleme çok büyük bir maliyetle geliyor, tip ipucu tüm sorunları çözmez, vs.)
julx

4
@julkiewicz - dinamik dillerin her zaman çok daha yavaş olduğu doğru değildir . Derleyicinizin söz konusu kodu optimize etmek için iyi bir iş yapıp yapamayacağına bağlıdır. Örneğin, Clojure'da Java performansıyla tam olarak eşleşen Java ilkelleri ile aritmetik yapabilirsiniz. Benzer şekilde, tür ipucu verilen bir Java nesnesinde bir yöntemi çağırmak, bir Java nesnesi yöntem çağrısı kadar hızlıdır. Clojure derleyicisi, eşdeğer Java kodu için javac ile aynı bayt kodunu üretir.
mikera

32

Mevcut JVM ile Scala, dinamik yazım için JVM desteği - yansıma - yavaş olduğundan, statik olarak yazılma nedeniyle bir avantaja sahiptir. Aslında, aynı tekniklerle, yapısal tiplerle uygulanması gereken bir Scala özelliği, bu nedenle sıklıkla uyarılır.

Ayrıca Scala, değiştirilebilir nesneleri gayet iyi kabul eder ve bazı algoritmalar, değişkenlik ile uygulanması daha hızlıdır.

Hem Scala hem de Java temelde sınıf tabanlı diller olduğundan, birlikte daha kolay çalışırlar. Ya da belki daha sorunsuz. Bir Java sınıfı, Scala'nın bir sınıfıdır ve bir Scala sınıfı, Java'nın bir sınıfıdır. Scala'nın tekilleri veya Java'nın statik üyeleri söz konusu olduğunda, özellikle işlerin belirli bir şekilde çalışmasını bekleyen bir çerçeve söz konusu olduğunda sorunlar ortaya çıkabilir.

Yani bu iki hesapta da Scala ile giderdim . Clojure birçok yönden daha iyi bir dildir ve kesinlikle Scala'da (şimdiye kadar) bulunmayan çok ilginç özelliklere sahiptir, ancak tamamen işlevsel hale gelerek bu tür faydaları elde edersiniz. Bunu yapmayı düşünüyorsanız, Clojure çok daha iyi. Eğer yapmazsan, muhtemelen Scala ile kalmalısın.


9
Clojure'un işlevsel programlama özellikleri, bu dili düşünmemin en zorlayıcı nedenidir. Şu noktaya ulaşıyorum: eğer bir şeyi işlevsel bir şekilde kodlamıyorsam - Java'da gömülü bir betik diliyle neden uğraşıyorum ki? Hızlı ve kirli görevleri yapmak için zaten yanımda Python var.
Ryan Delucchi

"Java'ya gömülü komut dosyası dili". Lütfen gerekçelendirin.
Jus12

@Daniel: Karışıklık için üzgünüm. Ryan Delucchi'ye yönelik yorumu kastetmiştim. Scala'nın satın almadığım "Java'ya gömülü bir betik dili" olduğunu söylüyor. (Hakkında hiçbir fikrim olmayan Clojure'u kastetmediği sürece).
Jus12

@ Jus12 Bunu, bu dilleri JVM betik dilleri olarak kullandığı anlamına gelmek için aldım ve bu nedenle, işlevsel hale gelmediği sürece Python'a göre herhangi bir avantaj görmüyor. Sonra tekrar, ben o değilim, bu yüzden sadece tahmin edebilirim.
Daniel C. Sobral

20

Clojure ve Scala'nın tamamen farklı iki programlama dili olduğunu unutmayın - Clojure, işlevsel bir Lisp benzeri dildir, nesne yönelimli değildir . Scala, işlevsel programlama özelliklerine sahip nesne yönelimli bir dildir.

Kanımca, bir dilin özellikleri ve kavramları (işlevsel, OO, ...) bir dil seçmek için performanstan (o dilin belirli bir uygulamasının) çok daha önemli kriterleridir - bunu anlamadığınızı anlasam da İyi performans gösteren bir uygulamanın olmadığı bir dile hapsolmak istiyor.

Scala'yı tercih ederim, çünkü nesne yönelimli ama aynı zamanda işlevsel programlamayı öğrenmenize de izin veriyor (bununla ilgileniyorsanız). Öte yandan, OO ile ilgilenmiyorsanız ve "saf" işlevsel programlamayı öğrenmek istiyorsanız, Clojure'u deneyin.


9
Açıkça görülüyor ki Clojure kullanmadınız. Clojure, Scala'nın İşlevsel Olması kadar Nesne Yönelimli'dir. Bir arabirim uygulayabilir, bir sınıfı genişletebilir, özel ve statik işlevler bildirebilirsiniz, vb. ( Clojure.org/java_interop ).
Richard Clayton

28
Clojure'da Java ile birlikte çalışabilirlik için bu şeyler var, ancak sınıflar ve nesneler açıkça Clojure'un ana özellikleri değil. Clojure'da programlayacaksanız sınıflar oluşturmaz ve projenizi OO şeklinde tasarlamazsınız.
Jesper

>> "performanstan daha fazla". Sorun şudur: Ne zaman olur - bir projenin derinliklerinde - performansınızın düşük olduğunu keşfedersiniz - ve sadece küçük bir parçasından dolayı değil (bu nedenle java'ya dönüştürmeyi zaten planlamıştınız). Burada "klozet kullanmayın - nokta .." demek niyetinde olmasam da, tıkanmanın performans alanında daha büyük bir risk olduğu açık olmalıdır. Bunun bir önemi olmayan uygulama seviyesi kodu için birçok fırsat vardır: aynı zamanda bir sorumluluk olacağı çok sayıda çerçeve / çoklu okuma / işleme yoğun kod tabanı.
StephenBoesch

@javadba Clojure'ın düşük seviyeli çoklu iş parçacıklı kod için kötü olduğu fikri oldukça keyfi görünüyor. Clojure, çok iş parçacıklı programlama hataları yapmak çok zor olacak şekilde tasarlanmıştır. Clojure diline çekirdek olan iletmenin veri ve STM özellikleri çekirdek Scala kullanılamaz şey vardır ve bunlar yapmak o kadar az olasılıkla bir programcı yanlışlıkla kendi koduna bir yarış koşulu veya kilitlenme eklediğini. Elbette bu, Scala veya Java gibi statik olarak yazılmış bir dilden elde edebileceğiniz birkaç ms'lik çalışma süresinden daha değerlidir.
nben

"Elbette bu, birkaç ms çalışma süresinden daha değerlidir" .. Bu, verilerin ölçeğine bağlıdır. birkaç kayıt için birkaç ms yeterlidir. yüz milyonlarla çarpın ..
StephenBoesch

16
  1. Deyimsel Scala deyimsel Clojure'den daha hızlıdır ve öyle kalacaktır.
  2. Hem Scala hem de Clojure Java'nın üstüne kolayca oturur. Hiçbiri onun altında iyi oturmuyor.

Kodunuz zaman ve alan açısından kritikse, Java'yı tercih edin. Ama öyle olduğunu düşünseniz bile değil.

Bilgisayar Dili Benchmark Oyun Clojure gerçek kaynak maliyetleri üzerinde çok az ışık tutuyor. Clojure veri yapıları kullanılmaz. İşlevsel ve sıra soyutlamaları görünmez.

Clojure basit görünebilir. Değil ama anlamlı. Java'dan beş kat daha yavaş çalışabilir, ancak kaynak beş kat daha küçüktür (YMMV). Çoğu uygulama için bu büyük bir kazançtır. Ancak bazıları için ve diğerlerinin birçoğu için bu yıkıcı bir kayıp.

Clojure dili deneyimiyle, probleminizin Clojure'da özlü ve yeterli bir şekilde (performans açısından) ifade edilebilecek bir kısma ve Java'da yapılması gereken bir kısma ayrılıp ayrılmayacağını önceden söylemenin mümkün olduğuna inanıyorum.

  • Scala lite'a gidebilirsiniz: Scala'da Java deyimleri yazmak. Biraz kısalık, göze daha kolay gelen bir sözdizimi ve karmaşık da olsa tutarlı bir sisteme sahip olacaksınız.
  • Clojure lite diye bir şey yoktur: Clojure'da Java deyimleri yazmak tamamen anlamsızdır. Elde edeceğiniz tek şey, onu ifade etmek için kullanılan deyimlerin parçalarını aştığı için anlaşılması zor olan yavaş Java'dır.

Scala'nın Java'nın doğru yapıldığı söyleniyor . Clojure Java'ya benzemez. Bunun Lisp'in doğru yapıldığını söyleyebilirsiniz - cesurca, bazıları saçma olduğunu söyler, iddia - bu doğru olabilir.


4
Bu cevap, ikisinin gerçek farklılıklarına ve güçlü / zayıf yönlerine ışık tutuyor. Ne scala- ne de clojure-apolog tarzda değil, gerçeğe uygun olarak yazılmıştır.
StephenBoesch

15

" Bilgisayar Dili Karşılaştırma Oyunu " tarafından üretilen istatistikler " , muhtemelen bulacağınız en iyiler hakkındadır.

Kapsamlıdırlar ve birçok dili karşılaştırabilirsiniz. Sorun şu ki, Clojure'u kapsamıyor :(

Bununla birlikte, herhangi bir şeyi göndermek oldukça kolaydır - hepsi açık kaynaklıdır.

İstatistikler Scala'nın oldukça hızlı olduğunu söylüyor.


9
İşte gidiyorsun. Java'dan 2-25x daha yavaş, 2-30x daha fazla bellek ve kod boyutu genellikle Java'dan daha büyüktür. Görünüşe göre, Scala'nın Java'ya çok yakın olduğu Python ile karşılaştırılabilir. Clojure testi kötü yazılmadıkça Scala'nın oldukça açık bir kazanan olduğunu ve Clojure'un önemli ölçüde daha yavaş olduğunu söyleyebilirim.
Bill K

2
Görünüşe göre kriter şu anda Clojure'ü kapsıyor (OP'nin açıklaması bir yaşında). Ve sonuçlar cesaret verici değil. Scala gitmenin yoludur.
Martin

4
Yukarıdaki yorumlar biraz güncelliğini yitirmiş - 2012 ortası itibariyle Clojure açığı büyük ölçüde kapattı, şimdi ortalama olarak sadece 2x Java.
mikera

9

Birlikte çalışabilirlik konusunda Clojure adına konuşamam ama Scala ile benzer bir durumda olmasını beklerdim.

Java'yı Scala'dan aramak son derece kolaydır.

Harici API'nizi Scala ve Java arasındaki ortak noktalara uydurduğunuz sürece, Scala'yı Java'dan aramak kolaydır. Örneğin, Java'da bir Scala nesnesi statik yöntemler gibi bazı şekillerde kullanılır, ancak aynı şey değildir. Scala sınıfları, Java'da komik görünen adlara sahip bir dizi sınıfta derlenebilir.

Çok fazla karıştırmak ve eşleştirmek istemeyeceksiniz. Çok sayıda Java kitaplığı kullanan Scala veya Clojure'da bileşen oluşturmak çok uygundur. Elbette bu bileşeni Java'dan çağırabilirsiniz, ancak yapmak istemeyeceğiniz şey, Java'dan Scala programları tarafından kullanılmak üzere tasarlanmış bir Scala API'sini tüketmeye çalışmaktır.

SVN, "CVS'nin doğru yapıldığını" iddia ediyor. Benim görüşüme göre, Scala Java'nın doğru yapıldığını gösteriyor.


1
@Ron haha, ben de aynısını düşündüm.
KoW

2
Aslında Clojure koleksiyonları git-ish
Joe Lehmann

2

PragPub Kasım 2010 sayısında Clojure-Java birlikte çalışabilirlik anlatılır. Java yöntemlerini çağırmak basittir, ancak Java sınıflarını / arayüzlerini genişletmek oldukça farklıdır.

Scala ise Java'ya çok daha yakın. Scala-Java birlikte çalışabilirliği, http://www.codecommit.com/blog/java/interop-between-java-and-scala adresinde ayrıntılı olarak açıklanmıştır.

Java kodunu çağırmak ve Java sınıflarını / arayüzlerini genişletmek, Scala kodunu çağırmakla aynı şekilde çalışır. Scala'nın tip sistemi Java'nınkinden çok daha güçlü olduğu için , bazı sorunlu noktalar Java'nın jenerikleriyle uğraşmanın bazı uç durumları olabilir . Java Bean kuralını izleyen alıcılar ve ayarlayıcılar oluşturmak için bir açıklama gerekir .

Java'dan Scala çağırmak çoğu zaman basittir, ancak örneğin Scala'nın yardımcı nesneleri bayt koduna nasıl derlendiklerini bilmeyi gerektirir. Ayrıca Java'dan soyut olmayan yöntemlerle özelliklerin kullanılması karmaşık olmalı ve özel karakterlerle yöntemlerin çağrılması, bayt kodunda nasıl kodlandıklarını bilmeyi gerektirecektir.


1

Şimdi (Mayıs 2010 itibariyle) Clojure'un en son 1.2 dalında yer almaya değer - bu, ilkel tipler ve statik yazım için (çeşitli tip ipuçları ve protokoller aracılığıyla) çok sayıda ek destek içerir.

Anladığım kadarıyla, saf Java'da tam olarak aynı kodu yazmaya eşdeğer bir hız elde etmek için ihtiyaç duyduğunuzda bu özellikleri kullanabilirsiniz.


2
Ve aynı zamanda, @specializedyaklaşan Scala 2.8'deki teknik, Scala kitaplıklarına benzer bir iyileştirme getiriyor. Ve bir dil tesisi olarak, yalnızca standart kitaplıkta değil, tüm kodlarda kullanılabilir.
Randall Schulz
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.