İşlevsel Programlama ve Bilimsel Hesaplama


42

Bu belirsiz bir soru ise özür dilerim, ama işte:

Geçtiğimiz birkaç yıl boyunca, işlevsel programlama , Yazılım Mühendisliği topluluğunda büyük ilgi gördü. Birçoğu Scala ve Haskell gibi dilleri kullanmaya başladı ve diğer programlama dilleri ve paradigmalarına göre başarı talep etti. Sorum şu: yüksek performanslı bilgi işlem / bilimsel bilgi işlem uzmanları olarak, işlevsel programlamaya ilgi göstermeli miyiz? Bu mini devrime katılmalı mıyız?

SciComp çalışma alanındaki işlevsel programlamanın avantajları ve dezavantajları nelerdir?


2
Neden kendini bilerek düz bir ceketi giydin? Yan etkiler bir araçtır; gerçek dünya uygulamaları için esastır. CPU ve bellek verimliliği istiyorsanız, işlevsel programlama dilleri radarımda olmaz. Otomatik doğrulama / doğruluk kontrolü gerektiren programlar (örneğin, bir nükleer tesiste kullanım için?), O zaman tamam olabilir.
Çırak Kuyruğu Kuyruğu

Yanıtlar:


34

Sadece biraz işlevsel programlama yaptım, bu nedenle bu cevabı bir tuz tuzu ile alın.

Artıları:

  • İşlevsel programlama çok matematiksel görünüyor; bazı matematiksel kavramları ifade etmek için güzel bir paradigma
  • Programların resmi olarak doğrulanması ve teoremlerin ispatlanması gibi şeyler için iyi kütüphaneler vardır, bu nedenle programlar hakkında düşünen programlar yazmak mümkündür - bu özellik tekrarlanabilirlik için iyidir
  • Fonksiyonel programlama Python ve C ++ ile lambda ifadeleriyle yapılabilir; Julia ve Mathematica'da da fonksiyonel programlama yapabilirsiniz.
  • Birçok insan kullanmıyor, bu yüzden öncü olabilirsin. Tıpkı MATLAB, Python, R, ve şimdi Julia'nın ilk uygulayıcıları olduğu gibi, onu yakalamak için fonksiyonel programlamanın ilk uygulayıcıları olması gerekir.

Eksileri:

  • Genellikle Haskell, OCaml (ve diğer ML lehçeleri) ve Lisp gibi işlevsel programlama dilleri olarak düşünülen diller, performans açısından kritik bilimsel hesaplama için kullanılan dillere göre genellikle yavaş olarak düşünülür. OCaml, en iyi ihtimalle, yaklaşık C kadar hızlıdır.
  • Bu diller, bilgisayar bilimlerinde sıkça kullanılan dillerle karşılaştırıldığında kütüphane altyapısından yoksundur (Fortran, C, C ++, Python); Bir PDE'yi çözmek istiyorsanız, bunu hesaplama bilimlerinde daha yaygın olarak kullanılan bir dilde yapmaktan daha kolay değildir.
  • İşlevsel programlama dillerini kullanan, işlemsel dilleri kullandığı kadar hesaplamalı bir bilim topluluğu da yoktur; bu, öğrenmede ya da hata ayıklamada çok fazla yardım almayacağınız anlamına gelir ve insanlar muhtemelen size çok şey verecekler kullanarak (hak ettin ya da etme)
  • İşlevsel programlama stili, genellikle giriş niteliğindeki bilgisayar bilimi derslerinde ve "Bilim Adamları ve Mühendisler için MATLAB" tip derslerinde öğretilen, prosedürel programlamada kullanılan stilden farklıdır.

