İşlevsel bir programlama dili seçimi [kapalı]


48

Son zamanlarda fonksiyonel programlama dilleri hakkında birçok konu okudum (neredeyse geçen sene aslında). Gerçekten bir tane seçip iyice öğrenmek istiyorum.

Son [ders] sömestr, Scheme ile tanıştırıldım. Onu sevdim. Sözdiziminin aşırı basitliği, homoiklik ilkesi, makrolar ( hijyenik ve hijyenik olmayan), prosedürlerin netliği vs.

Düzeni ile sorun akademik bir dildir. Üretim ortamlarında gerçekten kullanıldığını sanmıyorum. Özgeçmişimizde olmanın özellikle iyi olduğuna inanmıyorum. Bu yüzden alternatifler arıyordum. Birçoğu var ve bir şekilde hepsinin benzer bir popülaritesi var gibi görünüyor.

Düşündüğüm diğer bazı fonksiyonel diller hakkında bazı düşünceler:

  • Clojure: Kulağa hoş geliyor çünkü Java dünyasına erişebilir, ölçeklenebilirlik ve eşzamanlılığa yöneliktir, ancak Java dünyası şu anda bir kenarda değil mi? Java'yı zaten çok iyi tanırım, ancak JVM'ye bağlı olarak daha fazla enerji eklemek akıllıca olur mu?
  • Haskell: Çok takdir görmüş bir dil gibi görünüyor, fakat okuduklarımdan daha çok akademik bir dil.
  • Lisp: Sonsuza dek buralardaydı. Scheme'den sevdiğim şeylerin çoğuna sahip görünüyor. Büyük bir topluluğu var. Bildiğimi düşündüğüm için, muhtemelen endüstrideki en yaygın kullanılan işlevsel programlama dilidir (?).
  • F #: Gerçekten düşünmedim. Ben MS’lerin büyük bir hayranı değilim. Yazılımları için ödeyecek param yok (Onları üniversite ittifaklarından kurtarabilirdim, ama daha çok topluluğa dayalı çözümlerle çalışmaya meyilliyim). Rağmen ... Sanırım en iyi kariyer odaklı seçim olurdu.

Bu gece, Lisp'e yaslanıyorum. Bir hafta önce Haskell'di. Ondan önce Clojure'du. Geçen yıl, bildiğiniz nedenlerden dolayı zorlamak yerine eğlenmek için bazı Şemalar yapıyordum. Şimdi ciddi olmak istiyorum (birini öğrenmek, onunla gerçek projeler yapmak, belki de profesyonel olarak çalışmakla ilgili). Benim sorunum, birini seçmeden önce hepsini derinlemesine öğrenmem gerekecek.


5
Neyi seçerseniz seçin, içindeki bir şey için kullandığınız birçok kodu yazın.

8
Scala hakkında bir fikir vermedin mi?
ykombinator

@ ykombinator: Bunu duydum ama daha fazla aramadım. Listede yer alanlardan daha fazla teklif verecek bir şey olup olmadığını bilmiyorum veya belki de her birinden ilginç seçeneklerin bir kombinasyonunu getirebilir ... Bilmiyorum. Bana oldukça düşük profilli bir dil gibi geliyor, ancak popülerlik kazanıyor gibi görünüyor.
Joanis

1
Java dünyasının "en üstte" olduğunu nereden duyduğunuzu bilmiyorum - şu anda büyük bir rönesans geçiriyor, büyük ölçüde şunun sayesinde: a) OpenJDK standart uygulama haline geliyor b) Scala ve Clojure ve c) gibi yeni JVM dilleri büyük veri / bulut projelerinin hedef platform olarak JVM seçimini arttırması ve d) Android. 2012'nin başından itibaren, muhtemelen en heyecan verici olan tek platform .....
mikera

1
@mikera: Kabul etti. Bu, bir yıldan uzun bir süredir, Oracle Sun Microsystems'ı kazandıktan hemen sonra ve Java'nın geleceği konusunda daha kontrol edici bir şirket tarafından kontrol altında tutulan endişeler ve spekülasyonlar vardı ... JVM şu anda oldukça güvenli gözüküyor!
Joanis

