Sektörde işlevsel programlama neden daha popüler değil? Şimdi anlıyor mu? [kapalı]


61

Üniversitedeki dört yıl boyunca, birçok fonksiyonel programlama dilinde çok fonksiyonel programlama kullanıyoruz. Ama aynı zamanda çok fazla nesne yönelimli programlama kullandım ve aslında ilk işime hazırlanmak için kendi küçük projemi yaparken nesne yönelimli dilleri daha fazla kullanıyorum. Ancak sık sık bu projeleri yaparken fonksiyonel bir programlama dilinde kod yazmamı diliyorum.

Ancak, iş ararken, işlevsel bir programlama dili bilgisinin gerekli olduğu bir iş görmek çok nadirdir.

Neden fonksiyonel programlama dilleri endüstride daha fazla kullanılmıyor? Bugünlerde fonksiyonel programlama dilleri hakkında oldukça fazla haber var, bu yüzden şimdi sektörde fonksiyonel programlamanın başarılı olup olmadığını merak ediyorum.


3
Bir dereceye kadar, sorunuzun öncülüne katılmıyorum. Java ve JavaScript gibi dillere "işlevsel dillerden" ilham alan dil özellikleri eklenmektedir. Aslında, JavaScript her zaman (bazı şekillerde) işlevsel bir dil olmuştur, ancak çoğu insan yakın zamana kadar fark etmedi.
MatrixFrog

1
@ MatrixFrog: "Neden tam teşekküllü bir FP dili benimsemek yerine işlevsel olmayan dillere birkaç işlevsel kavram ekleyerek neden sadece yarısına kadar işlevsel olursunuz? Tüm paradigma yıllarca sürdü ve çok olgunlaştı."
Giorgio,

Dünya, geriye dönük uyumluluk, atalet vb. gibi farklı nedenlerden ötürü üstün alternatiflere (ve saf FP üstün bir alternatiftir) geçmiyor: DVORAK klavye düzenini göz önünde bulundurun: dokunma yazmak için daha verimli ama hepimiz QWERTY ile sıkışıp kaldık çünkü çok fazla yazılım var qwerty dostu kısayollarla.
KolA

Yanıtlar:


38

