Java geliştiricileri Scala hakkında ne düşünüyor? [kapalı]


19

IDE desteğinin o kadar iyi olmadığını fark ettim, ancak dilin kendisi fonksiyonel programlama deyimlerini çok daha temiz bir şekilde destekliyor.


3
Python benim dinim, bu yüzden sadece Guido'nun Scala hakkında ne düşündüğünü önemsiyorum. neopythonic.blogspot.com/2008/11/scala.html
İş

7
Scala öyle büyük bir dildir ki, sadece Scala topluluğunun sahip olduğu tüm bu büyük zihinleri çekmekle kalmaz, aynı zamanda dile ve onu kullanan insanlara saldırmak için temelde her şeyi bulmaya çalışan birçok kıskanç da nefret eder.
soc

@soc: Daha açıkçası: Ben Scala nefret etmiyorum ve muhtemelen kullanmak yapamadı insanlar daha az önemsiyorsun (olmamalı!) ben bunu düşünüyorum. Bence çok karmaşık. Bu kadar. Büyük beyin sahibi olanlar için karmaşıklık iyi olabilir. I don't :-)
Joonas Pulakka

3
Üzgünüm, insanlar iddialarını desteklemeden mitleri tekrarlamaya devam ettiklerinde rahatsız oluyorum.
soc

2
@soc: Bu soru tamamen öznel, bu yüzden herhangi bir cevap doğru, efsane olsun ya da olmasın.
Joonas Pulakka

Yanıtlar:


18

Scala'yı bir yıldan fazla bir süredir programlıyorum, bu yüzden bu soruyu cevaplamak için kendimi bir yıl geriye almaya çalışacağım.

  • Scala kodu Java kodundan daha özlüdür (ayarlayıcı veya alıcı yok, birçok tür bilgisi çıkarılabilir)
  • XML hazır bilgisi için yerleşik destek çok caziptir.
  • Java kitaplığı uyumluluğu ve birlikte çalışabilirliği harika
  • Bazı fonksiyonel deyimler için destek canlandırıcıdır (kavrama, kapatma, lambda fonksiyonları, harita, katlama, azaltma için)
  • Dil oluşturucunun dahil etmek istemediği harika bir özellik yok gibi görünüyor

Yukarıdaki noktalar aşağı yukarı öğrenmeye başlamadan önce Scala hakkında düşündüğüm şeylerdi.

Bir yıl boyunca, bulduğum şey:

  • Satın alma Merdiven kitabını büyük bir yatırımdı ve bana kendi başıma bir şeyler öğrenmeme saatler kazandırdı
  • Sözdiziminin bazı tuhaflıkları var ve bazen bir şeyin neden geçerli olmadığını gerçekten şaşırdım. Bir kez alıştıktan sonra takas, kodun daha az dağınıklığı vardır ve okunması daha kolaydır. Kod yazmak yerine okursanız bunun gerçekten bir sorun olmadığını unutmayın.
  • 2.8'deki koleksiyon kütüphanesi kullanmak bir zevktir. Java'ya geri dönmek zor.
  • XML hazır bilgisi güzel, ancak bazı temel şeylerin ötesinde, Java kütüphanesi ekosistemine ulaşmak zorunda kaldım. Gerçi uygun.
  • Scala'nın Java kitaplıklarını kullanmak çok kolay ve kullanışlıdır. Java'dan Scala sınıflarını kullanmak biraz daha zor ama işe yarıyor.
  • IntelliJ IDEA topluluk sürümüne geçtim ve mükemmel olmasa da yeterince iyi.
  • Dil yaratıcısı gerçekten özellik kümesini düşündü ve hepsi birlikte güzel çalışıyor. Nesneye yönelik destek, Java'dan (özelliklerle) daha iyidir ve fonksiyonel programlama yapabilirsiniz.
  • Görünüşe göre bazı Java geliştiricilerinin bir tutkuyla nefret ettiği bir dil. Benim için programlama sevincini geri getirdi.

21

Bence Scala çok karmaşık. Bir şeyler yapmanın sayısız farklı yoluna sahip olması C ++ gibi hissettiriyor. Bazıları buna "zenginlik", "ifade" veya "güç" der, ancak kilometreniz değişebilir. Birçok gerçek dünya projesinde, hangi dil özelliklerini kullanacağınızı ve hangilerini kullanamayacağınızı yapay olarak sınırlamanız gerekir, böylece ilgili tüm geliştiriciler dilin aynı alt kümesini konuşabilir.

