İşlevsel paradigma, altta yatan donanım ile genel olarak verimli olamayacak kadar mu farklı değil mi?


14

SO'dan bir sorudan ilham alındı: /programming/6623391/how-to-gain-control-of-a-5gb-heap-in-haskell

FP'nin sayısız avantajları ve dezavantajları hakkında uzun bir tartışma olabilir, ancak şimdilik, modern donanımdaki FP'nin temel verimliliğine kapsamı daraltmak istiyorum .

Tez:

İşlevsel paradigma değişmezlik ve vatansızlık (?) Anlamına gelir, ancak işlevsel programlar üzerinde çalıştığımız donanım durumsal sonlu otomatalardır. 'Saf işlevsel' programın 'durum bilgisi olan bir donanım' gösterimine çevrilmesi programcıya çok az kontrol bırakır, ek yük getirir (?) Ve donanım özelliklerinin (?) Kullanımını sınırlar.

Sorgulanan ifadelerde doğru mu yanlış mıyım?

FP'nin modern genel amaçlı bilgisayar mimarisine temel performans cezaları verdiği / ima etmediği kanıtlanabilir mi?

DÜZENLEME: Bazı yorumlara yanıt olarak daha önce belirttiğim gibi, soru uygulama performansı ve ayrıntılarıyla ilgili değil. Bu ilgili temel yükü varlığında veya yokluğunda getirebilir durum bilgisi otomata ile FP çalışan.


3
Hiç mı gerçekten düşük bir düzeyde nasıl çalıştığını Modern donanım baktı? Verimliliği hiç önemsiyorsanız, günlük zorunlu programlamaya da benzemez.
CA McCann

İster inanın ister inanmayın, ancak fonksiyonel programlama dilleri ve derleyicileri tasarlayan bilgisayar bilimcileri de performans için optimizasyon hakkında biraz bilgi sahibi olurlar. Bu, her işlevsel dil ürününün amacı değil, ciddi üretim platformları içindir.
Jeremy

@camccann, @Jeremy: C # ve Java gibi sanal makineleri kullanın. Öyle Optimal, C # ve Java programları üretimi için ne kadar verimli olursa olsun, oraya nasıl olursa olsun olan bir ana verimsizlik kaynağı ve VM olduğunu. Soru uygulama performansı ile ilgili değil running FP on stateful automata,.
vines


2
@vines: Süslü JIT'lere sahip modern VM'lerin bazı durumlarda yerel koddan daha iyi performans gösterebileceğini anlıyorsunuz, değil mi? Ve bir derleyicinin tüm amacı, bir programı herhangi bir modern dilden farklı olarak, temel mimariyle eşleşen bir temsile dönüştürmektir? Sorunuz bir anlam ifade etmiyor.
CA McCann

Yanıtlar:


7

Değişmezlikte büyük bir yanlış anlama var.

Değişmezlik anlambilimin bir özelliğidir, ancak uygulamada değişmezlik anlamına gelmez.

Basit bir örnek tembellik uygulamasıdır.

Hesaplamalar tembel olduğunda, bir ifadenin sonucu kavramsal olarak bir değerdir, ancak temeldeki uygulama, değerlendirilecek argümanları ve değeri oluşturma işlevini ve değeri depolamak için bir yuvayı içeren bir thunk'tır.

İlk kez (dilde) değeri soracağınız zaman, hesaplama aslında yapılacak, sonucu değerlendirilecek ve size (veya bir tanıtıcıya) geri verilen değer olacaktır.

Bu dil anlambiliminde saydamdır ve bildiğiniz tek şey, bu değişkenin bir değere (veya gelecekteki bir değere) bağlı olduğudur ve bir kez yapıldıktan sonra döndürülecek değeri değiştiremezsiniz. Temeldeki bellek gösterimi değişecektir, ancak bunu bilmeyeceksiniz.

Aynı semantik / uygulama farkı hemen hemen her dilde mevcuttur ve aslında optimizasyonun merkezinde yer alır . Dil ne olursa olsun, anlambilim bazı şeyleri garanti eder, ancak diğerlerini optimizasyon için yer bırakmak üzere belirtmeden bırakır.

Şimdi, pratik olarak işlevsel dillerin C ++ kadar hızlı olmadığı doğrudur. Ancak, Go(hala oldukça yutturmaca) Haskell veya Lisp'den daha yavaştır ve C # Mono ( kaynak ) da öyle.

Bu performansları elde etmek için güvenilmez C ++ veya C'nin ne kadar güvenilir olabileceğini gördüğünüzde, biraz serbest bırakmak isteyebilirsiniz.

Haskell'in bugün hızlı bir şekilde büyüdüğünü ve hala derleyici / çalışma zamanında optimizasyon için çok fazla alan olduğunu fark ettiğinizde (GHC örneğin yakın zamanda LLVM'ye geçti, Microsoft Research çalışma zamanı iyileştirmelerini aktif olarak finanse ediyor), yakında düzelecek.