Yanıtlar:


35

Pratik bir  dil istediğinizden beri :

alt metin

Haskell ve Lisp’in sektördeki diğerlerinden daha fazla kullanıldığına dikkat edin, ancak Clojure ve F #’ya yeni ilgi duydum.

Fakat şema karışıma eklediğimizde ne olduğuna bakın:

alt metin

Hmm, artık bir akademik dile benzemiyor, değil mi?

Aslında, yukarıdaki grafik muhtemelen bir yalandır; "şema" kelimesi, programlama dillerinin yanı sıra diğer bağlamlardaki reklamlarda aranan reklamlarda da görünebilir. :)

Yani burada muhtemelen (biraz) daha temsili olan başka bir grafik var:

alt metin

Eğer Scheme'nin gerçekten teke tek bir lehçesini keşfetmek istiyorsanız, Racket'e bir göz atın .


Vay, güzel yazı. Raket tam olarak kullandığım şey ... PLT-Scheme öğrenmeye başladığımda adıydı. Son grafiğin içindeki kırmızı çizgi beni rahatsız ediyor. Scheme'nin bu kadar fazla kullanılabileceğini asla düşünmedim. Ve Clojure kesinlikle kalkıyor gibi görünüyor. Hmm ...
Joanis

@M. Joanis: Son iki grafiğe bir tane tuz serpin; merdivenlerin görünüşü ve son grafiğin oynaklığı, birisinin dillerin ödemeye değer olduğunu düşündüğünü gösterse de, grafikte çok fazla veri noktası olmadığını gösteriyor.
Robert Harvey,

@ Robert Harvey, ikinci grafikten üçüncü grafiğe ne değişti?
sistemovich

@ Geoffrey: Başlıklara bakın; Arama sözcüğüne "developer" kelimesini ekledim.
Robert Harvey,

Haskell ve Lisp'in de eşcinsel olduğunu ve Indeed'in verilerinin dünyanın geri kalanına genellemediğine dikkat edin. ITJobsWatch, 79 Scala işini, 55 F #, 47 Haskell, 30 Lisp ve 7 Clojure işini listeler.
Jon Harrop

17

İşlevsel programlamayı öğrenmek istiyorsanız, önce Haskell'i öğrenmek için daha iyi hizmet verebilir, ardından istediğiniz dili kullanın. Diğer dilleri kullanarak fonksiyonel programlamayı öğrenebilirsiniz, ancak yine de zorunlu ve nesne yönelimli kod için izin verir. Haskell'de gerçek bir program yazarsanız, işlevsel programlamayı daha hızlı öğreneceksiniz çünkü diğer paradigmalar geriye düşmek için uygun olmayacak.

Haskell programınızı yazdıktan sonra, monadlar gibi araçlara ve noktaya kodlama gibi teknikleri seçtiğiniz dile getireceksiniz. Kavramlar özellikle Şema ile iyi eşleşiyor gibi görünüyor.


Önce saf bir fonksiyonel dil seçmekte haklısın. İşlevsel dillerin saflıkla sıralandığını görmeyi çok isterdim.
Joanis

@M. Joanis: Sorunuzda listelenen dillerden, Haskell'in en saf olduğunu söyleyebilirim, bunu Clojure, F # ve Lisp izler.
Larry Coleman,

15

Aslına bakarsanız, Scheme'de oldukça karmaşık bir sistem uygulayabilseydiniz, muhtemelen çalışmak isteyeceğiniz firmalarda oldukça arzulanırsınız. Daha önce kariyerimde Scheme'de adil miktarda iş yapmış bazı öğrencilere rastladım ve tek dezavantaj olan tek şey, çalışmalarını açıklayamadıkları ya da temel verileri uygulamada yeterince iyi anlamadıkları zamanlardı. makul bir süre içerisinde yapılar ve algoritmalar. Adayların her zaman bu tür soruları tercih ettikleri dilde cevaplamasına izin veririm; Ben, beni şaşırtan bağlantılı bir listeye bir eleman eklemek gibi, kolay olması gereken şeylerle biraz mücadele etmeyi başaran Scheme'de en iyi olduklarını düşünen bazı insanlarla karşılaştım.

