İşlevsel Programlama artıyor mu?


42

Son zamanlarda fonksiyonel programlama dillerinin popülerlik kazandığını fark ettim . Geçenlerde Tiobe Endeksinin popülaritesinde geçen yıla göre nasıl bir artış gösterdiğini gördüm, ancak çoğu bu endekse göre en popüler 50 dile bile ulaşamadı.

Ve bu bir süredir böyle olmuştur. İşlevsel programlama basitçe diğer modellerde olduğu kadar popüler olmamıştır (örneğin, nesne yönelimli programlama).

Bununla birlikte, işlevsel programlamanın gücüne yeniden doğmuş bir ilgi gördüm ve şimdi çok çekirdekli insanlar gittikçe daha popüler, geliştiriciler geçmişte zaten Haskell ve Erlang gibi diller tarafından keşfedilen diğer eşzamanlılık modellerine ilgi göstermeye başladı.

Önemli bir ilgiyle, toplumun kabul görmemesine rağmen, bu türden daha fazla dilin ortaya çıkmaya devam ettiğini görüyorum. Clojure (2007), Scala (2003), F # (2002) son 10 yılın sadece üç örneği.

Haskell ve Scala'yı öğrenmek için biraz zaman harcadım. Ve uzun zamandır orada olmamıza rağmen benim için yeni olan paradigmada büyük potansiyel buluyorum.

Ve elbette, benim en büyük sorum, bunlardan herhangi birinin kendilerine çaba sarf etmeyi düşünecek kadar popüler hale gelip gelmeyeceğidir, ancak bu, bütün bu telaşlı insanların onlarla uğraşmasına rağmen, Mandrake'in bile cevaplayamayacağı bir sorudur.

Sormak istediğim şey:

  • Hangi senaryolarda, verilen bir işi yapmak için daha uygun fonksiyonel bir programlama dili düşünmeliyim? Paralel programlama çok yakın zamanda popüler multicore sorunu yanında.
  • İşlevsel bir programlama diline geçmeye karar verirsem, karşılaşabileceğim en büyük tuzaklar hangileridir? (Paradigma değişiminin yanı sıra tembel değerlendirme nedeniyle performansı değerlendirme zorluğunun yanı sıra).
  • Bu kadar çok işlevsel programlama dili varsa, ihtiyaçlarınıza en uygun olanı nasıl seçersiniz?

Daha fazla araştırma için herhangi bir tavsiye memnuniyetle karşılayacaktır.

Web'i görüşler için araştırdım ve görünüşe göre bu yenilenen popülerliğin hepsi Moore Yasası'nın duvarına çarpmak üzere olduğumuz ve işlevsel programlama dillerinin gelip kahramanca bizi kurtaracağı fikrinden geliyor. Ancak bu durumda, paradigmaya adapte olan mevcut popüler dillerin daha fazla olasılıkları olduğunu söyleyebilirim.

Bazılarınız, belki de bu dillerle her gün daha fazla deneyime sahip, belki de konuyla ilgili daha fazla bilgi sunabilir. Tüm görüşleriniz daha iyi takdir edilmeli ve dikkatle değerlendirilmelidir.

Şimdiden teşekkürler!


4
Bu Erlang, Earlang değil (yayınınızı düzenledim, ancak Sistem 1 harfli düzenlemelere izin vermiyor).
quant_dev

6
Söylemeye değer - işlevsel ve zorunlu diller arasında kesin bir çizgi yoktur. ML aile dilleri yan etki içermez ve zorunlu ifadeleri ve yapıları ve değişken değişkenleri destekler. Bazı zorunlu diller - başımın üstünden Python ve Javascript - işlevsel programlamadan alınan önemli özelliklere sahiptir. Şahsen, genel kullanıma yönelik kullanımda daha işlevsel fikirler görmeyi umuyorum - özellikle desen eşleştirme.
Steve314

1
İşlevsel diller için ortak birkaç özelliğe sahip olmak bir dili mutlaka "işlevsel" yapmaz. İşlevsel programlama, belirli dil özellikleri ile ilgili olduğu kadar, programları düşünmenin ve tasarlamanın bir yoludur.
mipadi