Fonksiyonel programlama için Scala'dan çok daha basit olan Clojure'u tercih ederim .

Kutsal savaş başlasın ;-)


2
Sadece Rich Hickey, JVM hakkında yaptığı gibi .Net'i önemsiyorsa ...
Job

Çok karmaşık olduğunu düşündüğünüz şeyler hakkında biraz daha fazla bilgi vermeniz yararlı olacaktır.
Richard Warburton

4
@Richard Warburton: Scala'nın karmaşıklığı (ya da Martin Odersky'nin belirttiği gibi, "Scala'nın gücü ve bir sorunu: genişletilebilirliği") birçok forumda yaygın olarak tartışıldı. Böyle bir tartışma burada . Ben karmaşık == kendi başına kötü demiyorum . Sorun programcılar en parlak% 1 Scala ile mucizeler yapmak mümkün olabilir iken, büyük çoğunluğu sadece "anlayan" gitmiyor olduğunu, ve bu ise gerçek dünya kullanımı için bir sorun. Formula 1 arabası gibi: insanların büyük çoğunluğu böyle bir canavarı süremez.
Joonas Pulakka

2
+1 Clojure'dan geçerli bir alternatif olarak bahsetmek için (fonksiyonel programlama söz konusu olduğunda).
Oliver Weiler

Clojure harika, ama Scala kadar performans mı? Tüm bu statik yazım olmadan yeniden düzenleme yapmak kolay mı? (Python'u yeniden düzenleme oldukça zor, örneğin - bunun için yeniden düzenleme yazdım.)
9000

13

Yaklaşık bir yıl önce, Java'yı kullanmaya devam edersem, başlangıç ​​ürünlerimin geleceği hakkında gittikçe daha fazla hayal kırıklığına uğradım, Scala'yı denemeye karar verdim. Zaten JavaScript ve Python'da programlama yapıyordum, Ruby de iyi bir alternatifti, ancak statik olarak yazılmış bir dil, tercihen JVM'de çalışabilen bir dil arıyordum.

Scala'yı gerçekten sevmeye çalıştım, gerçekten yaptım, ama kodunu tamamen çirkin ve anlaşılması zor buldum. Scala'nın Java'ya en iyi cevabımız olsaydı, o zaman kesinlikle sevmediğim bir dille çalışmaya devam etmemden kesinlikle mahsur kaldım ve ...

Neyse ki, çok sonra değil, Fantom'u öğrendim . Ah adamım, sevdim mi? Bana göre bu, Alman bürokrasisine Amerikanın görkemli cevabı gibiydi! Scala'da aradığım gereksinimlerle eşleşti, ama çok daha zarif . Bu vardı Vim , Eclipse ve Netbeans entegrasyonu, güzel bir web çerçevesi , olgun ürünler bunun, küçük ama son derece yararlı ile çalışan topluluk ... Dinamik ve Statik yazarak! Sevindim!

(Devam edebilirdim, ancak bu yazı Fantom ile değil Scala ile ilgili olacak, bu yüzden burada duruyorum. Tercihim açık , yine de ikisini karşılaştıran bu yazı var . Fantom'un Scala ile karşılaştırıldığında neden bu kadar az dikkat çektiğini asla anlayamadım. Ama görünüşe göre bu podcast'i [ mp3 ] sonuna kadar dinlerseniz sadece ben değilim .)


9

Başlangıçta 2 yıl önce Scala ile uğraştığımda, uzaylı ve korkutucu görünüyordu bana. Bir noktada, çekirdek dilin aslında Java'dan çok daha basit olduğunu keşfettim, ancak sözdizimi ve anlambilimi o kadar esnektir ki, bir makro özelliği olmadan bile, bunun gibi yeni dil yapıları oluşturabilirsiniz. O zamandan beri tüm Java projelerim için tamamen Scala'ya geçtim, çünkü çok fazla kaynak kodu olmadan yazmama izin veriyor.

Clojure'u seviyorum, ancak platformun statik bayt kodunu (Android, uygulamalar, ...) derlemenizi istediği durumlar var ve bunu yaparken Scala'da sadece orada.

Scala birçok sorunu işlevsel bir şekilde çözmenize izin verirken, genellikle sınıfları kullanmanın daha doğal hissettirdiği sorunları bulurum. Bu, işleri biraz daha karmaşık hale getirir, ancak C ++ 'ın karmaşıklıklarına ve acılarına yakın bir yerde değildir.

Dili öğrenmeye başladığımda benim için en büyük paket, sadece Java'da yaptığım, sadece gürültü olmadan (Groovy'a başladığınızda biraz gibi) programlayabiliyordum, ama sonunda gücün daha derinlerine dalmaya çalışmak istedin dilin - seninle birlikte büyür.