Ancak, ortalama bir web uygulaması bile yazmak için yeterince iyi bir Şema "almak" mümkün olsaydı, bu en ciddi yazılım şirketlerinde oldukça iyi bir satış noktası olurdu.

Bir "blub" mağazasında röportaj yapıyorsanız ve geliştiriciler Scheme veya Haskell veya F # 'daki uzmanlığınız nedeniyle garip olduğunuzu düşünüyorlardı, muhtemelen orada çalışmak istemezsiniz. Çoğu durumda, yetkin geliştiriciler gösterileri seçerler, bu nedenle geleceğinizde hayal edebileceğiniz tek seçenek şirket olmadıkça "pratiklik" terletmeyin. Yetkin, esnek ve yıkıcı problemler üzerinde çalışın.

Üniversite pratiklikle ilgili değil. Keşfetmek ve öğrenmek için güvenli bir ortam yaratma hakkında. Bu, aslında kariyerinizin geri kalanı için sıradan bir yazılım yazsanız bile faydalıdır.

Olduğu söyleniyor, neden bu seçimlerden sadece biriyle sınırlandırmak istediğinizi anlayamıyorum. Dört haftada dört dilde kolayca anlaşılabilinir, sonra mevcut kafeslere en iyi şekilde odaklanmak için bir tane seçebilirsiniz. Sonra seçeneklerinden birine geri dön ve benzer bir şey uygulamaya çalış. Daha karmaşık bir şeye geçin ve seçeneklerinizi tekrar düşünün. Deneme iyidir. Gelecek ay geçimini sağlamaya çalışmadığın sürece, henüz bir uzman olmana gerek yok.

Bazılarını F #, Emacs Lisp ve Common Lisp'te yazdım ve en azından son birkaç yılda en azından biraz Haskell okudum. Hiçbirinde uzman olduğumu söyleyemem, ancak bu dillere yapılan her gezi, profesyonel olarak çalıştığım diğer tüm dillerde (C #, Java, Ruby ve bazen Boo, Perl ve Python) çok faydalı oldu. Merak size her şeyden daha kalıcı, tatmin edici bir kariyer sağlayacaktır.


2
"Merak, seni her şeyden daha kalıcı, tatmin edici bir kariyer haline getirecek." Bu ifade çok ilham verici. Haklısın. Çok acelem var. Her zaman öğrenmenin çok fazla zaman alacağını hissediyorum ... 12 yıl öncesine kadar gidebilirsem, başladığımda, zamanımın tamamını VB ve C ++ ile harcamamayı bilirim. Bu yıllar çok kötü harcanmış gibi hissediyorum. Yeterince merak etmedim Bir şeyler kodlamak istedim. Bildiğim dilleri kullanmak yeterliydi. O zaman adil bir miktar bildiğimi sanıyordum, ama bu korkunç bir durum değildi.
Joanis

10

Bir süre Haskell'e daldım, ancak geldiğim sonuç biraz fazla akademik olduğu yönünde oldu. Pratik bir şey yapmak çok zordu. Saf bir işlevsel dilde, IO gibi şeyler modele tam olarak uymuyor, bu yüzden monadlarla uğraşmak zorundasınız. Çok az yetkin olmak için çok fazla zaman harcamam gerektiğine karar verdim.

Scheme'yi üniversitede yaptım. Sesi önemsiz görülebilir, ancak tüm parenler gerçekten rahatsız edici / rahatsız edicidir. Python gibi dilleri kullandıktan sonra tekrar geri dönmek zor.

Son zamanlarda F # 'yu keşfediyorum. İşlevseldir, ancak istediğiniz zaman zorunlu ve nesne yönelimli de olabilir. Bu, herhangi bir .NET kütüphanesini kullanabilmenin yanı sıra, saf işlevsel parçalarınızı GUI'ler, IO ve ağ oluşturma gibi daha pratik şeylerle kolayca karıştırmanızı mümkün kılar. F # bağımsız bir sürümünü alabilirsiniz.