2
@mipadi - ve bu nedenle, işlevsel felsefeyi herhangi bir dilde, mevcut araçların izin verdiği ölçüde uygulayabilirsiniz. İşlevsel stil kodunu Python'da (sınırlar dahilinde) yazabilirsiniz ve bu ölçüde Python işlevsel bir dildir. Ve zorunlu stil kodunu ML'ye yazabilirsiniz ve bu ölçüde ML zorunlu bir dildir. Bu, "kötü programcılar Fortran'ı herhangi bir dilde yazabilir" ile tamamen aynı değildir, ancak açıkçası bu benim fikrimi yanlış anlarsanız, içine düşmek kolay bir tuzaktır.
Steve314

1
@mipadi - eğer zorunlu dil tüm normal işlevsel yapılara sahip olsaydı, onunla işlevsel bir dilde yapabileceğin her şeyi yapabilirsin - boşluk kapanacaktı ve soru, bunun yerine "bunu yapmanın en iyi yolu" olurdu. "işlevsel / zorunlu yöntem nedir". ML ailesi zaten gerçekten, bu boşluğu kapattı ama çünkü denilen fonksiyonel, biz fonksiyonel tarzda yerine sadece iyi tarzı olarak kendi tarzı düşünüyorum.
Steve314

Yanıtlar:


24

Hangi senaryolarda, belirli bir görevi yerine getirmek için daha uygun fonksiyonel bir programlama dilini düşünmeliyim? Paralel programlama çok yakın zamanda popüler multicore sorunu yanında.

Bir dizi dönüşüm adımını kullanarak, türetilmiş veri elemanları dizisinin oluşturulmasını içeren herhangi bir şey.

Temel olarak, "elektronik tablo sorunu". Bazı ilk verilere ve bu verilere uygulanacak satır satır hesaplamalar var.

Üretim uygulamalarımız bir dizi istatistiki veri özetlemektedir; Bunların hepsi işlevsel olarak en iyi şekilde ele alınmıştır.

Yaptığımız en yaygın şey, üç canavarca veri kümesi arasında bir eşleşme. SQL birleşimine benzer, ancak genelleştirildiği gibi değildir. Bunu birkaç türetilmiş veri hesaplaması takip eder. Bunların hepsi sadece işlevsel dönüşümlerdir.

Uygulama Python ile yazılmıştır, ancak jeneratör fonksiyonları ve değişken adı verilen değişmezler kullanılarak fonksiyonel bir tarzda yazılmıştır. Alt seviye fonksiyonların bir bileşimi.

İşte işlevsel bir kompozisyonun somut bir örneği.

for line in ( l.split(":") for l in ( l.strip() for l in someFile ) ):
    print line[0], line[3]

Bu, işlevsel programlamanın Python gibi dilleri etkilemesinin bir yoludur.

Bazen bu tür şeyler şöyle yazılır:

cleaned = ( l.strip() for l in someFile )
split = ( l.split(":") for l in cleaned )
for line in split:
     print line[0], line[3]

İşlevsel bir programlama diline geçmeye karar verirsem, karşılaşacağım en büyük tuzaklar hangileridir? (Paradigma değişiminin yanı sıra tembel değerlendirme nedeniyle performansı değerlendirme zorluğunun yanı sıra).

Düşünülemez nesneler en zor engeldir.

Genellikle mevcut nesneleri güncellemek yerine yeni nesneler oluşturan değerleri hesaplarsınız. Bir nesnenin değişebilir bir özelliği olduğu fikri kırılması zor bir zihinsel alışkanlıktır.

Türetilmiş bir özellik veya yöntem işlevi daha iyi bir yaklaşımdır. Durum bilgisi olan nesneler kırılması zor bir alışkanlıktır.

Bu kadar çok işlevsel programlama dili varsa, ihtiyaçlarınıza en uygun olanı nasıl seçersiniz?

İlk başta önemli değil. Öğrenmek için herhangi bir dili seçin. Bir şeyi öğrendikten sonra, ihtiyaçlarınızı daha iyi karşılayacak başka birini seçmeyi düşünebilirsiniz.

Python'un sahip olmadığı şeyleri anlamak için Haskell'i okudum.


