Fonksiyonel reaktif programlama - Functional reactive programming

Fonksiyonel reaktif programlama ( FRP ), fonksiyonel programlamanın yapı taşlarını (örn. harita , indirgeme , filtre ) kullanan reaktif programlama ( eşzamansız veri akışı programlama ) için bir programlama paradigmasıdır . FRP, grafiksel kullanıcı arayüzleri (GUI'ler), robotik , oyunlar ve müzik programlamak için kullanılmıştır ve zamanı açıkça modelleyerek bu sorunları basitleştirmeyi amaçlamaktadır.

FRP Formülasyonları

Fonksiyonel reaktif programlamanın orijinal formülasyonu, Conal Elliott ve Paul Hudak'ın ICFP 97 tarihli Functional Reactive Animation makalesinde bulunabilir .

FRP, 1997'de piyasaya sürülmesinden bu yana birçok biçim almıştır. Çeşitliliğin bir ekseni, kesikli ve sürekli anlambilimdir. Diğer bir eksen, FRP sistemlerinin dinamik olarak nasıl değiştirilebileceğidir.

Sürekli

FRP'nin en eski formülasyonu, bir programın anlamı için önemli olmayan birçok operasyonel ayrıntıyı soyutlamayı amaçlayan sürekli anlambilim kullandı. Bu formülasyonun temel özellikleri şunlardır:

  • Sürekli zaman içinde değişen, "davranışlar" ve daha sonra "sinyaller" olarak adlandırılan modelleme değerleri.
  • Zaman içinde ayrık noktalarda meydana gelen " olayların " modellenmesi .
  • Sistem, genellikle "anahtarlama" olarak adlandırılan olaylara yanıt olarak değiştirilebilir.
  • Örnekleme hızı gibi değerlendirme ayrıntılarının reaktif modelden ayrılması.

Yan etkisi olmayan dillerdeki bu anlamsal FRP modeli , tipik olarak sürekli işlevler açısından ve tipik olarak zaman içindedir.

ayrık

Olaya Dayalı FRP ve 0.17'den önceki Elm sürümleri gibi formülasyonlar , güncellemelerin ayrık ve olay odaklı olmasını gerektirir. Bu formülasyonlar, robotik gibi bir ortamda veya bir web tarayıcısında verimli bir şekilde uygulanabilen basit bir API'ye sahip anlambilime odaklanarak pratik FRP'yi zorladı.

Bu formülasyonlarda, davranış ve olay fikirlerinin, her zaman geçerli bir değeri olan, ancak ayrı ayrı değişen sinyaller halinde birleştirilmesi yaygındır.

Etkileşimli FRP

Girdilerden çıktılara kadar sıradan FRP modelinin etkileşimli programlara pek uygun olmadığına işaret edilmiştir. Girdilerden çıktılara bir eşleme içinde programları "çalıştırma" yeteneğinin olmaması, aşağıdaki çözümlerden birinin kullanılması gerektiği anlamına gelebilir:

  • Çıktı olarak görünen eylemlerin bir veri yapısı oluşturun. Eylemler, harici bir yorumlayıcı veya ortam tarafından çalıştırılmalıdır. Bu, Haskell'in orijinal akış G/Ç sisteminin tüm zorluklarını devralır.
  • Oklu FRP kullanın ve eylemleri gerçekleştirebilen gömülü okları kullanın. Eylemlerin, örneğin ayrı değişken depolar tutmalarına izin veren kimlikleri de olabilir. Bu, Fudgets kitaplığı ve daha genel olarak Monadic Stream Functions tarafından alınan yaklaşımdır.
  • Yeni yaklaşım, eylemlerin şimdi (IO monad'da) yürütülmesine izin vermek, ancak sonuçlarının alınmasını daha sonraya ertelemektir. Bu, Event ve IO monad'ları arasındaki etkileşimi kullanır ve daha ifade odaklı bir FRP ile uyumludur:
planNow :: Event (IO a) -> IO (Event a)

Uygulama sorunları

İtme tabanlı ve çekme tabanlı olmak üzere iki tür FRP sistemi vardır. Push tabanlı sistemler, olayları alır ve bir sonuç elde etmek için bir sinyal ağı üzerinden iletir. Çekme tabanlı sistemler, sonuç talep edilene kadar bekler ve talep edilen değeri almak için ağ üzerinden geriye doğru çalışır.

Yampa gibi bazı FRP sistemleri, örneklerin sinyal ağı tarafından çekildiği örneklemeyi kullanır. Bu yaklaşımın bir dezavantajı vardır: ağ, girdideki değişiklikleri öğrenmek için bir hesaplama adımının süresi kadar beklemek zorundadır. Örnekleme, çekme tabanlı FRP'ye bir örnektir.

Hackage'deki Reactive ve Etage kitaplıkları, push-pull FRP adlı bir yaklaşım getirdi. Bu yaklaşımda, yalnızca tamamen tanımlanmış bir akıştaki bir sonraki olay (zamanları olan sabit olayların listesi gibi) talep edildiğinde, o olay oluşturulur. Bu tamamen tanımlanmış akışlar, Haskell'deki tembel listeler gibi davranır. Bu, çekme tabanlı yarıdır. Push tabanlı yarı, sistem dışındaki olaylar getirildiğinde kullanılır. Harici olaylar, tüketicilere bir olay yayınlandığı anda öğrenebilmeleri için iletilir.

Uygulamalar

  • Yampa , SDL, SDL2, OpenGL ve HTML DOM desteği ile oklu, verimli, saf bir Haskell uygulamasıdır.
  • Elm , FRP'yi desteklemek için kullanılan programlama dili , ancak o zamandan beri onu farklı bir desenle değiştirdi
  • refleks , Haskell'de tarayıcı / DOM , SDL ve Gloss için ana bilgisayarlar ile verimli bir Push/pull FRP uygulamasıdır .
  • reaktif-banana , Haskell'de bir hedef agnostik push FRP uygulamasıdır.
  • netwire ve değişken oklarla gösterilmiştir, Haskell'de FRP uygulamalarını çekin.
  • Flapjax , JavaScript'te bir davranış/olay FRP uygulamasıdır .
  • React , fonksiyonel reaktif programlama için bir OCaml modülüdür.
  • Sodyum , Java, TypeScript ve C# gibi çeşitli programlama dilleri için belirli bir UI çerçevesinden bağımsız bir push FRP uygulamasıdır.
  • JavaScript uygulaması rxjs tarafından popüler hale getirilen ReactiveX , verileri gözlemlenebilir akışlar olarak ele alarak işlevsel reaktif programlamayı uygulamak için kapsamlı bir platformlar arası paradigmadır.
  • Dunai , Haskell'de Classic ve Arrowized FRP'yi destekleyen Monadic Stream Functions kullanan hızlı bir uygulamadır .
  • ObservableComputations , platformlar arası bir .NET uygulaması.
  • Stella , zorunlu kodu reaktif kodla birleştirme sorunlarından (bunları aktörler ve reaktörlerde ayırarak) kaçınmayı amaçlayan bir "aktörler" ve "reaktörler" modelini gösteren aktör tabanlı bir reaktif programlama dilidir. Aktörler, dağıtılmış reaktif sistemlerde kullanıma uygundur.

Ayrıca bakınız

Referanslar

Dış bağlantılar