http://www.microsoft.com/downloads/en/details.aspx?FamilyID=effc5bc4-c3df-4172-ad1c-bc62935861c5&displaylang=en


F # ve Clojure'un tamamen işlevsel olmadığı gerçeği onların lehine önemli bir rol oynamaktadır. Belki F # bir gün .Net ailesine giriş
noktam olabilir

1
@MJoanis, F # 'ya karşı bir puan olarak maliyeti belirttiniz, ancak Erik'in işaret ettiği gibi, tamamen ücretsiz alabilirsiniz.
Benjol

Şartları doğru okuduysam, temel olarak, kullanmamak (veya lisans satın almak) koşuluyla ücretsiz olarak alırsınız. Ancak, Visual Studio'yu kullanan bir şirkete girme ihtimalim olması durumunda öğrenmenin hala çok iyi bir şey olabileceğini biliyorum. Ben daha özgür bir işlevsel programlama dili ile işlevsel olduğumda muhtemelen bir deneyeceğim.
Joanis

1
@M. Joanis: Hayır, F # açık kaynak kodlu ve hatta Mono'yu diğer platformlarda çalıştırmayı deneyebilirsiniz.
Jon Harrop

Belki 2010'dan bu yana zaman değişti, ancak son birkaç ay içinde haskell öğrenmeye başlayan biri olarak, haskell'de G / Ç yapmak zor değil. Temel şeyler için, sadece bazı yeni sözdizimi öğrenmeye ihtiyacınız var. Gerçek temel anlayışı edinmek birkaç hafta alır, ama cümlenin monadlarla ilgili olduğunu gerçekten görmüyorum. Derslerden, örneklerden, statik üyelerden ve OOP'daki diğer devletle ilgili cazlardan daha fazla öğrendiklerini sanmıyorum.
sara,

9

Tüm büyük fonksiyonel dilleri bir veya iki yıl önce pratik, genel amaçlı bir işlevsel programlama dili istemek açısından değerlendirdim.

Sonunda mükemmel bir seçim olduğunu kanıtlayan Clojure'u seçtim .

Genel olarak konuşursak anahtar nedenler şunlardı:

  • Kütüphane ekosistemi - bir dilin kullanışlı olması için iyi kütüphanelere erişmeniz gerekir. JVM'de olmak demek, en büyük açık kaynak kodlu kütüphane ve araç ekosistemine kolayca erişebilmeniz anlamına gelir, bu nedenle JVM dilini kullanmak pragmatik bir perspektiften akıl almazdı. Scala ayrıca burada yüksek puan aldı.

  • Makro-metaprogramlama - Lisp'in bu yönü bana her zaman çekici geldi, özellikle de biraz kod üretmeyi umduğumdan beri. Paul Graham'ın " Averajları Yenerek " adlı kısa makalesinde yapılan tartışmaları çok takdir ediyorum . Çeşitli Lisps'lar burada güçlü bir şekilde gol attı.

  • Performans "yeterince iyi" idi - Clojure her zaman derlenir ve JVM JIT optimizatörü ve mükemmel GC'nin avantajlarından yararlanır. Her zaman olduğu gibi, işlevsel bir dil kullanmakta bazı ek yükler var ancak Clojure ile her biri biraz çabayla Java hızına yakın olabileceğiniz belliydi (Clojure, Java ilkellerini ve ihtiyaç duyduğunuz durumlar için isteğe bağlı statik yazmayı destekler). Tahminime göre Clojure, hatalı ölçütlerde gördüğünüzle tutarlı olan optimize Java veya C ++ koduyla elde edebileceğinizden 2-5 kat daha yavaş , ve zamanla bu boşluğun daha da daralmasını bekliyor. Ayrıca, özellikle performansa duyarlı kodu yalnızca Java ile yazıp Clojure'dan çağırmak yeterince kolaydır.

  • Eşzamanlılık - Clojure, özellikle çok çekirdekli eşzamanlılık için eşzamanlılığa oldukça benzersiz ve güçlü bir yaklaşıma sahiptir. Açıklaması biraz zor, ama bu video ilkelerin tadına varmak için mükemmel . Clojure'nin şu an zor soruya en iyi cevabı verdiğini düşünüyorum: "işlevsel bir programlama dilinde paylaşılan, eşzamanlı ve değişken durumu nasıl yönetmelisiniz?"

  • Dil tasarımı - Clojure IMO, çok iyi düşünülmüş bir dil tasarımıdır. Örnekler normal Lisp parantezlerine ek olarak vektör [] ve map {} değişmezlerine sahip olmaları, değişmez kalıcı veri yapılarının kullanımı, dizi soyutlama yoluyla dil boyunca tembelliklerin desteklenmesi ve programcıya farklı sorunları çözmek için çeşitli ortogonal özellikler sağlamaktır. . Soyutlama sanatını görün ve basitleştirin .

  • Topluluk - her zaman öznel, ama Clojure topluluğunda gördüklerimi beğendim. Tutum çok yararlı, yapıcı ve pragmatikti. Pek çok Clojure insanının (Rich Hickey de dahil olmak üzere) karmaşık işletme sistemlerinin kurulmasından kaynaklandığı gerçeğini yansıtan güçlü bir "işlerin yapılmasına" vurgu var. Clojure topluluğunun Java topluluğuyla da güçlü bağları olması, beni Clojure'un bir "niş içinde" kalma riskini taşımayacağı konusunda ikna etmede önemliydi.

