it-swarm.dev

İşlevsel bir programlama dili seçme

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

Son dönem dersim Şema ile tanıştım. Onu sevdim. Sözdiziminin aşırı basitliğini, homoiklik ilkesini, makroları ( hijyenik ve hijyenik olmayan), prosedürlerin n-aritesini vb.

Şema ile ilgili sorun, akademik bir dil olmasıdır. Üretim ortamlarında gerçekten kullanıldığını düşünmüyorum. Ben de özgeçmişimizde özellikle iyi olduğuna inanmıyorum. Yani, alternatifler arıyordum. Birçoğu var ve bir şekilde benzer bir popülariteye sahip gibi görünüyorlar.

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

  • Clojure: Kulağa harika geliyor çünkü Java dünyasına erişebiliyor, ölçeklenebilirlik ve eşzamanlılığa yöneliyor, ancak Java bir Edge sağda dünya değil) Zaten biliyorum Java oldukça iyi, ama JVM'ye bağlı olarak daha fazla enerji eklemek akıllıca olur mu?
  • Haskell: Çok takdir edilen bir dile benziyor, ama okuduğumdan daha çok akademik bir dil.
  • LISP: Sonsuza kadar beri var. Şema'dan sevdiğim şeylerin çoğuna sahip gibi görünüyor. Büyük bir topluluğu var. Bildiğim kadarıyla, muhtemelen endüstride en yaygın kullanılan fonksiyonel programlama dilidir (?).
  • F #: Gerçekten düşünmedim. MS şeylerinin büyük bir hayranı değilim. Yazılımları için ödeyecek param yok (onları üniversite ittifaklarından kurtarabilirdim, ama toplum odaklı çözümlere gitmeye daha meyilliyim). Yine de ... Sanırım kariyer odaklı en iyi seçim olurdu.

Bu gece, LISP'ye yaslanıyorum. Bir hafta önce Haskell'di. Ondan önce Clojure'du. Geçtiğimiz yıl, eğlenmek için bazı Şema yapıyordum, bildiğiniz nedenden dolayı zorlamıyordum. Şimdi ciddileşmek istiyorum (birini öğrenmek, onunla gerçek projeler yapmak, belki sonunda profesyonel olarak çalışmak hakkında). Benim sorunum, birini seçmeden önce hepsini derinlemesine öğrenmem gerekecek.

49
Joanis

pratik bir dil istediğiniz için:

alt text

Clojure ve F # 'a son zamanlarda ilgi duyulmasına rağmen, Haskell ve LISP'nin endüstride diğerlerinden daha fazla kullanıldığına dikkat edin.

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

alt text

Hmm, şu anda akademik bir dil gibi görünmüyor, değil mi?

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

İşte muhtemelen (biraz) daha fazla temsil eden başka bir grafik:

alt text

Şema'nın gerçekten tekmeleme lehçesini keşfetmek istiyorsanız, Raket.

36
Robert Harvey

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

Haskell programınızı yazdıktan sonra, istediğiniz dile getirmek için monad gibi araçlara ve noktasız kodlama gibi tekniklere sahip olacaksınız. Kavramlar özellikle Şema ile eşleşiyor gibi görünüyor.

18
Larry Coleman

Aslında, Scheme'de oldukça karmaşık bir sistem uygulayabilseydiniz, muhtemelen çalışmak istediğiniz şirketlerde oldukça arzulanırsınız. Kariyerimin başlarında, Scheme'de oldukça fazla iş yapan bazı öğrencilerle karşılaştım ve dezavantaj olan tek zaman, çalışmalarını açıklayamadıkları veya temel verileri uygulamak için yeterince iyi anlamadıkları zamandı. yapılar ve algoritmalar makul bir süre içinde. Her zaman adayların bu tür soruları tercih ettikleri dilde cevaplamasına izin veriyorum; Bağlantılı bir listeye bir eleman eklemek gibi, kolay anlaşılan şeylerle biraz mücadele etmeyi başaran Scheme'de en iyi olduklarını düşünen bazı insanlarla karşılaştım.

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