"Eksileri" bölümündeki itirazların çoğunun üstesinden gelinebileceğini düşünüyorum. Bu Stack Exchange sitesinde ortak bir tartışma konusu olduğu için, geliştirici süresi yürütme süresinden daha önemlidir. İşlevsel programlama dilleri yavaş olsa bile, performans kritik bölümleri daha hızlı bir prosedür diline devredilebilirse ve hızlı uygulama geliştirme yoluyla verimlilik kazanımları gösteriliyorsa, kullanmaya değer olabilir. Burada, saf Python, saf MATLAB ve saf R'de uygulanan programların, aynı programların C, C ++ veya Fortran'daki uygulamalarından çok daha yavaş olduğunu belirtmekte fayda var. Python, MATLAB ve R gibi diller tam anlamıyla popülerdir, çünkü verimlilik için işlem hızı sağlarlar ve o zaman bile, Python ve MATLAB, C veya C ++ 'da derlenmiş koda arayüzleri uygulamak için olanaklara sahiptir, böylece performans açısından kritik kodun hızlı bir şekilde yürütülmesi için uygulanabilir. Çoğu dil, C'ye yabancı bir işlev arabirimine sahiptir ve bu sayede bilgisayar bilimcilerinin ilgilendiği çoğu kütüphaneyle etkileşime geçmesi yeterlidir.

İşlevsel programlama ile ilgilenmeniz gerekir mi?

Bunların hepsi, neyin havalı olduğunu düşündüğünüze bağlı. Eğer kongre düzenlemeye razı olan biriyseniz ve fonksiyonel programlama ile yapmak istediğiniz her şeyin erdemleri hakkında insanlara yayılma sloganını atmaya istekliyseniz, bunun için gidin derim. . Tüm bilgisayar kullanıcılarını yanlış ispat etmekten başka bir neden olmasa bile, bilgisayar bilimlerinde işlevsel programlama ile insanların harika şeyler yaptıklarını görmek isterdim (ve çok fazla sayıda reklamcı olacak). Size soran bir grup insanla ilgilenmek isteyen biri değilseniz, "Neden cehennemde işlevsel bir programlama dili kullanıyorsunuz (en sevdikleri prosedürel programlama dilini buraya ekleyin)?" Rahatsız etmeyin.

Simülasyon yoğun çalışma için işlevsel programlama dillerinde bazı kullanımlar olmuştur. Nicel ticaret şirketi Jane Street, finansal modelleme ve işlem stratejilerinin uygulanması için OCaml'ı kullanıyor. OCaml, FFTW'de kütüphanede kullanılan bazı C kodlarını üretmek için de kullanıldı. Liszt Stanford'da geliştirilen ve PDE'lerin çözümünde kullanılan Scala'da uygulanan bir alana özgü dildir. İşlevsel programlama kesinlikle endüstride kullanılır (zorunlu olarak bilgisayar bilimlerinde değil); hesaplamalı bilimde havalanıp kalkmayacağı görülmeye devam ediyor.


4
Bir Pro ve bir Con eklemek için katkıda bulunmak istiyorum. Pro :: kod esnekliği: her şey bir işlev olduğu için, bu işlevi her zaman başka bir işlevle çağırabilirsiniz; bu son derece güçlü. Con :: kod okunabilirliği: işlevsel programlama kodlarını okumak gerçekten zor; Onları (çoğu) yazmış olanlar için bile. 6 ay önce Mathematica'da B-spline'lı bazı genel PDE sorunlarını çözmek için yazdığım bazı eski kodları anlamam biraz zaman alıyor; Bazı meslektaşları korkutmak istediğimde daima bu kodu çıkarırım ;-).
seb

4
Ekleyeceğim tek şey: Con :: bellek tüketimi . Yan etkileri ortadan kaldırmak için çok fazla kopyalama yapılması gerekir.
Matthew Emmett,

1
@StefanSmith: (i) Bazen araştırmada kullanıldığını biliyorum (örneğin, Maxima Lisp tabanlı bir CAS); Bunun ötesinde, kafamın tepesinden haberim yok. (ii) Hiç bir fikrim yok. Cevabımın çoğu, son birkaç yıldır yaptığım konuşmalardan toplanan anekdot kanıtlara dayanıyordu.
Geoff Oxberry

