Bagaimana Pemrograman Reaktif Fungsional dan model Aktor berhubungan satu sama lain?

30

FRP adalah tentang streaming peristiwa dan perilaku melalui fungsi murni. Model Aktor - setidaknya, seperti yang diterapkan di Akka - adalah tentang streaming pesan abadi (yang dapat dianggap sebagai peristiwa diskrit) melalui objek yang berpotensi tidak murni, yang disebut aktor.

Jadi di permukaan mereka tampak terkait.

Apa lagi yang bisa kita katakan tentang bagaimana mereka berhubungan? Juga, apa yang bisa dikatakan tentang yang mana dari mereka yang lebih sesuai untuk domain aplikasi yang berbeda?

Robin Green
sumber

Jawaban:

26

Baik aktor maupun FRP tidak membahas streaming. Aktor bahkan tidak mendukung konfigurasi eksternal dari aliran output.

FRP sangat dicirikan oleh sinyal pemodelan dan peristiwa pada garis waktu linier, yang memungkinkan perilaku FRP untuk menyusun secara deterministik. Aktor sangat dicirikan oleh pemrosesan pesan dalam urutan non-deterministik, dan hampir tidak memiliki sifat komposisi (yaitu Anda tidak dapat memperlakukan pengaturan dua aktor sebagai aktor yang lebih besar).

Jika Anda mencari kesamaan, kedua aktor dan FRP memiliki hubungan dekat dengan kalkulus lambda. Keduanya dapat memodelkan sistem responsif terhadap input manusia. Keduanya mendukung pemodelan keadaan internal (lokal).

FRP mendukung keadaan lokal melalui integral atau akumulator (lipat dari waktu ke waktu), sementara model aktor mendukung negara dengan memungkinkan masing-masing aktor menentukan perilakunya untuk pesan berikutnya sebagai tanggapan terhadap yang sekarang. Dukungan luas ini untuk negara bagian membuat FRP dan Aktor tidak memadai untuk pemrograman langsung (atau peningkatan runtime kode program); menjadi terlalu mudah kehilangan status penting.

Mengenai domain aplikasi:

Model aktor sangat cocok untuk sistem terbuka, di mana kita mungkin ingin menginstal atau memelihara aktor saat runtime. Model aktor juga sangat tidak cocok untuk sistem terdistribusi, karena pemesanan pesan yang non-deterministik dapat membuat implementasi yang sesuai menjadi lebih mudah. (Alasan para aktor tidak lebih cocok untuk sistem terdistribusi adalah bahwa memastikan pesan datang 'sekali dan hanya sekali' cukup sulit dalam menghadapi gangguan, dan para aktor juga cenderung membutuhkan GC terdistribusi, yang menyusahkan.)

FRP sangat cocok untuk sistem tertutup yang beroperasi dari waktu ke waktu - misalnya pengontrol robot, pemrograman musik, mainan komputasi. Fitur determinisme dan komposisi membuat FRP lebih nyaman digunakan dibandingkan dengan para aktor, setidaknya dalam kasus-kasus di mana FRP dapat secara langsung memodelkan suatu solusi. Mengintegrasikan FRP dengan efek (elegan, tanpa meretas model dengan kenajisan) telah terbukti sulit. Ada pekerjaan baru-baru ini pada FRP yang efektif melalui 'lubang cacing' - secara efektif, akses mengetik unik atau linier ke sumber daya.

Ada model lain yang terletak di antara FRP dan Aktor.

Flow Based Programming (FBP), yang dikembangkan oleh John Paul Morrison, benar-benar mendukung streaming pesan.

Protokol Time Warp (atau karya yang lebih baru tentang Lightweight Time Warp (LTW)) menempatkan pesan seperti aktor pada timeline logis untuk memberikan gagasan yang lebih terkontrol dan komposisional tentang penyampaian pesan. Time warp sering digunakan untuk sistem paralel dan terdistribusi besar, misalnya komputasi ilmiah. Warp waktu asli tidak cocok untuk simulasi interaktif (responsif terhadap input manusia), dan LTW hanya sedikit sesuai.