5
@edalorzo: Python zayıf yazılmış değil. Çok, çok güçlü bir şekilde yazılmış. Cast operatörü yok, bu yüzden Java veya C ++ 'dan daha güçlü bir şekilde yazılmış.
S.Lott

5
@ S.Lott - statik tip kontrolü IDE refactoring araçları ve intellisense tipi şeyler için yardımcı olmuyor mu? Arka plan derlemeniz devam ediyorsa ve türleri statik olarak kontrol ediyorsanız, bu araçlarınızda daha fazla otomatikleştirebileceğiniz anlamına gelmiyor mu? Testlerinizde% 100 kod kapsaması varsa, bunu yakalayacağını kabul ediyorum. İşletmedeki üretim kodunun muhtemelen% 50'sinden daha azının aslında birim test kapsamına sahip olduğunu anlamalısınız, değil mi? :) Orada yaşamak zorunda olduğumuz gerçek bir dünya var.
Scott Whitlock

8
@ S.Lott "Statik tip kontrolü o kadar da faydalı değil. " Err, hayır. Statik tip kontrolünün tüm noktası, böcekleri yakalaması, dolayısıyla gerekli test miktarını büyük ölçüde azaltmasıdır.
Jon Harrop

3
@ S.Lott "Python zayıf yazılmış değil. Çok, çok güçlü yazılmış." Python, zayıf bir şekilde yazılmakta olan sayısal türler arasında örtük olarak yayınlar.
Jon Harrop

3
@ Steve314 "Sonuçta, statik tip kontrolü bazı temel kurallara uyan bazı hataları yakalar. Ünite testi, prensipte, tüm bu hataları ve daha fazlasını yakalayabilir." Hayır. Statik kontrol, bir programın bir yönünün doğruluğunu kanıtlar. Birim testi doğruluğu onaylamamayı amaçlar ancak hiçbir şeyin doğruluğunu kanıtlamaz. Birim testi, statik tip kontrolünün veya başka herhangi bir kanıtın yerine geçmez.
Jon Harrop

23

"İşlevsel", her biri bağımsız olarak yararlı olan bir dizi farklı özelliktir ve her birine ayrı ayrı bakmayı daha faydalı buluyorum.

değişmezlik

Artık buna aşina olduğuma göre, değişmez bir sonuç döndürmekle kaçınabildiğim zaman, bunu nesne odaklı bir programda bile her zaman yapmaya çalışıyorum. Değer tipi verileriniz varsa program hakkında düşünmeniz daha kolaydır. Genellikle GUI'ler ve performans darboğazları gibi şeyler için değişkenliğe ihtiyacınız vardır. Varlıklarım (NHibernate kullanarak) da değişkendir (bir veritabanında depolanan verileri modelledikleri için anlamlıdır).

Birinci Sınıf Türleri Olarak İşlevler

Delegelerin, eylemlerin ya da işlevlerin etrafında dolaşmak, ne demek iseniz, “orta düzendeki delik” gibi, gerçek dünyadaki tüm problemleri çözmenin gerçekten kullanışlı bir yoludur. Bir nesneye bir temsilci, eylem veya işlevin iletilmesinin, o sınıfın bir etkinlik ilan etmesinden ve bu olayı takılmasından (normalde yalnızca bir "dinleyici" olduğu varsayılarak) daha temiz olduğunu buldum. Bir dinleyici olduğunu bildiğiniz zaman, geri arama işlemi yapıcı parametresi olarak geçirilebilir (ve değişmez bir üyede saklanabilir!)

İşlevleri oluşturabilmek (örneğin Action<T>sadece bir haline dönüşmek Action) bazı senaryolarda da oldukça yararlıdır.

Ayrıca burada Lambda sözdizimini de not etmeliyiz, çünkü yalnızca birinci sınıf türlere işlevleri tanıtırken Lambda sözdizimini alırsınız. Lambda sözdizimi çok anlamlı ve özlü olabilir.

monads

Kuşkusuz, bu benim zayıf noktam, ama benim anlayışım, F # 'daki iş akışı gibi hesaplamalı iş asyncakışlarının bir monad olduğu. Bu, ince fakat çok güçlü bir yapıdır. C # sınıfları yieldoluşturmak için kullanılan anahtar kelime kadar güçlü IEnumerable. Temelde kapakların altında sizin için bir durum makinesi oluşturuyor, ancak mantığınız doğrusal görünüyor.