@seb, neredeyse Haskell benzeri işlevsel diller için geçerli olmayan Lisp benzeri işlevsel dillerin özelliklerini açıklıyormuşsunuz gibi geliyor.
Mark S.

1
@MatthewEmmett tarafından yapılan yorum için büyük oy kullanın. Kopyalama, yüksek performanslı hesaplamalar için çok pahalı olabilir.
Charles

10

Bu konuda belki benzersiz bir bakış açım var çünkü bilimsel bir hesaplama geçmişi olan ve işlevsel bir programlama dili kullanıcısı olan bir HPC uygulayıcısıyım. HPC'yi bilimsel hesaplama ile eşitlemek istemiyorum, ancak önemli bir kesişme var ve bu yüzden buna cevap verdiğim bakış açısı.

HPC kullanıcıları ve müşterileri gerçekten mümkün olduğu kadar yüksek performansa ulaşmayı gerçekten önemsiyorlarsa, şu an için HPC'de işlevsel dillerin kullanılması pek olası değildir. Kod işlevsel bir şekilde yazıldığında, doğal olarak istismar edilebilecek paralellik gösterdiği, ancak HPC'de yeterli olmadığı doğrudur. Paralellik, yüksek performans elde etmek için bulmacanın yalnızca bir parçasıdır, ayrıca çok çeşitli mikro-mimari detayları göz önünde bulundurmalısınız ve bunu yapmak genellikle kodun yürütülmesi üzerinde çok ince kontrol gerektiren bir kontrol gerektirir; bildiğim işlevsel diller.

Dedi ki, bunun değişebileceğine dair büyük umutlarım var. Araştırmacıların bu mikro-mimari optimizasyonların çoğunun (bir dereceye kadar) otomatikleştirilebileceğinin farkına varmaya başladıklarını fark ettim. Bu, bir kullanıcının olmasını istediği hesaplamanın bir "spesifikasyonunu" girdiği kaynak-kaynaktan derleyici teknolojisinin bir hayvanat bahçesini yarattı ve derleyici, verimli bir şekilde gerekli olan optimizasyon ve paralellik ile bu hesaplamayı gerçekleştiren C veya Fortran kodunu çıkardı hedef mimariyi kullanın. Bu arada, işlevsel dillerin yapmaya iyi adapte olduğu şey budur: programlama dillerini modelleme ve analiz etme. İşlevsel dillerin ilk ana uygulayıcılarının derleyici geliştiricileri olması tesadüf değildir. Birkaç kayda değer istisna dışında, bunun henüz bir anlam ifade ettiğini görmedim, ancak fikirler var.


8

Diğer iki cevaba bir bakış açısı eklemek istiyorum. Ekosistemin yanı sıra, işlevsel programlama, çoklu okuma veya dağıtılmış hesaplama gibi paralel işlemler için mükemmel bir fırsat sağlar. İçsel değişmezlik özellikleri, zorunlu diller söz konusu olduğunda genellikle * uykuda * gerçek bir acı olan paralellik için uygun kılar.

Son yıllarda donanım performansındaki iyileşme, daha yüksek frekansları bastırmak yerine işlemcilere çekirdek eklemeye odaklandığından, paralel hesaplama çok daha popüler hale geliyor (bahse girerim bunu hepiniz biliyorsunuzdur).

Geoff'in bahsettiği bir diğer şey, geliştirici zamanının genellikle yürütme zamanından daha önemli olduğudur. Hesaplamalı olarak yoğun bir SaaS üreten bir şirket için çalışıyorum ve C ++ vs Java'yı seçerken ilk performans testini yaptık. C ++ 'nın Java üzerinden yürütme süresinde yaklaşık% 50'lik bir kesim sağladığını tespit ettik (bu hesaplama geometrisi içindi ve rakamlar uygulamaya bağlı olarak büyük olasılıkla değişecektir), ancak geliştirici zamanının önemi nedeniyle yine de Java ile gittik ve optimizasyonlar ve gelecekteki donanım performans iyileştirmeleri pazarda olmamıza yardımcı olacaktır. Aksi halde seçtiğimiz güvenle, hala işimizde olmayacağımızı söyleyebilirim.