İşlevsel programlamanın daha yaygın olmama nedenlerinden birinin bilgi tabanı eksikliği olduğunu söyleyebilirim. Benim deneyimim, şirketlerin ana akım olmayan ve denenmiş ve gerçek çerçevelere yatırım yapmak yerine teknolojiyi uygulama konusunda çok riskli olduklarıdır (java, c ++, c #). Sadece bir iş ihtiyacı olduğunda (Ericsson'da olduğu gibi) yeni paradigmaların göz önünde bulundurulması gerekir. Ancak Ericsson'un durumunda bile, yönetimin c ++ 'nın kullanılmasını istediğini duydum ve Joe Armstrong, c ++' da erlang çağrılarını kodlamak zorunda kaldı! Bu, isteksiz şirketlerin yeni teknolojileri nasıl uyguladıklarını göstermelidir!


9
İşlevsel programlama nasıl bir şekilde 'yeni'?
Evan Plaice

7
Bence 'yeni' yerine 'kullanılmayan' anlamına geliyordu.
Vinko Vrsalovic

9
Yani kullanılmamış ... çünkü kullanılmamış? Hm.
Alex Baranosky

21
@Alex - Kesinlikle. Berbat değil mi?
KeithS

5
@ Stargazer712: Bu sebepler neler? Fonksiyonel programlamayı bilmeyen birçok geliştirici biliyorum, bu yüzden cehalet bana mantıklı geliyor. İşlevsel programlama geçmişte, endüstriden habersiz olduğum kadarını kovalayan büyük bir başarısızlığa neden oldu mu?
Sean McMillan

67

Profesördüm ve tıpkı programcılar gibi, profesörler her zaman bir sonraki büyük şeyi arıyorlar. Bir tane bulduğunu düşündüklerinde, onu bir grup arabası yaparlar ve herkes kazınır. Profesörlerin gerçekten akıllı olması gerektiğini düşünen öğrencilere vaaz verdikleri için, neden profesör olurlarsa, hiç direnç almazlar.

İşlevsel programlama böyle bir ana yoldur. Elbette araştırılması gereken çok sayıda ilginç soru ve bir sürü ilginç konferans makalesi var. Bu özellikle yeni bir fikir değil ve bunu herhangi bir modern dilde yapabilirsin ve fikirlerin ilginç olmak için yeni olması gerekmez. Aynı zamanda sahip olmak için iyi bir beceri.

O göz önüne alındığında, işlevsel programlama titremenizdeki tek bir okdur, sadece bir değil, OOP'ın tek olmadığı gibi.

Bilgisayar bilimi akademisi ile olan sığır derim, gerçek dünyayı gerçek anlamda neyin anlam ifade ettiğini, yani kalite kontrolünü belirlemek için endüstri ile pratik bir etkileşimin olmaması. Eğer bu kalite kontrolü orada olsaydı, problemleri ve kendilerine göre çözüm çeşitlerini, en son bant vagonlarından ziyade haksızlıklarla sınıflandırmaya farklı bir vurgu yapılabilir.


1
Bu gerçekten iyi bir yorum. Titremenizdeki oklar için +1 ve değişimlerin olduğu çözüm aralıkları.
user21007

2
QC için +1. Bu yüksek lisans test, kod inceleme, kod karmaşıklığı ve benzeri kapsayan özel konular ile çok daha yararlı olurdu . Bir programın son yamadan sonra ne yapması gerektiğini otomatik olarak doğrulayabilmek herhangi bir sayıda "şimdi çalışmalı" el dalgası saçmalığına değiyor.
l0b0

5
@ l0b0: Teşekkürler, aslında ne öğretildiğinin ve nasıl yapıldığının kalite kontrolünü düşünüyordum. Olduğu gibi, CS profesörleri şahsen en ilginç buldukları şeyleri öğretiyorlar. Bunu, gerçek dünyayla alaka düzeyinin çok yüksek olduğu endüstri veya tıpla etkileşimin olduğu mühendislikle karşılaştırın. IME, CS profs, gerçek dünyanın gerçek dünyada neyin önemli olduğunun öğretisini yapacağını düşünüyor, ancak öğrenciler öğrenmeye hevesli değiller - aksine profesörlerin en çok neye heyecan verdiklerini görmek için istekli oldular.
Mike Dunlavey,

@Mike: hemen hemen herhangi bir modern dil? C ++ ve Java dahil mi?
kevin cline

+1. Kendim daha iyi söyleyemezdim.
riwalk

25

Çünkü bugünlerde yazılım geliştirmedeki en büyük sorun karmaşıklığı yönetme yeteneğidir. Bu, işlevsel programlama dillerinin çoğunun odağı değildir. Bunun gibi, dil yapmak öncelikli (yani daha popüler cepten dilleri) sadece daha fazla akademik fonksiyonel dillerin çıkıp böylece üstünde kalmak soğutucu özelliklerinden bazıları çalmak eğiliminde olduğunu olun.


48
Katılmıyorum. İşlevsel programlama dilleri, bir durumun kullanımını en aza indirmeye çalışır ve bu şekilde daha az karmaşık hale gelir. İşlevsel bir dilde programlanmış programları test etmek ve yeniden değerlendirmek daha kolaydır.
Jonas

7
@Jonas: Bir çok programcı neredeyse hiç devlet kullanmayan bir program yazmanın oldukça zor olduğunu düşünüyor (kendim dahil). Bu açıdan bakıldığında, aslında daha karmaşık. (Lütfen, işlevsel programlamanın yararını hiçbir şekilde tartışmayacağımı unutmayın!)
ShdNx

3
@ ShdNx: Evet, biliyorum. Üniversitede ilk öğrendiğimde bile işlevsel programlamanın zor olduğunu düşündüm. Ancak bir süre sonra zorunlu programlama ve daha spesifik OOP için tercih etmeye başladım. Üniversitemde fonksiyonel programlama zorunlu programlama öncesi öğretildi ve üniversite öncesi zorunlu programlama yapmayan öğrenciler, zorunlu programlamanın başlangıçta çok zor olduğunu ve fonksiyonel programlamanın matematiğe daha yakın olduğunu düşündüler.
Jonas

16
Zorluk ve karmaşıklık arasında bir fark var. OOP, yapısal programlamadan kesinlikle daha zordur, çünkü daha fazla kavram ekler. Yeterince büyük miktarda kod için, koda bir yapı sağlayarak karmaşıklığı azaltır . FP aynı şeydir: sadece iki satır yazıyorsanız, fazladan yazma gibi görünür, ancak kodunuz yeterince büyükse, durumsuz alt birimler olarak kodu yapılandırmak ölçeklenebilirliği artırır ve kodun karmaşıklığını azaltır.
Muhammad Alkarouri

6
İşlevsel programlamanın ana vurgularından biri, beste edilebilirliktir. Bu karmaşıklığı yönetmek için bir araç değilse, ne olduğunu bilmiyorum.
dan_waterworth

23

Fonksiyonel programlama kesinlikle yavaş yavaş ama emin adımlarla başlıyor.

Örneğin, oluşturduğum başlangıç, aşağıdaki nedenlerden dolayı birincil geliştirme dili olarak işlevsel bir dil (Clojure) kullanıyor:

  • Verimlilik - FP öğrenmek zordur, ancak bunu bir kez yakaladığınızda, güç ve ifade açısından yenmek çok zordur. Muhtemelen, C # ya da Java’da ihtiyacım olana kıyasla herhangi bir işlevsellik parçasını uygulamak için satır sayısının 1 / 10’unu yazıyorum

  • Güvenilirlik - saf fonksiyonlar, mantıklı nesnelere göre düşünmek ve test etmek için çok daha kolaydır. Böylece daha iyi testler yazabilir ve kodunuzun doğruluğunu daha kolay doğrulayabilirsiniz.

  • Eşzamanlılık - işlevsel diller, eşzamanlı uygulamalar için birden fazla çekirdek üzerinde etkili bir şekilde çalıştırmanın gereğinden büyük faydaları olan değişmezliği vurgular. Ve bunun gibi ya da değil, çoklu çekirdeklerde koşmak gelecek. Bunun neden bu kadar önemli olduğunu açıklayan bir açıklama için bkz. Http://www.infoq.com/presentations/Value-Identity-State-Rich-Hickey

  • Composability / modularity - işlevsel diller, bileşenleri karmaşık OO sistemlerinden daha kolay bir şekilde bir araya getirmeye kendilerini ödünç veriyor gibi görünmektedir. Bunun nedenini hala çözemedim, ancak bunun bir kısmı, OO modellerinin yanlarında sürüklediği tüm "tesadüfi karmaşıklığa" sahip olmamanızdan kaynaklanıyor. Stuart Halloway'ın Radikal Basitlik konulu konuşması bu fikirleri çok daha derinlemesine araştırıyor.

EDIT : Despertar'ın yorumuna cevaben, modülerliği sınırlayan OOP sistemlerinin "tesadüfi karmaşıklığına" bir örnek, derin klonlama ile sığ klonlama arasındaki problemlerdir: nesneleri bir arada oluşturamaz ve bunları bir arada olmadan kompozit yapılar olarak geçiremezsiniz. klonlama ve mutasyon semantiğinin dikkatli analizi. Küçük durumlarda bu yönetilebilir, ancak karmaşık sistemlerde hızla önemli bir sorun haline geliyor. Saf işlevsel veri yapılarına güvenirseniz, bu sorun ilk başta ortaya çıkmaz.


+1, neden Clojure'u seçtiginiz konusundaki karar verme isleminizi duymayi çok isterim. (Clojure karşıtı ya da karşıtı değilim, sadece ilgileniyorum).
dan_waterworth

4
"FP öğrenmek zor": Herhangi bir paradigmayı öğrenmek zordur. Makul üretken olmak için yeterli tecrübeye sahip olmadan önce zorunlu kodla (Pascal) kaç saat geçirdiğimi hatırlıyorum. Bence FP daha az bilinir çünkü birçok programcı ilk önce zorunlu bir dil öğrendi ve bir kez nasıl programlandığını öğrendiklerinde başka bir şeye bakacak zamanları olmadı. Tam zamanlı bir C ++ programcısıyım ve şu anda işten sonra Scala'yı öğreniyorum. Bakacak bir ailem olsaydı, unutabilirdim.
Giorgio

1
Sanırım ilk 3 müthiş davalar, ancak dördüncü olaya katılmıyorum. OOP aşırı modüler ve kompozisyondur; benim için bu en güçlü yanlarından biri. Kapsülleme ve soyutlama yoluyla karmaşıklığı gizlemek için de harika.
Despertar

1
@Giorgio. Kesinlikle. "Öğrenme FP zordur, OOP öğrenmek kolaydır", "İspanyolca öğrenmek zordur, ancak Çince kolaydır" kadar saçmadır. Hangisinin ilk diliniz olduğuna bağlı. Ve ben Çince'yi OOP'a keyfi bir analog olarak seçmedim - çünkü OO deyimleri hiyeroglifler gibidir: tek tek öğrenmesi kolay ama hepsini hatırlaması zor ve bestelemek imkansız. FP, alfabetik bir dilden çok daha fazla: ayrı harfler izole edilmesinde yararsızdır, ancak oldukça küçük kurallar içeren bir şey oluşturmanıza izin verir
KolA,

1
(devam) öyleyse neden popüler değil - henüz - aynı sebeplerden dolayı. Hiyeroglifler, ilk alfabe icat edilmeden ve olgunlaştırılmadan çok önce vardı. Alfabetik yazma ve okuma olan başka bir nesli alabilir; ilk paradigması olarak FP demek istiyorum
KolA,

12

Katil uygulaması eksikliği

Hey, buradaki taze görünüyor. (kazmak kazmak)

Sanırım çoğu programlama dili, bir "katil uygulaması" ndan - diline özgü (ya da bu şekilde görülen) çekici bir şeyle gelişiyordu. Bu, tüm alımların o uygulama olduğunu söylemek değil, dili daha büyük bir kabul görmeye sürdüğünü söylemek değildir .

İşte nişimizin bugün sahip olduğumuz bazı dillerin benimsenmesini sağladığına dair çok doğru olmayan bir görüşüm:

  • C: Her yerde çalışıyor (Bu, 70'li ve 80'li yılların sonlarıydı)
  • C ++: GUI çerçeveleri (90'ların başında)
  • Java: Apletler ve uygulayıcılar (90'ların sonunda)
  • Amaç-C: iOS uygulamaları (Bundan önce OS X uygulamaları)
  • Yakut: Raylar
  • C #: ASP.NET, WinForms
  • PHP: Wordpress, vb.
  • Javascript: AJAX, özellikle çerçeveler aracılığıyla
  • lua: Oyun komut dosyası, özellikle WoW

Bunun yanı sıra, birçok özel dil kapıya güçlü satış organizasyonları (Oracle ve daha az derecede Microsoft'un dilleri) ile girerek etkin bir şekilde kendi alanlarını yarattı.

Bu listeyle ilgili çok önemli bir not: Katilin uygulaması tarafından belirtildiği gibi dilin "nişi", yıllar geçtikçe daha da belirginleşiyor. Listedeki sonuncuyu not edin: Özellikle oyun komut dosyası . Başka bir dil tarafından zaten yeterince iyi yapılan şeylerin listesi nedeniyle dillerin dikkatini çekmesi gittikçe zorlaşıyor.

Yani, herhangi bir fonksiyonel dilin gerçekten çıkarması gereken şey bir niş. Gerçekte, henüz büyük bir işlevsel dil yoktur, ancak daha küçük nişlerde çok şey vardır:

  • Emacs Lisp: 80'lerden bu yana Emacs'ta geliştiriciler tarafından sürekli kullanım. ( Neredeyse başka hiçbir yerde kullanılamaz.)
  • Erlang: Her yerde çok fazla eşzamanlı ajan istiyorsun.
  • Şema: Eğitim
  • APL / J / K: Finans (Argüman uğruna bunları işlevsel olarak adlandıralım)
  • Common Lisp: "AI" - İnsanların onun için kullanıldığını söyleme eğiliminde olduğu, bu bir nimet ve bir lanet.

Şimdi, bu tartışma dışında bıraktığımı hissettiğim tek ana dil Python. Python çok ilginç bir şey yaptı; Herhangi bir ana alanda kazanan olarak görünmeden başarılı olmuştur. Bu , dil popülerliğini bu şekilde görüntüleme konusunda yanlış yaptığım anlamına gelebilir. Aynı zamanda, yeterince iyi bir dilin , kabul edilmeyi ve kabullenmeyi teşvik eden katil bir uygulama olmadan popüler olabileceği anlamına gelebilir, ancak çok zordur ve çok uzun zaman alabilir. (Perl'in benzer bir hikayesi var, ancak birkaç yıl önce geldi ve şimdi daha az alımı var.)

Buradan, ben düşünüyorum fonksiyonel hangi dillerin söyleyebiliriz şunlardır artıyor:

  • Clojure: Web programlama, esp. Heroku aracılığıyla
  • Scala: Lift (veya bugün Oyna, bugünlerde) - Java olmadan JVM

Popüler fonksiyonel diller için nerelere bakacağımı sorduysanız, anahtar teslimi bulut geliştirme (la Heroku veya GAE) veya anahtar teslimi mobil uygulama geliştirme ile fonksiyonel bir dil arayışı içinde olduğunuzu söyleyebilirim.


Ben de Perl'i ana dil olarak kabul ediyorum. En sık Unix benzeri sistemlerde kullanıldığını söyleyeceğim eski bir dil. Python daha modern bir alternatif gibi gözükse de. Hala çok dikkat çeken ve geniş bir topluluğu olan popüler bir dildir.
Despertar

1
@Despertar - Hangi dillerden bahsettiğim konusunda eşitlikçi olmak için çok çaba sarf etmedim :) Ve anladım ki, öykü geçmişte birkaç yıl dışında Python'a çok benziyor.
Jesse Millikan

1
Perl yaptığı niş bir çift var. Bunlardan en eski olanı, "pratik çıkarma ve raporlama dili" nin kısaltması olarak adlandırılan eski belgelerine yansımıştır. İkinci sonra biraz boyunca geldi ve CGI komut dosyası oldu - Uzun yıllar, perl oldu ağın dili. Açıkçası şu anda bu popülerlikten çok fazla şey kayboldu, ancak hala orijinal olarak oluşturdukları aynı yazılım üzerinde çalışan eski web sitelerine bir göz atın ve çok fazla perl göreceksiniz (şu an slashdot.org'u düşünüyorum) , ama epeyce daha var.
Jules

8

Aynı sebepten dolayı Lisp hiç yakalanmadı (flamewarlar başlasın!). İşlevsel programlama, zorunlu ve nesne yönelimli programlamaya kıyasla çok yabancı bir paradigmadır. Eğer CS öğrencilerinin büyük çoğunluğu gibi, C ile başlayıp C ++ / Java'ya geçtiyseniz, normalde düşündüğünüze tamamen dik bir şekilde düşünmeyi öğrenmek istemezsiniz.


2
Uzaylı paradigması? Zorunlu programlamaya göre matematiğe daha yakın. Burada İsveç'te üniversitedeki çoğu CS öğrencisinin önce işlevsel programlama olduğunu düşünüyorum. Örneğin, C, Erlang ve Java'dan önce Standard ML ile başladık.
Jonas

4
Yeterince adil. İngiltere ve Hindistan'daki birçok mühendislik öğrencisine önce C, ardından C ++ ve / veya Java öğretildiğini biliyorum. Çoğu zaman işlevsel bir dil öğretilmiyor.
Chinmay Kanchi

13
@Jonas Orada çok sayıda insan için matematik, yabancı bir paradigmadır ve programlamayı matematikten uzağa götüren herhangi bir şey, anlaşılmasını kolaylaştırır.
scriptocalypse

5
Ağaçları hiç duymamış, fonksiyon programlamanın tek başına, mezun olmuş insanları duydum.
dan_waterworth

1
@ Tux-D, aslında hayır, İngiltere'deki öğrencilerden bahsediyorum.
dan_waterworth

6

İşletmeleri ve programlamayı düşünelim.

Yazılımlarını stratejik bir varlık olarak kullanan işletmeler var. Bu tipik değil. Çoğu işletme için BT, şirketin gerçek işini destekleyen bir şeydir. Bu gerekli bir masraf. Muhafazakarlar çünkü X $ için ihtiyaç duydukları BT'yi alabileceklerini biliyorlar, farklı bir şeye geçtikleri takdirde her şey yolunda giderse X $ 'dan daha az tasarruf edeceğini ve her şey yolunda giderse çok büyük kaybedeceklerini biliyorlar.

Dahası, işletmelerde yapılacak en ucuz şey genellikle dün yaptıklarıdır. Bununla birlikte arzu edilen değişiklik, pahalıdır. Eğer bir şirket bir C # /. NET çözümünden, F # 'dan bile değişecek olsaydı, problemleri olurdu. Programcıları (muhtemelen en keskin programcıları olmayan) yeni bir dil öğrenmek ve her ikisinde de yetkin olmak ve her ikisini de kullanmak zorunda kalacaklardı. Uzun zamandır her ikisinde de yazılı rutinler olacaktır. Haskell gibi bir şeye geçmek isterlerse ya da en başta C ++ / MFC kullanıyorlarsa, çok daha fazla değişiyorlardı ve bu çok daha pahalı olurdu.

Ayrıca, uzun süredir C # programcıları ve Microsoft desteğini sürdürecek bir tedarik olacak. Mevcut BT uygulamalarına güvenilebilir. Aynı düzeyde kurumsal destek veya programcıların sürekli kullanılabilirliğinin sağlanması güvencesi yoktur.

Bu nedenle, çoğu işletme için, işlevsel programlamada bir değişiklik yapmak önden pahalıya mal olacak ve uzun vadede potansiyel olarak yumuşak olması dışında, yalnızca BT maliyetlerindeki düşüşün uzun vadede yeterli olması durumunda ücret ödeyecektir.


2

Kodları zaten işlevsel bir tarzda yazıyorsunuz, sadece bilmiyorsunuz.

Kodunuz için birim testleri yapmanız gerektiğinde, yan etkileri oluşturmayan veya bunlara bağlı olmayan test edilebilir işlevler yazma eğilimindedir ve her zaman aynı sonucu aynı argümanlar üzerinde (salt işlevler olarak adlandırılır) verir. İşlevsel programların birincil avantajı budur.

Bence işlevsel diller çok sınırlı. Bu nedenle zorunlu dilleri işlevsel olanlarla değiştirmek yerine, zorunlu dillerin işlevsel özellikleri olur. Günümüzde hemen hemen her programlama dilinde kapaklar ve lambdalar vardır.


1

Sorunuza sadece tek bir cevap olduğuna inanıyorum. Bu cevabın neden böyle olduğu ile ilgili birçok nedene katılabilirsiniz, ancak bunlar farklı sorular.

İşte burada:

  • Yazılım mimarları işe yarayacağına emin oldukları çözümler sunar.
  • Mimarların çoğu fonksiyonel dillerde çalışmıyor.
  • Teknolojiler ve diller seçildikten sonra, işletmeler onlarla çalışabilecek kişileri bulur.

Yakalıyor mu? Bunların hepsi, fonksiyonel dilleri kullanmakta kendine güvenen insanların mimar olmalarına ve üzerinde çalıştıkları projeler için kullanmayı seçmelerine bağlıdır.


0

Asıl sorun devlet.

İşlevsel dillerin küresel durumu yoktur. Endüstriyel sorunların çoğu, küçük ölçekte bazı fonksiyonlar gerçekten gerektirmese bile (bir defteri işleme alırken) büyük ölçüde devlet gerektirir (bir defteri veya bir işlem kümesini nasıl temsil edersiniz).

Ancak, doğal olarak devletle dolu olan Von-Neuman mimarisi makinelerinde kod kullanıyoruz. Dolayısıyla aslında devletten kurtulmadık, işlevsel diller devletin karmaşıklığını geliştiriciden gizliyor. Bu, dil / derleyicinin perde arkasındaki durumla ilgilenmesi ve onu yönetmesi gerektiği anlamına gelir.

Dolayısıyla, işlevsel dillerin küresel bir durumu olmasa da, durum bilgileri parametre ve sonuç olarak iletilir.

Öyleyse soru şu, dil, devleti duygunun arkasında verimli bir şekilde ele alabilir mi? Özellikle veri büyüklüğü mimarinin büyüklüğünü aştığında.

Donanım Tarafından Bakmak

İşletim sistemi son birkaç yıl içinde adres alanını görselleştirmede çok yardımcı oldu, böylece uygulamaların resmi olarak endişelenmesine gerek kalmadı. Ancak endişelenmeyen uygulamalar, bellek baskısı yoğunlaştığında donanıma girme tuzağına düşebilir (donma donanıma, işlemlerinizi süründürmek için yavaşlatır).

Programcı, işlevsel dilde durum üzerinde doğrudan kontrol sahibi olmadığından, bunun için derleyiciye güvenmeleri gerekir ve bunu iyi yapan işlevsel dilleri görmedim.

Madalyonun öbür tarafında, durum dolu programcının durum üzerinde doğrudan kontrolü vardır ve bu nedenle düşük bellek koşullarını telafi edebilir. Yine de, aslında bunu yapacak kadar akıllı olan pek çok programcı görmedim.

Endüstri tarafından bakıldığında:

Endüstri, çok sayıda verimsiz devlet tam programlayıcısına sahiptir.

Ancak bu programlardaki gelişmeleri zaman içinde ölçmek kolaydır. Programın nasıl işlendiğini geliştirerek kodu geliştirebilecekleri bir takım geliştiricilerin problemini çözersiniz.

İşlevsel programlar için , programları geliştirecek araçları geliştirmeye ihtiyaç duyduğunuz için iyileştirmeleri ölçmek daha zordur (uygulamaların, programın genel iyileştirmesini değil, burada temelde devletin nasıl verimli bir şekilde kullanıldığını araştırıyoruz).

Bu yüzden endüstri için koddaki gelişmeleri ölçmenin kabiliyetine indiğini düşünüyorum.

Bir işe bakış açısından

Kiralanabilecek çok sayıda stat dolu programcı var. Fonksiyonel programlayıcıları bulmak zor. Dolayısıyla, temel arz ve talep modeliniz, endüstri fonksiyonel stil programlamasına geçerse ve bu onların olmasını istedikleri bir şey değilse (programcılar olduğu gibi pahalı) ortaya çıkar.


2
İşlevsel diller, özellikle de işlevsel dilleri "saf olmayan" bir biçimde, küresel durumla tamamen iyi başa çıkabilir. Programların genellikle farklı katmanlara ayrıldığını görüyorum: örneğin, küresel durum ... ama işlevsel durum geçişleri ... bu yerel geçişlerin (maskelenmiş) durumlarıyla, bu geçişlerin performans açısından kritik kısımlarını uygulamak için, vb. Zorunlu dillerle ilgili sorun , IMO işlevsel programların daha iyi çalışacağı durumlarda programcıların durumu uygun olmayan bir şekilde kullanmalarına neden olurlar. Ancak dillerin her iki stile de iyi destek olma yönünde geliştiği görülmektedir.
Ryan Culpepper 30:11

1
Devletle fonksiyonel dillerde başa çıkmak çok kolaydır, ancak vurguda bir kayma gerektirir. Zorunlu dillerde, durumu değiştiren yordamları yazarken, işlevsel dillerde, durumu değiştiren yordamları döndüren işlevleri yazıyorsunuz.
dan_waterworth

"İşlevsel dillerin küresel durumu yok" - Küresel duruma ihtiyacınız yok. Neredeyse tüm devlet yönetimi monadlar aracılığıyla yapılabilir.
Arunav Sanyal

-3

Bu soru biraz yanlış öncül var. Aşağıdaki sebeplerden dolayı:

  1. Fonksiyonel programlama aslında sektörde oldukça yaygındır. Ancak, yalnızca deneyimli programcıların bulunduğu yerlerde kullanılır. Yeni başlayanların bunu bilmesi beklenemez. Neredeyse tüm büyük programlama projeleri onu kullanıyor, ancak sadece deneyimli programcılar tarafından yönetilen alanlarda tutuyorlar. Yeni başlayanlar, fonksiyonel programlama gerektirmeyen kolay modüller ile ilgileneceklerdir.
  2. Bu gerçeğe bakıldığında, insanları işe alan şirketler (genellikle üniversiteden gelen gençler) gerçekten işlevsel programlama deneyimi istemezler. Fonksiyonel programlama gerektiren projelerde herkes 15 yıldır aynı şirkette.
  3. Üniversiteler bunu öğretmeye başlıyor, çünkü biliyorlar ki artık 30 yıl içinde fonksiyonel programlama bilgisinin çok faydalı olacağını biliyor. Zaman aralığı 30 yıl, şirketlerdeki gibi normal yarı yıl değil.
  4. Bu noktalar, insanların işgücüne girdiklerinde hayal kırıklığına uğramasının ve üniversitede öğrendiklerinin kullanılmadığını görmelerinin nedenidir. Ancak 30 yıl süre için tasarlandılar ve sonunda faydalı olacaklar - sadece şirketler basit şeyleri kullanıyorlar - insanların bilmesini bekleyebilecekleri şeyler.
  5. Ayrıca birkaç yıl üniversitenin ardından, gerçek yazılım projelerinde kullanmak için yeterince işlevsel bir programlama bildiğinizi düşünüyorsanız kibirli olursunuz. Önce basit şeylerden başla. Çalışmaya başladığınızda ilk işiniz olarak en karmaşık yazılımı yapmanız gerekmez. Sonunda karmaşık şeylere ulaşacaksınız, ancak zaman alıyor.

2
1) “hemen hemen tüm büyük programlama projeleri kullanıyor”. Benim deneyimlerim bunun gerçek olmaktan uzak olduğu. Çok az şirket bildiğim kadarıyla fonksiyonel programlama kullanıyor. Çoğu yalnızca Java ve C # kullanır (C # son birkaç yılda daha işlevsel yapılara sahip olsa da), C ++ ve C
Jonas

2
2) Benim deneyimim tam tersi. İşlevsel programlamayı bilen tek kişi üniversitelerden insanlar gibi görünmektedir . Burada İsveç'te, çoğu üniversite birinci sınıftan itibaren işlevsel programlama öğretiyor. Ve MIT gibi üniversiteler yakın zamana kadar ilk programlama kursunda (Program) fonksiyonel programlama kullanıyorlar.
Jonas

@ jonas: hayır, programlama dilinin onunla hiçbir ilgisi yok. Tabii ki C ve C ++ ve java vb. Çok sayıda proje tarafından kullanılır. İşlevsel programlama da c ++ koduyla çalışıyor. Mevcut uygulama, projenin bir kısmının OO kullandığı ve bir kısmının işlevsel programlama kullandığı görülüyor. Her iki bölüm de aynı dili kullanır (genellikle c / c ++)
tp1

Evet, C de OO yapabilirsin. Ancak bu tavsiye edilmez. C ve C ++, işlevsel programlama için pek çok kurguya sahip değildir; örneğin, varsayılan olarak değiştirilemez, desen eşleştirmesi için iyi bir destek yoktur, değiştirilemez veri yapıları dahil değildir ve ...
Jonas

İşte bu yüzden deneyimli programcılar gerektiriyor. Programlama dilini ana dillerden değiştirmek oldukça imkansız olduğundan, bir sonraki en iyi şey c ++ 'da fonksiyonel programlama yapmaktır. Ayrıca c ++ oldukça yardımcı olan const gibi şeyler vardır.
tp1

-10

Çünkü FP'de hata ayıklamak daha zor.


11
Katılmıyorum. Teminat etkisi olmadan hata ayıklama işlemi daha kolaydır. Belki daha zor olduğunu düşünüyorsunuz, çünkü fonksiyonel paradigma farklıdır ve hata ayıklama dahil yeni şeyler yapmanın rahat olması için tecrübe gerektirir.
Maniero

2
Fonksiyonel programlama dilleri test etmek daha kolaydır çünkü saf fonksiyonlar durumsuzdur.
Jonas

4
Jonas, "test" demedim, "hata ayıkla" dedim, yani. yaptığın bir hata bul. Test yapmak bunun bir parçası, ancak program hakkında akıl yürütme, vb. Büyük oyundur - Ben buna katılıyorum. Bu FP'nin gücünün bir işlevi. Herhangi bir kod satırı ne kadar çok iş yaparsa, hangi kod satırının soruna neden olduğunu görmek o kadar zor olur. Kod satırı ile efekt arasındaki eşleme, örneğin daha yaygındır. Tek bir üst düzey işlev programın düzinelerce davranışına dokunabilir ve bunun tersi de geçerlidir. Belirtiler aynı hatanın farklı noktaları arasında çılgınca değişebilir.
yıldızlararası

Benim deneyimlerime göre hiç hata ayıklamak zor değil. F # kullanıyorum ve örneğin hata ayıklamayı daha zor bulmanın nedenini bulamıyorum, örneğin. Haskell'de tembellikten dolayı hata ayıklama daha zor olabilir (hiçbir fikrim yok), ancak Jonas'ın söylediği gibi vatansızlık nedeniyle istekli FP programlaması daha basittir. Başka bir deyişle, FP kodu daha tahmin edilebilirdir, çünkü sonucun görünmeyen değişkenlerden etkilenmediğini bilirsiniz.
Muhammad Alkarouri

2
İşlevleriniz saf olduğu sürece, hata ayıklama kolaydır. Birim testler ekleyerek hata ayıklayamazsanız, o zaman yeterli bir yazı yazma işi yapmazsınız.
dan_waterworth
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.