Saya sedang mengembangkan Pemrograman Permintaan Reaktif (RDP) yang memungkinkan manipulasi responsif, komposisi, seperti FRP dan pemrosesan sinyal dalam sistem terbuka dan terdistribusi, dan menghilangkan keadaan lokal. RDP dicapai dengan membatasi efek samping menjadi komutatif, pengaruh idempoten pada keadaan sumber daya oleh sinyal dari waktu ke waktu. RDP membutuhkan pemikiran ulang model sumber daya dan negara.

dmbarbour
sumber
Satu hal yang saya tidak senang dengan tentang FRP adalah bahwa memetakan fungsi atas suatu peristiwa membutuhkan waktu yang terbatas, namun FRP akan mempertimbangkan peristiwa yang dihasilkan terjadi pada waktu yang sama dengan acara aslinya. Hal ini dapat menyebabkan gagasan internal FRP untuk keluar dari langkah dengan waktu dinding, dan khususnya dapat menyebabkan acara yang salah dipesan sehubungan dengan waktu dinding. Saya juga tidak suka fiksi bahwa peristiwa B dapat terjadi setelah peristiwa A, tetapi pada saat yang sama direkam secara internal sebagai peristiwa A.
Robin Green
1
@RobinGreen Kemampuan untuk memodelkan perkembangan 'instan' atau transformasi peristiwa cukup berguna. Pengembang bebas untuk mengkompensasi dengan memodelkan keterlambatan baik up-stream atau down-stream. Dengan tipe dependen atau linier, seseorang dapat mengembangkan gagasan tentang keamanan waktu (properti waktu nyata; alokasi latensi sebagai sumber daya) untuk sistem FRP yang akan sulit untuk dimodelkan dalam sistem atemporal.
dmbarbour
@RobinGreen - mengenai "fiksi bahwa peristiwa B dapat terjadi setelah peristiwa A, tetapi pada waktu yang sama direkam", gagasan peristiwa yang terjadi dalam waktu sesaat atau transendental (lim (x-> 0 +) (T + x)) adalah salah satu kekeliruan universal dari abstraksi 'peristiwa'. Urutan peristiwa saat menduplikasi, memecah, dan menggabungkan aliran peristiwa menjadi sewenang-wenang, tidak konsisten, dengan mudah kehilangan informasi sementara. (lih. Why Not Events )
dmbarbour
Apakah Anda mengubah proyek RDP Anda menjadi proyek Awelon?
CMCDragonkai
1
Proyek awelon akan banyak menggunakan model / paradigma RDP. Pikirkan RDP dengan cara yang mirip dengan OOP. Model pemrograman memiliki implikasi pada arsitektur dan desain bahasa, tetapi bukan sesuatu yang saya sebut 'proyek'.
dmbarbour
7

Saya ingin menunjukkan bagaimana mereka berbeda dari sudut pandang praktis:

1) aktor mengirim pesan ke aktor lain, menyampaikan pesan ini dijelaskan secara eksplisit dan imperatif .

Sebagai contoh:

send msg to Actor137.

2) dalam FRP aliran data dijelaskan secara deklaratif :

Sebagai contoh:

Cell134=Cell185+Cell42.

Kelulusan pesan ditangani oleh kerangka kerja FRP dan Anda tidak perlu menjelaskan "secara manual" cara mengirim pesan dari satu sel (mirip dengan Aktor, merangkum keadaan, alias Perilaku) ke yang lain.

Dengan kata lain:

Inti dari pemrograman reaktif fungsional adalah untuk menentukan perilaku dinamis dari suatu nilai sepenuhnya pada saat deklarasi. Jadi semua dependensi Cell134didefinisikan pada titik deklarasi.

Ini tidak benar untuk model aktor. Aktor yang mempengaruhi perilaku aktor Atidak didefinisikan di tempat yang sama dalam kode sumber di mana aktor Adidefinisikan.

Baru-baru ini saya perhatikan bahwa ada hibrida yang menarik antara keduanya: stream Akka, di mana aliran data dijelaskan secara deklaratif tetapi diimplementasikan menggunakan aktor.

Perbedaan lainnya adalah: Aktor cenderung async sedangkan FRP cenderung sinkron (sering bebas kesalahan ).

jhegedus
sumber