Tamam, ama Java işlevsel bir programlama dili değil, bu yüzden ne bir şeyle ilgisi var diye sorabilirsiniz. Peki, daha sonra fonksiyonel paradigmanın daha fazla savunucusu kullandıkça ve paralelleştirme ihtiyacına rastladıkça, sistemimizin bölümlerini aşamalı olarak geçirdik, bu da işlevsel programlamanın olumlu yönlerini zorunlu olanın gücü ile birleştirir ve iyi bir şekilde birleşir. Java. Sistemimizin performansını en az baş ağrısı ile artırırken muazzam bir şekilde bize yardımcı oldu ve muhtemelen yarının işlemcilerine daha fazla çekirdek tıkandığında donanım işinde daha fazla performans artışından faydalanmaya devam edecek.

Diğer cevaplarda belirtilen eksilere tamamen katılıyorum, ancak paralel uygulamanın kolaylaştırılmasının söz konusu olamayacak kadar güçlü bir profesyonel olduğunu düşündüm.


8

Geoff, noktalarından birini vurgulamaktan başka çok az şey eklememin nedenleri hakkında iyi bir genel bakış sunmuştur: ekosistem. İşlevsel programlamayı veya başka bir paradigmayı savunuyor olsanız da, ele almanız gereken önemli sorulardan biri, yeniden yazmanız gereken üzerine inşa edebileceğiniz inanılmaz miktarda yazılımın olmasıdır. Örnekler doğrusal cebir için MPI, PETSc veya Trilinos veya sonlu eleman kütüphanelerinin tümü - hepsi C veya C ++ ile yazılmış. Sistemde çok büyük bir atalet vardır, çünkü belki de herkes C / C ++ 'ın hesaplamalı yazılım yazmanın en iyi dili olduğunu düşünmez, çünkü birçok insan hayatlarını yıllarca kullanabileceği bir şey yaratarak geçirdi. bir çok insan.

Çoğu bilgisayarlı insanın, yeni programlama dillerini denemede ve bu soruna uygunluklarını değerlendirmede büyük bir değer olduğu konusunda hemfikir olacağını düşünüyorum. Ancak bu zor ve yalnız bir zaman olacak çünkü başkalarının yaptıkları ile rekabet edebilecek sonuçlar üretemezsiniz. Aynı zamanda, bir sonraki hareketi farklı bir programlama paradigmasına başlatan biri olarak ün kazandırabilir. Hey, Fortran'ın yerine sadece C ++ gelmesi yaklaşık 15 yıl aldı!


6
Ve C ++, en iyi ihtimalle, bu alandaki Fortran'ı değiştirmenin sadece yarısıdır. Her zaman Fortran'da yeni kodlar görüyoruz ve birçok eski miras alıyoruz!
Bill Barth