Tembel Değerlendirme ve Özyineleme

Bunları bir araya getirdim, çünkü her zaman fonksiyonel programlamanın özellikleri olarak toplanmış olsalar bile, onları artık işlevsel olarak adlandırmanın zor olduğu zorunlu emir dillerine o kadar çabuk yöneldiler.

S-İfade

Sanırım bunu nereye koyacağımı bilmiyorum ama derlenmemiş kodu bir nesne olarak işleme koyma yeteneği (ve onu inceleme / değiştirme), örneğin Lisp S-Expressions veya LINQ Expressions, Fonksiyonel programlamanın en güçlü aracı. En yeni .NET "akıcı" arayüzleri ve DSL'ler, çok özlü API'ler oluşturmak için lambda sözdizimi ve LINQ Expressions kombinasyonunu kullanır. C # kodunuzun "sihirli bir şekilde" C # kodu yerine SQL olarak çalıştırıldığı Linq2Sql / Linq2Nhibernate'den bahsetmeyin.

Sorunuzun ilk kısmına verilen uzun cevap buydu ... şimdi ...

İşlevsel bir programlama diline geçmeye karar verirsem, karşılaşacağım en büyük tuzaklar hangileridir? (Paradigma değişiminin yanı sıra tembel değerlendirme nedeniyle performansı değerlendirme zorluğunun yanı sıra).

Karşılaştığım en büyük tuzak, işlevsel çözümler ile zorunlu çözümler arasında bağlantı kurmaya çalışıyordu. Ancak, her iki yaklaşımı da birkaç kez denedikten sonra, daha iyi çalışacağını hissetmeye başlarsınız.

Bu kadar çok işlevsel programlama dili varsa, ihtiyaçlarınıza en uygun olanı nasıl seçersiniz?

.NET ile aşina iseniz, F # öneririz. Öte yandan, JVM'ye daha aşina iseniz, her zaman Clojure vardır . Eğer pratikten daha akademik olursanız, Common Lisp veya Scheme ile giderdim. Python'u zaten biliyorsanız, orada zaten mevcut olan birçok işlevsel yapı olduğuna inanıyorum.


@Scott Ayrıntılı açıklamanız için teşekkür ederiz. Sanırım en büyük tuzak olarak tanımladığınız şey, Haskell gibi saf bir işlevsel programlama dili kullanarak denklemden çıkarılacak. Bu yüzden başlamıştım, çünkü hayatım boyunca zorunlu bir programcı oldum ve saf bir programlama diliyle yıldız olmak istemiyorum ve iyi bir şekilde öğrenememe riskini alıyorum. Başka bir soru sormamın sakıncası yoksa: Beni endişelendiren iki şey araç ve kütüphaneler. F # 'nin diğer .Net araçları ve kütüphaneleriyle entegrasyonu ne kadar iyi?
edalorzo

Neden çalışma zamanı ve çalışma zamanı kod oluşturma ve fonksiyonel programlama ile denetim de kodunu topladığını anlamıyorum. İkisinin birbirleriyle ilişkisi yok. Tanımladığınız metaprogramlama yetenekleri, işlevsel olsun ya da olmasın hemen hemen her dile eklenebilir. Ben lisp kodu veri trendi olarak başlattığını düşünüyorum ama şimdi yakut ve diğer işlevsel olmayan dillerde de mevcut.
davidk01

1
@edalorzo - F # 'nin .NET ile entegrasyonu çok iyi, sadece bir küçük istisna dışında: GUI tasarımcısı yok. GUI'nizi bir C # düzeneğinde tasarlayıp F # 'dan referans alarak veya sadece # kodunda GUI oluşturarak (bir tasarımcıyla değil) halledersiniz.
Scott Whitlock

@ davidk01 - meta-programlama hakkında iyi bir soru. Sadece lambda sözdiziminin ve meta-programlamanın birbirini oluşturduğunu biliyorum, ama haklısın, ayrılabilirler. İşlevsel bir dille meta-programlama yapma ihtimaliniz daha yüksek görünüyor.
Scott Whitlock

