Haskell / Clojure parçacık simülasyonu gibi dinamik sistemler için gerçekten uygun değil mi?


9

Önceki sorularda işlevsel programlama dillerinin fizik motoru gibi dinamik sistemler için uygun olmadığı söylendi, çünkü esasen nesneleri değiştirmek pahalıya mal oldu. Bu ifade ne kadar gerçekçi ve neden?


4
Github.com/linneman/particles-clj'yi ilginç bulabilirsiniz . Due to the functional programming style the computational load will be distributed over the available CPU cores which can dramatically increase processing speed in some cases

2
Size uygun olmadıklarını kim söyledi? Yanıtlama / yorum yapma bağlantısı?
Andres

7
@Dokkat: Oradaki yorumcunun fonksiyonel programlama hakkında çok şey bildiğinden şüpheliyim, çok dürüst olmak gerekirse. Büyük bir tuz tanesi ile alırdım.
CA McCann

6
Buna ek olarak, yazar gerçekten işlevsel bir program yazmayı denediğini kanıtlamazsa , "Saf işlevsel bir yaklaşım oyunlara iyi bir uyum değildir ..." ile başlayan yanıtı da göz ardı ederdim . Aksi takdirde, sorunların ne olabileceğini düşündüğünü tahmin ediyor .
Andres

1
@Dokkat oyun geliştirme sadece bir parçacık simülatörü ve fizik motorundan ziyade ek işlev kısıtlamalarına sahiptir (fonksiyonel programlamaya oldukça uygun olabilir) - çalışma süresi performansı oyun geliştirme için anahtardır (ve bazen fizikten daha önemlidir). Patlamaları öngören bir maden şirketi için fizik motoru, doğruluktan daha fazla performans ister. İşlevsel programlama ile, daha fazla donanım atarak daha fazla performans elde edilebilir (oyun motorlarının yapamayacağı bir şey).

Yanıtlar:


10

Hem Haskell hem de Clojure gerçek değişime izin verir, bu yüzden başlamak bir sorun değildir.

Bunun ötesinde, "değiştirilebilir" verileriniz, bazı büyük hesaplamaların bir parçası olarak aşamalı olarak güncellenen ara değerlerden oluşuyorsa, verimli olmak için değişime bile ihtiyacınız olmayabilir! Örneğin, Haskell'de , derleyicinin ara veri yapılarını tamamen ortadan kaldırmak için işleme döngülerini, veri üreticilerini ve veri tüketicilerini kaynaştırdığı akış füzyonu adı verilen bir teknikle ilgili devam eden araştırmalar var .

Burada Haskell ile ilgili ana sorun tembelliktir - çok fazla giriş verisine ve çok sayıda çıkış verisine sahip olduğunuz bir sayı gevreklik programında ve hepsi önemlidir, tembellik size çok az iyilik yapar, ancak yine de biraz ek yük getirir. Bu, Haskell'de böyle programlar yazamayacağınız anlamına gelmez (aslında insanlar yapar), ancak dilin güçlü yönlerini oynamıyor ve istediğiniz performansı elde etmek için değerlendirme modelini daha iyi anlamanız gerekiyor.

Bununla birlikte, ağır sayıdaki çatırdama da JVM'nin güçlü yönlerine uymuyor. Bu tür bir program FORTRAN'ın hala etrafta olmasının nedenidir.


1
kayda değer: GHC'nin yaklaşan 8.0 sürümü modül başına katı değerlendirme modunu destekleyecek.
Erik Kaplun

8

Clojure için konuşamam, ancak Haskell'de, istediğiniz tüm mutasyona izin verecek çok fazla ayarlanmış IO paketi var diyebilirim.

İşte birisinin en yaygın 3 tanesini detaylandırdığı ve performanslarıyla ilgili olduğu bir soruya cevap: /programming/15439966/when-why-use-an-mvar-over-a-tvar/15440286 # 15440286

Burada , yüksek derecede IO yoğun bir uygulama olan Warp adlı bir haskell web sunucusunun performans metriklerini gösteren basit bir grafik de görebilirsiniz .

Haskell ile ilgili bu konuda çok fazla kafa karışıklığı var, gerçek şu ki, çoğu yüksek derecede ayarlanmış IO'yu kullanmak için hackage üzerinde birçok pakete sahip fantastik IO tesisleri var. İnsanların bunu kabul etmesinin nedeni, Haskell'in IO'yu diğer her şeyden ayırmak için büyük çaba sarf etmesidir, ancak bunun performans özellikleri üzerinde hiçbir etkisi yoktur.

Ancak şimdi performans özellikleri hakkında konuşmak gerekirse, insanların bunu düşük performansa sahip olarak tanımasının nedeni, tembel değerlendirmenin her zaman sezgisel olmayan şekillerde davranmasına neden olmasından kaynaklanmaktadır. Ancak bu, bahsettiğiniz bir sistem gibi yıkıcı güncellemeler yaparak bir IO bağlamında çalışmaya başladığınızda çok daha az endişelenmeniz gereken bir şeydir. Daha fazla insan, performans sorunları yaşarken, kaynakların nereye gideceğini belirlemek ve tespit etmek için yerleşik tesislerin çok yardımcı olduğunu bulma eğilimindedir.

Açıkladığınız gibi bir sisteme bakmaya değer başka bir monad , özellikle çok küçük IO çağrıları tarafından yapılan yıkıcı güncellemeler için mükemmel performans sağlayan ST monad olacaktır .

Maalesef Clojure ile konuşamıyorum, umarım başka biri ayrıntı verebilir.

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.