IDE sorusu hakkında: Her şey için Emacs kullandıktan sonra, tüm IDE sorunlarım gitti :-)


9

Scala'yı birçok nedenden dolayı seviyorum, ancak genellikle gözden kaçan bir şey var: basitliği.

Scala, örneğin Oberon kadar basit olmayabilir, ancak diğer bazı dillerden çok daha basittir. Scala Dil Spesifikasyonu ~ 160 sayfa, Java Dil Spesifikasyonu ~ 600 (sadece dil, JVM veya kütüphaneler değil!), ECMA-334 C # Dil Spesifikasyonu (AFAIK, Visual C # 2.0'ın bir alt kümesine karşılık gelir) ~ 440 sayfa (LINQ sorgu anlama, lambda ifadeleri, uzantı yöntemleri, genel eş ve karşıtlık, dynamicvarsayılan değerlere sahip isteğe bağlı bağımsız değişkenler, anahtar kelime bağımsız değişkenleri, vb. var). ECMAScript 5.1 için geçerli taslak bile ~ 210 sayfada daha büyük. Ve tabii ki, şu anki ISO Taslağı ~ 310 sayfa ağırlığında olan kendi "varsayılan" dilim olan Ruby, 1.8.8, 1.9.1 ve 1.9.2 kavşağının neredeyse alışılmadık derecede küçük bir alt kümesini belirtir.


6
Dil spesifikasyonundaki sayfa sayısı, karmaşıklığının ilginç bir ölçüsüdür. Scala'nın bu konudaki görüşlerini nasıl böldüğü şaşırtıcı. Kimse basittir ++ Python karmaşıktır veya C söyleyebilirim, ama Scala hem :-) örn gibi görünüyor scala-lang.org/node/7431
Joonas Pulakka

Dil ile karmaşık şeyler oluşturabilirsiniz ve bazıları dilmiş gibi görünecektir - alnum olmayan isimlere sahip, örneğin operatör aşırı yüklemesine benzeyen yöntemler.
kullanıcı bilinmiyor

2
Dil spesifikasyonundaki sayfa sayısı, iki dilin karmaşıklığını karşılaştırmak için KORKUNÇ bir yoldur. Sadece iki örnek vermek gerekirse: Java spec neredeyse öğretici bir şekilde yazılırken, Scala spec çok kısa bir şekilde yazılmıştır. Ya da başka bir örnek olarak, C # 2.0 aslında bugün Java kadar karmaşık veya "güvensiz" makineler, delegeler ve prpoerties göz önüne alındığında biraz daha karmaşıktı. Ama belirttiğiniz gibi C # 2.0 spec JLS daha küçüktür.
James Iry

1
Şimdi, Martin Odersky dillerin biçimsel gramer boyutlarını karşılaştırdı. Bu karmaşıklığın bir yönünün makul bir ölçüsüdür. Ancak bu sadece mantıklıdır, çünkü gramerler İngilizce kadar esnek değildir. O zaman bile dikkatli olmalısın. Sadece sıradan programlarla olarak, kolayca germek veya bunları hazırlamak konusunda farklı seçenekleriyle dilbilgisi küçültmek olabilir, farklı yapımlar kaç içerecek şekilde, karakter sınıfları, vb varsaymak ne taban
James Iry

3
bir dakika ne ? Neden özelliğin boyutuyla karmaşıklığı ölçmeye çalışıyorsunuz? Bu korkunç bir fikir.
smartnut007

9