Bir "blub" dükkanında röportaj yapıyorsanız ve geliştiriciler sadece Scheme veya Haskell veya F #'daki uzmanlığınız nedeniyle garip olduğunuzu düşündüyse, muhtemelen orada çalışmak istemezsiniz. Çoğu durumda, yetkili geliştiriciler konser seçimlerini alırlar, bu yüzden gelecekte hayal edebileceğiniz tek seçenek kurumsal olmadıkça "pratikliği" terlemeyin. Yetkin, esnek ve yıkıcı problemler üzerinde çalışın.

Üniversite pratiklik ile ilgili değildir. Bu, keşfetmek ve öğrenmek için güvenli bir ortam yaratmakla ilgilidir. Aslında, kariyerinizin geri kalanı için sıradan bir yazılım yazsanız bile yararlıdır.

Bununla birlikte, neden bu seçeneklerden sadece biriyle sınırlamak istediğinizi anlamıyorum. Yaklaşık 4 hafta içinde dillerin dördünü kolayca anlayabilir, ardından mevcut kaprislerinizle en iyi şekilde bu ağlara konsantre olmak için bir dil seçebilirsiniz. Ardından seçeneklerinizden birine geri dönün ve benzer bir şey uygulamayı deneyin. 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ız sürece, henüz uzman olmanıza gerek yok.

Şema, F #, Emacs LISP ve Common LISP'de bazılarını yazdım ve en azından ara sıra son birkaç yılda en az biraz Haskell okudum. Hiçbirinde uzman olduğumu söyleyemem, ancak bu dillere yapılan her gezi, profesyonel olarak çalıştığım tüm diğer dillerde (C #, Java, Ruby ve bazen Boo, Perl ve Python) bana fayda sağladı. Merak sizi her şeyden daha kalıcı ve tatmin edici bir kariyer inşa edecektir.

16
JasonTrue

Bir süredir Haskell'e girdim, ancak geldiğim sonuç biraz fazla akademik olduğuydı. Pratik bir şey yapmak çok zordu. Saf işlevsel bir dilde, IO gibi şeyler modele tam olarak uymuyor, bu yüzden monadlarla başa çıkmak zorundasınız. zar zor yetkin olmak için devam ettim.

Scheme'yi üniversitede yaptım. Kulağa önemsiz gelebilir, ancak tüm parens gerçekten dikkat dağıtıcı/can sıkıcıdır. Python gibi dilleri kullandıktan sonra buna geri dönmek zor.

Son zamanlarda F # keşfetmek. İşlevseldir, ancak istediğiniz zaman zorunlu ve nesne yönelimli de olabilir. Bu, herhangi bir .NET kütüphanesini kullanabilmenin yanı sıra, saf fonksiyonel parçalarınızı GUI'ler, IO ve ağ oluşturma gibi) ile daha pratik şeylerle kolayca karıştırmanızı sağlar. F #.

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

10
Erik

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

Ben daha sonra mükemmel bir seçim olduğunu kanıtladı Clojure toplama sona erdi.