2
C ++ (Fortran'dan farklı olarak) hem öğrenmek hem de kullanmak için fazla karmaşık. Fortran'da yeni açık kaynaklı bilimsel kodlar hala yazılmaktadır. Benim bölgemde dikkate değer (Yer Bilimleri) PFlotran, SPECFEM3D, GeoFEM vb. Atmosferik bilimlerde hemen hemen tüm yeni kodlar için aynen öyle. IMHO C ++, değiştirilmesi gerekenleri bile değiştirmedi (C).
stali

1
Fortran'ı denemelisin, Wolfgang, harika bir dil, öğrenmesi / yazması kolay ve hız seni hayal kırıklığına uğratmayacak.
Ondřej Novertík

3
Hız umrumda değil (peki, biraz yapıyorum ama bu başkaları için geçerli değil). Benim için önemli olan karmaşık bir algoritmanın programlanmasının ne kadar sürdüğü ve Fortran'ın bu cephede kaybolduğu için dil çok basit. Konuşacak standart bir kütüphane yok, genel kod için izin verilecek şablon yok, yarı değerli nesne yönelimi. Fortran basitçe benim dilim değil ve açıkçası, neredeyse bütün diğer bilimsel bilgi işlemciler için de olmamalı.
Wolfgang Bangerth

4
@StefanSmith: Evet. Bilimsel hesaplamada savunulabilir bir fikir olabilir (hala eski ve verimsiz olduğunu iddia edeceğim). Öğrencilerin eğitimi söz konusu olduğunda kesinlikle savunulamaz - çünkü öğrencilerimizin çoğu akademiden ayrılır ve endüstride pratikte kimse Fortran kullanmaz.
Wolfgang Bangerth

7

Hızlı özet şu ki

  1. Sayısal hesaplama, hızlandırmalarının çoğunu elde etmek ve tahsisleri azaltmak için değişkenlik / yan etkiler kullanır (birçok işlevsel programlama yapısının değişken verileri vardır)
  2. Tembel değerlendirme sayısal kodlarla kullanmak zor olabilir.
  3. Ya gerçekten performans için en düşük seviyelere inen bir paket geliştiriyorsunuz (C / Fortran ya da şimdi Julia) (bunlarda assembler kodunu gerektiği gibi düzenleyebilirsiniz) ya da bu hızlı kütüphaneleri kullanan bir senaryo yazıyorsunuzdur. bu yüzden çoğunlukla gelişme zamanını önemseme eğilimindesiniz (ve böylece Julia / MATLAB / Python / R'yi seçiyorsunuz). İşlevsel diller, diğer disiplinlerde yardımcı olan, ancak burada bu kadar yardımcı olmayan garip bir orta zeminde durma eğilimindedir.
  4. Diferansiyel denklemler, optimizasyon, sayısal lineer cebir, vb. İçin sayısal algoritmaların çoğu yakınsaklık anlamında yazılır / geliştirilir / kanıtlanır, yani yaklaşımına sahipsiniz ve almak istiyorsunuz . Bu algoritmaları uygulamak için doğal stil bir döngüdür. (Ardışık olarak bazı multigrid algoritmaları gibi yazılmış bazı algoritmalar vardır, ancak bunlar çok daha nadirdir.)x n + 1xnxn+1

Bu gerçekler birlikte, işlevsel programlamayı çoğu kullanıcı için gerekli görünmüyor.


+1, ancak 3. noktaya bir ekleme: Yüksek seviyeli dillerdeki işlevsel özelliklerin oldukça faydalı olduğunu ve diğer cevaplarda (örneğin kolay paralelleştirme) belirtilen işlevsel dillerin avantajlarının birçoğunun bu senaryo için geçerli olduğunu düşünüyorum.
Szabolcs

3

Hesaplamalı Bilimde fonksiyonel programlamanın kullanılmasının yeni olmadığını belirtmenin ilginç olduğunu düşünüyorum. Örneğin, 1990 tarihli bu makale, kısmi değerlendirme kullanılarak Lisp'te (muhtemelen en eski işlevsel programlama dili) yazılmış olan sayısal programların performansının nasıl geliştirildiğini göstermiştir. Bu çalışma, 1992 tarihli bir makalede GJ Sussman ( SICP şöhreti) ve J Wisdom tarafından Güneş Sistemi'nin kaotik davranışına dair sayısal kanıtlar sağlayan bir alet zincirinin bir parçasıydı . Bu hesaplamaya dahil olan donanım ve yazılımlar hakkında daha fazla bilgiyi burada bulabilirsiniz .


1

R, fonksiyonel bir dildir ve ayrıca bir istatistik (& şimdi Makine öğrenmesi) dilidir ve aslında istatistikler için 1 numaralı dildir. Yine de bir HPC dili değil: fizik simülasyonları vb. Gibi geleneksel "sayı çıtçıtması" için kullanılmaz. Ancak, makine öğreniminin büyük istatistik simülasyonları (MCMC) için büyük kümeler (örneğin MPI aracılığıyla) üzerinde çalıştırılabilir.

Mathematica aynı zamanda işlevsel bir dildir ancak ana alanı sayısal hesaplama yerine sembolik hesaplamadır.

Julia'da işlevsel bir şekilde de programlayabilirsiniz (prosedürel ve OO tadılarının yanı sıra (çoklu gönderim)) ancak saf değildir (temel veri yapılarının tümü değişkendir (tlaslar hariç), değişmez kütüphaneler olmasına rağmen İşlevsel veri yapıları Daha da önemlisi, işlem tarzından daha yavaştır, bu yüzden fazla kullanılmaz.

Scala'ya işlevsel bir dil değil, nesne işlevsel bir melez diyeceğim. Scala'da birçok işlevsel kavramı kullanabilirsiniz. Scala, Spark nedeniyle Cloud computing için önemlidir ( https://spark.apache.org/ ).

Modern Fortran'ın aslında işlevsel programlamanın bazı unsurlarına sahip olduğuna dikkat edin: işaretçi anlambilimine sahiptir (C'nin aksine), saf (yan etkisi yok) fonksiyonlara sahip olabilirsiniz (& olarak işaretleyin) ve değişmezliğe sahip olabilirsiniz. Matris indeksleri için koşulları belirleyebileceğiniz akıllı endekslemeye bile sahiptir. Bu, sorgu gibidir ve normalde yalnızca C # 'daki LINQ R gibi yüksek seviyeli bir dilde veya fonksiyonel dillerde yüksek dereceli filtre fonksiyonlarıyla bulunur. Yani Fortran hiç de fena değil, pek çok dilde bulunmayan oldukça modern özelliklere (örneğin ortak diziler) bile sahip. Aslında Fortran'ın gelecekteki versiyonlarında, Fortran'daki OO gerçekten garip ve çirkin olduğu için OO özellikleri yerine daha fazla fonksiyonel özellik eklemeyi tercih ederim.


1

Artıları, her bir işlevsel dilin içine yerleştirilmiş "araçlar" dır: Verileri filtrelemek çok kolaydır, veriler üzerinde yineleme yapmak çok kolaydır ve sorunlarınıza net ve özlü bir çözüm bulmak çok daha kolaydır.

Tek Con, kafanızı bu yeni düşünce tarzının etrafında toplamanız gerektiğidir: Ne bilmek zorunda olduğunuzu öğrenmek biraz zaman alabilir. SciComp etki alanındaki diğerleri gerçekten bu dilleri kullanmaz, bu da fazla destek alamayacağınız anlamına gelir :(

İşlevsel-bilimsel dillerle ilgileniyorsanız, bir tane https://ac1235.github.io geliştirdim


1

İşte nedeni fonksiyonel programlama için benim argümanlar vardır can ve gereken hesaplamalı bilim için kullanılabilir. Yararları çok büyük ve eksileri hızla gidiyor. Aklımda sadece bir con var:

Con : C / C ++ / Fortran'da dil desteğinin olmaması

En azından C ++ 'da bu kural ortadan kalkıyor - C ++ 14/17, fonksiyonel programlamayı desteklemek için güçlü olanaklar ekledi. Kütüphane / destek kodunu kendiniz yazmanız gerekebilir, ancak dil arkadaşınız olacaktır. Örnek olarak, burada C ++ 'da değişmez çok boyutlu dizileri olan bir (uyarı: fiş) kütüphanesi: https://github.com/jzrake/ndarray-v2 .

Ayrıca, burada fen bilimleri uygulamalarına odaklanmamasına rağmen, C ++ 'da fonksiyonel programlama üzerine iyi bir kitap .

İşte profesyonellerin olduğuna inandığım şeyin özeti:

Artıları :

  • doğruluk
  • Anlaşılırlık
  • Verim

Doğruluk açısından , işlevsel programlar açıkça ortaya konur : sizi fizik değişkenlerinizin asgari durumunu ve zaman içinde ilerleyen işlevi doğru şekilde tanımlamanız için zorlarlar:

int main()
{
    auto state = initial_condition();

    while (should_continue(state))
    {
        state = advance(state);
        side_effects(state);
    }
    return 0;
}

Kısmi bir diferansiyel denklemin (veya ODE) çözülmesi, fonksiyonel programlama için mükemmeldir; sadece bir advancesonrakini üretmek için mevcut çözüme saf bir işlev ( ) uygulıyorsunuz.

Tecrübelerime göre fizik simülasyon yazılımı kötü durum yönetimi tarafından yüklenen büyük ve büyüktür . Genellikle, algoritmanın her aşaması, paylaşılan (etkin bir şekilde küresel) durumun bir parçası üzerinde çalışır. Bu, doğru işlem sırasını sağlamayı zorlaştırır, hatta imkansız hale getirir, yazılımı seg-hatalar olarak tezahür ettirebilecek hatalara veya kodunuzu çökertmeyen ancak bilimin bütünlüğünü sessizce tehlikeye sokan hata terimlerine karşı savunmasız bırakır. çıktı. Bir fizik simülasyonunda paylaşılan durumu yönetmeye çalışmak aynı zamanda çoklu iş parçacılığını da engelliyor - bu, süper bilgisayarlar daha yüksek çekirdek sayımlarına doğru ilerlerken ve MPI ile ölçeklendirmenin çoğu zaman ~ 100k görevde üst sıralara çıkması nedeniyle gelecek için bir sorun. Buna karşılık, işlevsel programlama, değişmezlik nedeniyle paylaşılan bellek paralelliği önemsiz kılmaktadır.

Performans , algoritmaların tembel değerlendirmesi nedeniyle fonksiyonel programlamada da geliştirilmiştir (C ++ 'da, derleme zamanında birçok tip - yani bir fonksiyonun her uygulaması için bir tane). Ancak, sanal gönderimi ortadan kaldırmanın yanı sıra, bellek erişimlerinin ve tahsislerinin ek yükünü azaltır - derleyicinin bir bütün algoritmayı, onu oluşturan tüm fonksiyon nesnelerini bir kerede görerek optimize etmesine izin verir. Uygulamada, CPU ve bellek tahsislerinin kullanımını optimize etmek için değerlendirme noktalarının (algoritma sonucunun bir bellek tamponuna önbelleğe alındığı) farklı düzenlemelerini deneyeceksiniz. Modül veya sınıf tabanlı bir kodda göreceğinize kıyasla, algoritma aşamalarının yüksek yerelliği (aşağıdaki örneğe bakın) nedeniyle bu oldukça kolaydır.

Fonksiyonel programları , fizik durumunu önemsizleştirdikleri sürece anlamak daha kolaydır . Bu onların sözdizimlerinin tüm meslektaşlarınız tarafından kolayca anlaşılabilir olduğunu söylemek değildir! Yazarlar, iyi adlandırılmış işlevleri kullanmaya dikkat etmeli ve genel olarak araştırmacılar, işlemsel olarak değil, işlevsel olarak ifade edilen algoritmaları görmeye alışmalıdırlar. Kontrol yapılarının yokluğunun bazılarına zarar verebileceğini itiraf edeceğim, ancak bunun bilgisayarlarda daha iyi kalitede bilim yapabilmek için geleceğe girmemizi engellemesi gerektiğini düşünmüyorum.

Aşağıda paket advancekullanılarak sınırlı hacimli bir koddan uyarlanmış bir örnek fonksiyon verilmiştir ndarray-v2. to_sharedOperatörleri not edin - bunlar daha önce bahsettiğim değerlendirme noktaları.

auto advance(const solution_state_t& state)
{
    auto dt = determine_time_step_size(state);
    auto du = state.u
    | divide(state.vertices | volume_from_vertices)
    | nd::map(recover_primitive)
    | extrapolate_boundary_on_axis(0)
    | nd::to_shared()
    | compute_intercell_flux(0)
    | nd::to_shared()
    | nd::difference_on_axis(0)
    | nd::multiply(-dt * mara::make_area(1.0));

    return solution_state_t {
        state.time + dt,
        state.iteration + 1,
        state.vertices,
        state.u + du | nd::to_shared() };
}
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.