1
@Scott: Birçok yönden daha kolay olduğunu düşünüyorum - örneğin, yan etkiler konusunda endişelenmek zorunda olmadığınız zaman, hareket halindeyken bir kod bölümünü daha fazla güvenle değiştirebilirsiniz - değiştirmek zorunda olduğunuzu sınırlar.
Michael K,

15

Ve bu bir süredir böyle olmuştur. İşlevsel programlama basitçe diğer modellerde olduğu kadar popüler olmamıştır (yani nesneye yönelik programlama).

Bu, profesyonel programcılar tarafından geliştirilen programları (veya en azından kendilerini böyle gören insanlar) sayıyorsanız geçerlidir. Net'inizi, kendileri olarak düşünmeyen insanlar tarafından geliştirilen programları içerecek şekilde yayarsanız, FP (ya da en azından işlevsel bir tarzda programlama), OO'ya (Excel, Mathematica, Matlab, R ... hatta 'modern' JavaScript'e oldukça yakındır. ).

Hangi senaryolarda, belirli bir görevi yerine getirmek için daha uygun fonksiyonel bir programlama dilini düşünmeliyim? Paralel programlama çok yakın zamanda popüler multicore sorunu yanında.

Benim kişisel görüşüm, çok çekirdekli FP'nin katil özelliği olmadığı (en azından Haskell, Scala, Clojure, F # derleyicileri önbellek konumlandırma sorununu çözene kadar). Katil özelliğidir map, filter, foldve arkadaşlar hangi algoritmaların büyük bir grubun bir daha özlü ifadesini verir. Bu, popüler OO meslektaşlarından daha özlü bir sözdizimine sahip olan FP dilleri ile birleştirilmiştir.

Ek olarak FP ilişkisel modele daha yakın olmak RDBMS ile olan empedans uyumsuzluğunu azaltır - ki yine en azından programcı olmayanlar için - çok iyi.

Ayrıca, “doğruluk” gerekliliklerini yerine getirme konusunda özellikle zor olduğunuzda - test edilmesi zor bir formda (hedefin önceden bilinmemesi ve tanımlanamayan sonuçların olduğu bilimsel hesaplama / büyük veri analizlerinde ortaktır) FP sunabilir. avantajlar.

İşlevsel bir programlama diline geçmeye karar verirsem, karşılaşacağım en büyük tuzaklar hangileridir?

  • araç desteği eksikliği (F # ve bazı Lisps istisna, Scala yolda)
  • Donanımınızdan en son performansı almak için daha zor
  • Topluluklar genellikle büyük bir ticari yazılım geliştirme projeleri grubunun karşılaştığı sorunlardan farklı konulara odaklanır.
  • FP'yi endüstriyel ortamda kullanma konusunda deneyimli çok az geliştirici vardır ve onları bulabilirseniz muhtemelen finans endüstrisinin sağlayabileceği maaş ve avantajlarla rekabet etmeniz gerekir.
  • işlevsel programlama tarzı hata ayıklamak daha zor olma eğilimindedir; yani uzun bir karma fonksiyonlar zincirinde sonuçlar arasında gözlem yapmak çoğu zaman (hepsi?) hata ayıklayıcılarda mümkün değildir.

Bu kadar çok işlevsel programlama dili varsa, ihtiyaçlarınıza en uygun olanı nasıl seçersiniz?

  • Sorunlarınızdan kaç tanesi, hangi platformda (örn. JVM veya .Net) kütüphane / çerçevelerden çıkılarak çözülebilmektedir? Bu sorunları doğrudan dile getirebilecek dil yapıları var mı?

  • Uygulamanızın alan ve zaman performansı üzerinde ne kadar düşük seviye kontrolüne ihtiyacınız var?

  • Doğruluk gereksinimleriniz ne kadar sıkı?

  • Geliştiricileri eğitmeyi ve / veya SW geliştirmede son derece karlı bazı nişlerin sunduğu avantajlarla rekabet etmeyi göze alabilir misiniz?


+1 @Alexander bu kesinlikle bu tartışmanın en iyi cevaplarından biridir. İnsan faktörünü, yetenekli geliştiricileri bulmanın zorluğunu ve motivasyonunu koruyarak, tartışmaya yeni bir argüman boyutu boyutu getirdiniz. FP kayışlarının katil özellikleri hakkındaki görüşünüze tamamen katılıyorum, çünkü her gün bunları benimseyen daha zorunlu diller görüyorum. Ancak göreviniz, FP hakkında bilmediğim birçok şey olduğunu anlamak için gözlerimi açtı. Son olarak .Net veya Java gibi mevcut bir platforma dayanma noktanız kesinlikle çok geçerli ve tamamen mantıklı.
edalorzo

9

İşlevsel bir programlama diline geçmeye karar verirsem, karşılaşacağım en büyük tuzaklar hangileridir? (Paradigma değişiminin yanı sıra tembel değerlendirme nedeniyle performansı değerlendirme zorluğunun yanı sıra).

Sanırım sektörde bir C ++ / C # / Java geliştiricisi ...

Hiçbir şey öğrenmek istemeyen huysuz akranlara hazırlıklı olun. Kötü dil seçimleri uygulayan sivri saçlı patronlara "bir zamanlar kodlayıcı oldukları için" hazırlıklı olun. Monoitler konusunda sizi yönlendiren forumlarda özlü akademisyenler için hazırlıklı olun. Sonsuz dil savaşlarına hazır olun, çünkü Scala'nın kuyruk çağrısı ortadan kaldırılması bile yok ve Clojure gerçekten tüm parantez için ayak pedalları gerektiriyor ve beni Erlang'da çalıştırmaya başlamıyor.

Bir web programcısıysanız, en büyük tuzak muhtemelen saçınız olacaktır.

Bu kadar çok işlevsel programlama dili varsa, ihtiyaçlarınıza en uygun olanı nasıl seçersiniz?

Platformla başlardım:

  • OCaml Linux için harika ve Windows'ta korkunç.
  • F #, Windows'ta harika ve Linux'ta korkunç.
  • Scala ve Clojure, JVM'de harika.

1
Okuduğumda "Hiçbir şey öğrenmek istemeyen huysuz arkadaşlara hazırlıklı olun." Bağırmak istedim: "Çok doğru! Çok doğru!" ama bu gerçekten üzücü.
Zelphir Kaltstahl,

3

Bu soruya (kuşkuyla taraflı) bir bakış açısı için, Bob Harper'ın blog tipi Existential Type'a göz atabilirsiniz . Carnegie Mellon kısa bir süre önce CS programlarını, işlevsel programlamayı öğretmek için elden geçirdi; diğer paradigmalar, yalnızca fonksiyonel programlamaya sağlam bir zemin oluşturulduktan sonra öğretildi ve Harper, yeni müfredat pratikte uygulamaya konulduğunda bir darbe aldı .

Harper, Standart ML programlama dilinin önde gelen geliştiricilerinden biri, bu yüzden konuyla ilgili kendi görüşlerinin önceden tahmin edilebileceğini söylemek adil, ve bu pozisyonu tartışırken tartışmalı ifadelerden kesinlikle çekinmiyor ama Davası iyi.


1
+1 Bu makale kesinlikle çok ilginç ve bundan sonra favorilerimde tutacağım. Bence ilk önce FP öğretiminin kesinlikle güzel bir yaklaşım olduğunu düşünüyorum, çünkü aksi takdirde yaparsanız zorunlu düşünmeden kurtulmak gerçekten zor, ve her şeyden önce, tamamen işlevsel bir programlama dili kullanmıyorsanız, eskisini kırmak zordur. alışkanlıkları. Ayrıca, büyük OOP dillerinin işlevsel özellikler içerdiğini ve bu nedenle işlevsel bir programcının becerilerini ve zihin durumunu edinmenin yakın gelecekte gerçekten kullanışlı olması gerektiğini de görüyorum. İlginç bilgiler, teşekkürler!
edalorzo

@jimwise: Harper'ın makalesi için +1. Onun yaklaşımını çok uygun buluyorum. @edalorzo: İşlevsel olarak düşünmeye başladığınızda, zorunlu paradigmayı, yeterince hızlı olmadığı zaman programınızı optimize etmek için başvurmanız gereken son çare olarak göreceksiniz. Son zamanlarda Scala'da bazı küçük araçlar yazıyorum, çok büyük değil, önemsiz olanlar ve bazı gerçek işlevsellikler. Benim şaşkınlığım için, vartek seferlik hiç bir koleksiyon kullanmamıştım. Dolayısıyla, zorunlu düşünme IMO'dur, hepimizin bildiği gibi, tüm kötülüklerin kökü olan bir tür erken optimizasyondur.
Giorgio

2

Hangi senaryolarda, belirli bir görevi yerine getirmek için daha uygun fonksiyonel bir programlama dilini düşünmeliyim? Paralel programlama çok yakın zamanda popüler multicore sorunu yanında.

İşlevsel programlamanın ne zaman kullanılacağını söyleyen sihirli bir formül yoktur. Nesne yönelimli programlamanın mevcut programlama durumlarımız için daha uygun olduğu gibi değildir. Programları başka bir soyutlama kümesi bağlamında yapılandırmanın başka bir yolu.

İşlevsel bir programlama diline geçmeye karar verirsem, karşılaşacağım en büyük tuzaklar hangileridir? (Paradigma değişiminin yanı sıra tembel değerlendirme nedeniyle performansı değerlendirme zorluğunun yanı sıra).

İşlevsel programlama tembellik ile ilgisi yoktur. ML ve OCaml işlevsel ve katı dillerdir. Karşılaşacağınız en büyük engel, şeyleri değişmez değerler olarak yapılandırmak ve başınızı yan etkiler için tip sisteminde kullanılan soyutlamaların etrafına sarmaktır. İşlevsel diller, yazım sisteminde yan etkileri çok açık yaptıkları için optimizasyon için daha uygundur. Haskell monad kullanıyor ancak efektleri saf işlevsel dillerde kullanmanın başka yaklaşımları da var. Temiz'in benzersizlik türleri vardır ve geliştirilmekte olan diğer bazı dillerin başka şeyleri vardır.

Bu kadar çok işlevsel programlama dili varsa, ihtiyaçlarınıza en uygun olanı nasıl seçersiniz?

Bildiğim programlama dilleri arasında sadece Haskell ve Clean islevsel diller olarak adlandırılabildiğini söyleyebilirim. Diğerleri, bu etkileri tip sisteminde açıkça belirtmeden yan etkilere izin verir. Eğer fonksiyonel programlamayı öğrenmek için zaman ayıracaksanız Haskell muhtemelen tasarıya uygun olanıdır. Tanıdığım diğer herkes, Erlang, Scala, Clojure, vb. Sadece zorunlu bir dilin üstüne işlevsel soyutlamalar sağlıyor. Eğer işlevsel paradigmaya bit olarak yaklaşmak istiyorsanız, Scala veya Erlang'ı öneririm ve her şeyi bir seferde ele almak ve muhtemelen hayal kırıklığı içinde pes etmek istiyorsanız, o zaman Haskell ile gitmelisiniz.


@ Dadivk01 +1 FP uçlarının tıpkı diğerleri gibi rekabetçi bir araç olduğu ve diğer modellerle çözülenlerle aynı sorunları çözmek için kullanılabileceği düşüncesini seviyorum. Öyleyse neden daha az popüler olduklarını düşünüyorsun? Ve, paralel hesaplama sorununu çözmek için, örneğin çoğu OOP şeridinden daha uygun olduklarına hala katılıyor musunuz? Değişmez veri türünün, zorunluluk sınırlarına kıyasla bellek ayak izi ve performansı üzerinde herhangi bir etkisi olduğunu söyleyebilir misiniz? Haskell'e bir şans veriyordum, neden "hayal kırıklığına
uğramaktan vazgeç" derdin

@edalorzo: Paralel algoritmalar için işlevsel programlamanın daha iyi olduğunu düşünmüyorum. İnsanlar bildirimsel programlamayı işlevsel programlamayla karıştırırlar. İşlevsel programlamanın onun için geçerli olduğu şey onun bildirim niteliğinde olması ve bildirim kodunu makine koduna çevirmek için mükemmel derleyiciler yazan çok sayıda akıllı insan. Küçük detayların açıkça belirtilmesi yerine, sorunların tanımlanmasına daha fazla eğilen herhangi bir dil, paralel programlama için de iyi olacaktır.
davidk01

@edalorzo: "Hayal kırıklığına uğramaktan" gelince, çünkü eğer zorunlu programlama sizin bildiğiniz tek şeyse, Haskell tip sistemi ve etkilerini tanımlamaya yönelik monadik yaklaşımı biraz fazla olabilir. Erlang ve Scala gibi yan etkilere daha pragmatik bir yaklaşım getiren bir dille başlamanın daha iyi olacağını düşünüyorum.
davidk01

0

Paralel hesaplama için ideal oldukları gerçeğine fonksiyonel dillerdeki interesin şu anki yükselişini bağlardım. Örneğin, harita azaltma fikrinin tamamı işlevsel paradigmaya dayanmaktadır. Ve şu anda ölçeklendirmenin ölçek büyütmeden çok daha kolay ve daha ucuz olduğu açık olduğundan, paralel hesaplamanın yükselişe geçeceğinden hiç şüphe yoktur. Tüketici pazarında bile CPU'lar daha fazla çekirdek alır, daha fazla GHz almaz.

EDIT: çünkü herkes için belli değil.

Saf fonksiyonel programlamada, bir fonksiyon girdi alır, çıktı üretir ve yan etkisi yoktur. Herhangi bir yan etkiye sahip olmamak, ortak bir duruma sahip olmadığı, dolayısıyla eşzamanlı olarak çalıştırılırken gerekli olacak senkronizasyon mekanizmalarına ihtiyaç duymadığı anlamına gelir. Senkronizasyon, herhangi bir eşzamanlı / paralel yazılımın en zor kısmıdır, bu nedenle tamamen işlevseldir, temel olarak en zor kısımla uğraşmanıza gerek kalmaz.

Harita azaltmaya gelince, ad bile işlevsel programlamadan gelir (hem haritalama hem de azaltma, işlevsel paradigmada tipik işlemlerdir). Her iki harita azaltma adımı, paralel çalışan, girdi alan, çıktı üreten ve hiçbir yan etkisi olmayan işlevlerdir. Yani bu tam olarak saf işlevsel programlama fikridir.

Paralellik için kullanılan birkaç FP örneği:

  • CouchDB - Erlang üzerine inşa
  • Facebook sohbeti - Erlang'da inşa
  • Twitter - Scala'da büyük bölüm oluşturma

3
Herkes paralel programlama iddiasını ortaya koyuyor, ancak bunu destekleyecek çok az veri var. Bu tür kaynakların farkındaysanız, alıntı yapmanız gerekir. Karmaşık hesaplamalar genellikle karmaşık veri bağımlılıklarına sahiptir ve işlevsel bir programlama paradigması kullanırsanız, bazı modellerin içsel veri bağımlılığı sihirli bir şekilde ortadan kaybolmaz. GPU programlaması olabildiğince paraleldir ancak zorunlu dilleri kullanarak gayet iyi bir şekilde çalışırlar, çünkü birlikte çalıştıkları modellerde yerleşik paralellik vardır.
davidk01

4
@vartec: İddialarınızı destekleyen bir referans sunabilirseniz, tarafsızlık adına hala iyi olurdu. Bu cahil okuyuculara karşı bir sorudan çok daha fazlası olurdu ...
blubb

1
@vartec: Aslında hayır, hiçbir zaman bazı insanların iddiada bulunduğunu iddia ettiği doğru değildi. Matematik eğitimimi suçluyorum ama hey hepimiz taleplerimiz için somut gerekçeler ve somut gerekçeler gibi şeylere inanmıyoruz ve düzenlemeniz hala yorumuma cevap vermiyor.
davidk01

1
@vartec İddialarınızı destekleyen güvenilir bir kaynağa referans verebilirsiniz.
quant_dev

1
+1 @ davidk01 "Herkes paralel programlama iddiasında bulunuyor, ancak bunu destekleyecek çok az veri var". Aksine çok büyük miktarda delil olduğunun farkındayım. Örneğin, Cilk kağıtları, çok çekirdekli bir ölçeklenebilir paralellik gereksinimi olan iyi önbellek karmaşıklığı istiyorsanız, yerinde mutasyonun nasıl gerekli olduğunu açıklar.
Jon Harrop
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.