Clojure'un birkaç küçük dezavantajını adlandırmak zorunda kalsaydım, bunlar şöyle olurdu:

  • Dinamik yazma - genellikle bu verimlilik açısından bir avantajdır, ancak ortalama olarak bunu daha güçlü tip kontrolü ve çıkarımı için takas edeceğimi düşünüyorum. Çoğunlukla bu iyi bir otomatik test paketi ile azaltılabilir, ancak derleyiciniz tarafından statik olarak onaylanmış türlerinizden hoşlanıyorsanız Haskell veya Scala daha çok sizin çayınız olabilir.

  • Son teknoloji - Clojure çok hızlı bir şekilde gelişiyor ve birçok yenilik var - bunun dezavantajı, çok sayıda deneme yapılması, bazı kütüphanelerin ve araçların hala olgunlaşmamış olmaları ve Clojure'un önemli sürümleri arasında ara sıra kırılma değişiklikleri olması. göz kulak olmam gerekiyor.

Genel olarak, mükemmel ve pragmatik bir modern fonksiyonel dil istiyorsanız, Clojure ile başa çıkabileceğinizi sanmıyorum!


1
Teşekkürler! Harika yazı! Ben sadece bugünlerde, yoğun olarak ağaçlara ve özyinelemeye dayalı bir şirket içi proje için kullanmayı düşünüyorum. Artı, burada Clojure ile tekrar kullanabileceğimiz oldukça fazla Java kodu var.
Joanis

6

Ödevini yaptın gibi gözüküyor, muhtemelen bunu zaten biliyorsun, ama Scheme, Lisp'in aynen Common Lisp'in lehçesi. Şema hakkında birçok şeyden hoşlanıyorsanız, ancak akademik yapısından hoşlanmıyorsanız, Common Lisp'i deneyin. Göre TIOBE endeksi , bu konum 26'da Planı vs 13. En popüler bir dil.

Bahsettiğiniz dillerden bazıları, son zamanlarda gördüğüm iş tanımlarında görünüyor, ancak bu benim küçük örnek setim olabilir. Şahsen işimde bu dili kullanmayı beklemiyor olmama rağmen, Haskell'i öğreneceğim. İşlevsel programlama kavramları gelecekteki program tasarımları için dilin doğrudan pazarlanabilirliğinden daha değerli.


TIOBE bağlantısı için teşekkürler, bu ilginç bir referans. Fonksiyonel programlama açısından saflığı için Haskell'i seçtiğinizi sanıyorum.
Joanis

1
@ M.Joanis: Çok fazla, Lisp'i de sonradan almayı düşünüyorum. Bkz. Programmers.stackexchange.com/questions/18838/…
Zeke

Seçilen cevap çok anlamlı. Saflık, tüm işlevsel paradigma olayını gerçekten anlayana kadar gitmenin yolu gibi görünüyor.
Joanis
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.