Genel olarak konuşursak temel nedenler:

  • Kütüphane ekosistemi - bir dilin yararlı olması için iyi kütüphanelere erişmeniz gerekir. JVM'de olmak, en büyük açık kaynak kütüphanesine ve araç ekosistemine kolay erişiminiz olduğu anlamına gelir, bu nedenle JVM diline gitmek pragmatik bir bakış açısıyla beyinsizdir. Scala burada da yüksek puan aldı.

  • Makro-metaprogramlama - LISP'nin bu yönü her zaman bana hitap etti, özellikle de biraz kod üretimi yapmayı beklediğimden. Paul Graham'ın kısa denemesinde yapılan argümanları çok takdir ettim " Ortalamaları Dayak ". Çeşitli Lisps burada güçlü bir şekilde gol attı.

  • Performans "yeterince iyi" idi - Clojure her zaman derlenir ve JVM JIT iyileştiricisinin ve mükemmel GC'nin avantajlarından yararlanır. Her zaman olduğu gibi, işlevsel bir dil kullanmanın bazı yükleri vardır, ancak Clojure ile her birinin biraz çaba ile Java hızına yakın olabileceğiniz açıktı (Clojure Java ilkel ve isteğe bağlı ihtiyacınız olan durumlar için statik yazım). Tahminim, Clojure'un optimize edilmiş Java veya C++ kodu ile elde edebileceğinizden 2-5x daha yavaş olduğu ve hatalı ölçütler ve daha fazlasında gördüğünüzle tutarlı olduğu. Bu boşluğun daha da daralmasını bekliyorum. Ayrıca, saf Java içine özellikle performansa duyarlı kod yazmak ve 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çıklamak biraz zor, ama bu video mükemmel prensiplerin tadını çıkarmak. Bence Clojure şu anda "işlevsel bir programlama dilinde paylaşılan, eşzamanlı ve değiştirilebilir durumu nasıl yönetmelisiniz?".

  • Dil tasarımı - Clojure IMO çok iyi düşünülmüş bir dil tasarımıdır. Örnekler, düzenli LISP parantezlerine ek olarak vektör [] ve map {} değişmez değerlerine sahip olmak, değişmez kalıcı veri yapılarının kullanılması, sekans soyutlaması yoluyla dil boyunca tembellikleri desteklemek ve programcıya farklı sorunları çözmek için çeşitli dikey özellikler sağlamaktır. . Bakınız soyutlama sanatı ve basitleştirmek kolay .

  • Topluluk - her zaman öznel, ama Clojure topluluğunda gördüklerimi beğendim. Tutum çok yararlı, yapıcı ve pragmatik oldu. Muhtemelen bir çok Clojure insanının (Rich Hickey de dahil olmak üzere) karmaşık kurumsal sistemlerin arka planından geldiği gerçeğini yansıtan güçlü bir "işleri halletme" vurgusu vardır. Clojure topluluğunun Java topluluğuyla da güçlü bağlantıları olması, Clojure'un bir "niş" e takılma riskini taşımayacağına ikna etmede önemliydi.

Clojure küçük dezavantajı birkaç isim olsaydı, bunlar 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 ticaret yapacağımı düşünüyorum. Çoğunlukla bu, iyi bir otomatik test paketine sahip olarak hafifletilir, ancak türlerinizin derleyici tarafından statik olarak doğrulanmış olmasını isterseniz, Haskell veya Scala daha fazla çay bardağı olabilir.

  • Son Teknoloji - Clojure çok hızlı gelişiyor ve çok fazla yenilik var - bunun dezavantajı, çok fazla deneme, bazı kütüphaneler olması ve araçlar hala olgunlaşmamış ve göz önünde bulundurmanız gereken Clojure ana sürümleri arasında ara sıra kırılan değişiklikler var.

Genel olarak, mükemmel ve pragmatik modern işlevsel bir dil istiyorsanız Clojure ile yanlış gidebileceğinizi sanmıyorum!

9
mikera

Ödevinizi yapmış gibi görünüyorsunuz, muhtemelen bunu zaten biliyorsunuzdur, ancak Şema, tıpkı Common LISP gibi LISP'in bir lehçesidir. Şema hakkında pek çok şeyden hoşlanıyorsanız, ancak akademik doğasından hoşlanmıyorsanız, Ortak LISP'yi deneyin. TIOBE indeksi göre, 26. pozisyondaki 13. en popüler dil.

Bahsettiğiniz dillerden bazıları, yakın zamanda gördüğüm iş tanımlarında yer alıyor, ancak bu sadece küçük örnek setim olabilir. O dili doğrudan işimde kullanmayı beklemiyor olsam da şahsen Haskell'i öğreneceğim. Fonksiyonel programlama kavramları benim için gelecekteki program tasarımları için dilin doğrudan pazarlanabilirliğinden daha değerlidir.

6
Zeke