İşte Scala hakkında berbat olan şey:

  • Boş gösterici, başlamak için oldukça kötü bir fikirdi. Hoare bunu "milyar dolarlık hatası" olarak adlandırdı, ancak Scala daha da kötü. Null, Null, None ve Nil adında nesneler vardır. null, Java ile birlikte çalışabilirlik içindir. Null, W3C DOM belirtimindeki null işaretçi formudur, Hiçbiri null ile değiştirilmemelidir ve Nil boş bir şeydir.

  • Dil yapıları hileli olduğu ortaya çıktığında, dili değil genellikle suçlayan programcıdır. Bununla birlikte, Scala'da temel dil zaten tek belgelenmiş davranışı "Bu bir hack'tir" olan kütüphane sınıflarını içermektedir. İnanmıyor musunuz? Scaladoc dosyasını scala.xml.Group için arayın.

  • Son olarak, Scala kötü bir şekilde belgelenmiştir. Resmi belgelerdeki neredeyse hiçbir scala sınıfı örnek kodla birlikte gelir. Scala'yı öğrenmek Java'dan çok daha zordur ve bilgisayar biliminde derin bilgi gerektirir.

Bir Scala-düşmanı ile karıştırılmamak için, işte aşkım:

  • Daha az istisnam var. Java ile etkileşim sırasında hiç bir ClassCastException ve çok az NullPointerExceptions vardı.
  • Kod Java'dan çok daha kısa ve daha özlü
  • Entelektüel olarak zordur. Java, karşılaştırıldığında bebek dili gibi hissediyor.

10
nullJava'nın boş göstergesidir, Null"türü" dir. bir ya da sıfır elemanlı bir koleksiyonun Noneolası bir "durumu" Option[T]dur. Nilboş bir listedir. Kulağa korkutucu gelmek istesen de öyle değil. Bu türler birbiriyle değiştirilemez veya değiştirilemez ve tam olması gerektiği gibi davranırlar.
soc

9

Scala olduğunu kompleksi. Kaçış yok! Sözdizimi son derece esnektir ve çeşitli şekillerde özelleştirilebilir (her şeyden önce operatörler / infix gösterimi) - ve tip sistemi bildiğim diğer dillerden daha farklı özelliklere sahiptir.

Yani işler örneğin Haskell: Typeclasses'taki gibi düz değildir.

Scala, işlevsel programlama, OO, prosedürel programlama ve java kütüphanelerini ve kendi fikirlerini bir araya getirmeye çalıştıkça, sonunda bir şekilde "aynı yönde" gibi görünen birçok kavramla karşılaşıyoruz :

  • Örtük değerler
  • Örtük işlevler
  • Existentials
  • Joker karakterler
  • özellikleri
  • Arayüzler
  • Soyut sınıflar
  • Vaka sınıfları
  • Yapısal tipler
  • Genel kısıtlamalar
  • Sınırları görüntüle
  • Anonim türler

Aralarında seçim yapmak ilk başta zor gibi görünüyor ve biri kolayca bir soruna doğru çözümü bulup bulmadığını merak edebilir . S'yi kötüye kullanarak hacky şeyler üretmek bile kolayca mümkündür implicit.

Ama ilginç olan şu: Scala çalışıyor. Bazen nedenini anlamak zor olabilir (özellikle hangi örtülü dönüşümler + kalıtım + ... bazı nesnelerin işlevselliği olduğunu anlamak X), ancak çoğu zaman bununla uğraşmak zorunda kalmazsınız.

Scala'yı olabildiğince basit yazın ve işe yarayacaktır. Mümkün olan her şeyle karıştırmayın ve sadece ihtiyacınız olanı kullanın. Ve bir şeye ihtiyacınız varsa, bir şekilde Scala'nın ona sahip olduğundan emin olabilirsiniz;)

Ve ne kadar iyi olursanız, Scala'yı operatörler, imalar, monadlar, korkak sözdizimi ile daha fazla özelleştirebileceksiniz ve nihayet sorununuzu mükemmel bir şekilde çözecek bir DSL'ye yakın bir şey elde edeceksiniz.

Sonuçta, her zaman daha temiz, daha kolay sözdizimi, tür çıkarım ve bazı fonksiyonel özelliklere sahip Scala'yı çok daha iyi bir Java olarak kullanma olanağına sahipsiniz.


1
"her şeyden önce operatörler / infix gösterimi" - sadece scala operatörlerinden yoksun. :) Bu sadece yöntemler.
kullanıcı bilinmiyor

6

Birçok yönden Java'dan daha basit olan mükemmel bir dildir.

Çoğu insan, Java programcısı olsun ya da olmasın, çoğu insan, programcı ya da değil, aynı zamanda yeni programlama dilleri öğrenmeyi sevmez. Bir programlama dili öğrenen çoğu insanın bunu öğrenmeyi bile sevmediğinden şüpheleniyorum.