Eğlence: Normal İfadelerde Oynama veya bir Haskell ekibinin re2, Google'dan C kütüphanesi olan birkaç senaryoda daha iyi performans gösteren normal bir ifade eşleştirici nasıl oluşturduğu .


İyimser geliyor :)
vines

3

İşlevsel paradigma, şeyi dar bir kapsamda bölmek için yararlıdır. Bu, bilgisayarın nasıl geliştiği göz önüne alındığında gerçekten iyi bir şey.

Çok çekirdekli CPU'nun paylaşılan kaynaklarla ilgili büyük sorunları var ve senkronizasyon maliyeti gerçekten çok pahalı. İşlevsel paradigma, sorunları olmayan programları ifade etmek için doğal bir yol sağlar. Bu paralellik için gerçekten iyi.

Ayrıca, SaaS ve bulut bilişim ile sunucu çiftliklerini giderek daha fazla kullanıyoruz. Bu nedenle, aynı uygulamanın birkaç makinede çalışması gerekir. Bu pozisyonda senkronizasyon maliyetleri daha da maliyetlidir. Google, yazabileceğiniz fonksiyonel programlama ve algoritma hakkında bazı çalışmalar yaptı ve bazı araştırma kağıtları yayınladı. Bu, onlar için önemli bir şey çünkü ölçeklenebilirlik sorunu var.

Ayrıca, bilgisayar yığınında bir yığın ve hatta bağlantılı listeleri kullanarak sürekli olmayan bir yığın yapabilirsiniz. Bu, birçok programlama dilinde yığın izlemesi oluşturmak için daha önce yapılır. Yani bu bir sorun değil.

Tamam, fonksiyonel programlama bazı sınırlamalar getirir. Ama aynı zamanda modern bilgisayarlarda sahip olduğumuz, alışılmış paradigmalarda son derece zor olan sorunsalları ifade etmek için doğal bir yol getiriyor. Ölçeklenebilirlik bunlardan biri ve gerçek bir anlaşma haline geliyor.

Zaten karmaşık bir paralel sistemle uğraşan herkes neden bahsettiğimi biliyor.

Bu yüzden cevabı incelerdim. Evet, işlevselliğin modern donanımla ilgili sorunu vardır, ancak sade eski programlamanın da bir kısmı vardır. Her zaman olduğu gibi avantajlar ve dezavantajlar bulacaksınız. Asıl mesele ne olduklarını bilmek, böylece istediğiniz zaman uygun seçimi yapabilirsiniz.


0

Şu anki durumu veya ne kadar zor olacağını bilmediğim için gerçekten bir cevabım yok, ancak derleyici bu şeyleri girdiden sağlayacağı için, çıktının onlara sahip olacağı anlamına gelmez. . Teorik olarak, yeterince akıllı bir derleyici tüm bu problemleri geçebilir, ancak pratikte muhtemelen her zaman var olacaktır.

Ancak, bakmanın bir başka yolu da Lisp makinesinin tarihine bakmaktır. Doğru hatırlıyorsam, başlangıçta Lisp'in o zamanki makinelerden farkı ile aynı sorunları aşacak şekilde tasarlandılar. Bu makinelerin geliştirilmesi sonunda durdu, çünkü masaüstündeki verimsizlikler başka bir makineyi desteklemekten daha ucuza yaşayacak kadar hızlı hale geldi.

Genel olarak, en yüksek performansa sahip kritik uygulamalar dışında FP dilleri hala yeterince hızlıdır. Herhangi bir üst düzey dili seçerseniz, daha güvenli, daha kolay, daha sürdürülebilir veya başka bir öncelik için ince ayar kontrolü ve performans önceliğini düşürmeye istekli olacaksınız.

Sonunda, programlama tamamen değişimlerle ilgilidir, bu yüzden sadece eldeki proje için neyin daha önemli olduğunu seçmesi gerekir.


0

İşlevsel paradigmanın değişmezliği ve vatansızlığı ima ettiği doğrudur, ancak tamamen saf programlama dillerine sahip değiliz. En saf Haskell bile yan etkilere izin verir.

Bununla birlikte, verimlilik hakkındaki sorunuza cevap vermek için hem Haskell'i hem de Clojure'u kullandım ve hiçbir performans sorunu da fark etmedim.


1
Sorunlar gereksinimlere göredir ... Performans açısından kritik alanlar ne olacak? Orada yüksek paralellik değerlidir, ancak toplam puan nedir?
vines

1
@vines: Performans açısından kritik bir uygulama için iki dili de kullanmadım, bu yüzden bununla gerçekten konuşamam.
Larry Coleman

1
Sonucu hiçbir yere kaydedemeyeceğiniz için yan etkisi olmayan çok eğlenceli değil.

@ Thorbjørn Ravn Andersen: ... izin verilen arayana geri göndermekten başka bir şekilde.
vines
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.