Bir dilin C ++ kadar karmaşık olmasından endişe ediyorsanız, Clojure'dan veba gibi kaçınırım. Scala'nın Clojure'dan daha karmaşık olduğunu düşünmek, bir veya iki dil hakkında tamamen cahil olan insanlar için geri dönüş argümanı haline geldi.

Clojure'un makroları vardır, bu da dilin sözdizimini istediğiniz kadar değiştirebileceğiniz anlamına gelir ve size sadece "bir şeyler yapmanın sayısız yolu" değil, aynı zamanda neredeyse sonsuz sayıda şey yapma yolu verir. Ve programcıların makrolarla oluşturduğu bu yeni sözdiziminin hiçbiri dil spesifikasyonunun herhangi bir yerinde belgelenmeyecektir.

"Ama makro kullanmaktan kaçınabiliriz veya kodumuzda hangilerine izin verileceğini düzenleyebiliriz" diyorsunuz. Tebrikler, şimdi "hangi dil özelliklerini kullanacağınızı ve ne kullanmamanızı yapay olarak sınırlamanız" gerekiyor, bu da Scala Clojure'u kullanan gevezelik salakların Scala'yı başlamaktan kaçınma nedeni olarak kullandıkları şeydir.


6
Scala vs Clojure girişiniz için teşekkürler, ancak OP'nin gerçekten sorduğu şey bu mu?
Martin Wickman

İlginç nokta yeniden: makrolar. Ayrıca biraz endişe verici. Scala'da makrolar veya benzerleri mevcut mu yoksa tüm "yapay olarak sınırlanan" şey dikkat dağıtıcı mıdır?
Armand

1
Bu, orijinal sorunun cevabı yerine cevabımın bir yorumu gibi görünüyor. Katılıyorum, makrolar size sonsuz güç veriyor, bu yüzden yanlış kullanıldığında berbat. Yani, onları doğru kullanmalısınız (sadece gerektiğinde). Bu, dilin Clojure'un var olan en basit dillerden biri olduğu gerçeğini değiştirmez. Scala kesinlikle değil.
Joonas Pulakka

> Bu, Clojure'un dilin en basit olanlarından biri olduğu gerçeğini değiştirmez. <Bu, "dil kurgularının sayısı" gibi bir metrik kullanmıyorsanız, tamamen yanlıştır. Dilde programları okumanın ve yazmanın ne kadar kolay olduğu gibi yararlı bir şey kullanıyorsanız, Clojure en basitlerinden biri değildir.
Josh

Bu yüzden lütfen devam edin ve bize iyi bir dil karmaşıklığı metriği verin. "Dilde programları okumak ve yazmak ne kadar kolay" tamamen özneldir , bu yüzden burada gerçekten yardımcı olmaz. Yararlı ve objektif bir metrik bulmak neredeyse imkansız olabilir. (Örneğin, aşağıdaki Jörg W Mittag dil spesifikasyonundaki sayfa sayısını bir karmaşıklık ölçüsü olarak kullanmaktadır. Nesnel olsa da, bunun çok yararlı olduğundan emin değilim.)
Joonas Pulakka

4

Scala kütüphanesinin daha ayrıntılı türlerini gerçekten çok seviyorum. Yeni koleksiyon kütüphanesi iyi düşünülmüş gibi görünüyor. Ayrıca basit sınıflar için gerekli kod miktarını ve eklediği fonksiyonel kavramları nasıl azalttığını seviyorum. Türü çıkarımı da çok faydalıdır. Eğitim tekerlekleri olmadan Java gibi geliyor. Bir süre C # kullandıktan sonra, Scala aslında bir rakip gibi hissediyor, Java hala kullanışlı ama geride kalıyor.


2

Bir Java programcısı olarak başlangıçta Scala'yı ilginç buldum. Ancak, bir süre onunla dabbling sonra (ve zaten başkaları tarafından listelenen hemen hemen tüm pozitif / negatif içine çalışan), ona karşı çok "meh" hissediyordu. Dil geliştirmeleri, araç setlerinin daha az kullanılabilirliği ile dengelenir. Geçiş yapmak için belirleyici bir neden bulamadım. İyi, ama geçiş için bir dava açmak için "yeterince iyi" değil. Bu öznel heyecan faktörüne de sahip değil (Clojure gibi görünüyor).

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.