In welcher Beziehung stehen Functional Reactive Programming und das Actor-Modell zueinander?


30

Bei FRP geht es darum, Ereignisse und Verhaltensweisen durch reine Funktionen zu streamen. Das Actor-Modell - zumindest wie es in Akka implementiert ist - befasst sich mit dem Streaming unveränderlicher Nachrichten (die als diskrete Ereignisse betrachtet werden können) durch potenziell unreine Objekte, die als Akteure bezeichnet werden.

An der Oberfläche scheinen sie also verwandt zu sein.

Was können wir noch über ihre Beziehung sagen? Was kann man darüber sagen, welche davon für unterschiedliche Anwendungsdomänen besser geeignet sind?

Antworten:


26

Weder bei Schauspielern noch bei FRP geht es um Streaming. Akteure unterstützen nicht einmal die externe Konfiguration eines Ausgabestreams.

FRP zeichnet sich stark durch die Modellierung von Signalen und Ereignissen auf einer linearen Zeitachse aus, wodurch das FRP-Verhalten deterministisch komponiert werden kann. Schauspieler sind stark von der Verarbeitung von Nachrichten in nicht deterministischer Reihenfolge geprägt und haben kaum kompositorische Eigenschaften (dh Sie können eine Anordnung von zwei Schauspielern nicht als größeren Schauspieler behandeln).

Wenn Sie Ähnlichkeiten suchen, haben beide Akteure und FRP eine enge Beziehung zur Lambda-Rechnung. Beide können Systeme modellieren, die auf menschliche Eingaben reagieren. Beide unterstützen die Modellierung des internen (lokalen) Zustands.

FRP unterstützt den lokalen Zustand durch Integrale oder Akkumulatoren (Fold over Time), während das Akteurmodell den Zustand unterstützt, indem jeder Akteur sein Verhalten für die nächste Nachricht als Antwort auf die aktuelle festlegen kann. Diese durchgängige Unterstützung des lokalen Status macht sowohl FRP als auch Actors für die Live-Programmierung (oder die Laufzeitaktualisierung des Programmcodes) unzureichend. es wird zu leicht, einen wichtigen Zustand zu verlieren.

In Bezug auf Anwendungsdomänen:

Das Actors-Modell eignet sich gut für offene Systeme, in denen wir möglicherweise Akteure zur Laufzeit installieren oder warten möchten. Das Actors-Modell ist auch für verteilte Systeme wenig geeignet, da die nicht deterministische Anordnung von Nachrichten eine konforme Implementierung erleichtern kann. (Der Grund, warum Akteure für verteilte Systeme nicht besser geeignet sind, ist, dass es angesichts von Störungen ziemlich schwierig ist, sicherzustellen, dass eine Nachricht "einmal und nur einmal" eintrifft, und dass Akteure in der Regel auch verteilte GC benötigen, was schmerzhaft ist.)

FRP eignet sich gut für geschlossene Systeme, die über einen längeren Zeitraum betrieben werden - z. B. Robotersteuerungen, Musikprogrammierung, Computerspielzeug. Der Determinismus und die kompositorischen Merkmale machen die Arbeit mit FRP angenehmer als mit Akteuren, zumindest in den Fällen, in denen FRP eine Lösung direkt modellieren kann. Das Integrieren von FRP mit Effekten (elegant, ohne das Modell mit Unreinheiten zu hacken) hat sich als schwierig erwiesen. In letzter Zeit wurde an effektiven FRP über "Wurmlöcher" gearbeitet - effektiv, einzigartiger oder linearer typisierter Zugriff auf Ressourcen.

Es gibt andere Modelle, die irgendwo zwischen FRP und Actors liegen.

Flow Based Programming (FBP), entwickelt von John Paul Morrison, unterstützt das Streaming von Nachrichten wirklich.

Time Warp-Protokolle (oder die neueren Arbeiten zu Lightweight Time Warp (LTW)) platzieren akteursähnliche Nachrichten auf einer logischen Zeitachse, um eine kontrollierte und kompositorische Vorstellung von der Weitergabe von Nachrichten zu ermöglichen. Time Warp wird häufig für große parallele und verteilte Systeme verwendet, z. B. für das wissenschaftliche Rechnen. Der ursprüngliche Zeitsprung war für interaktive Simulationen (Reaktion auf menschliche Eingaben) ungeeignet, und LTW ist nur bedingt geeignet.

Ich entwickle Reactive Demand Programming (RDP), das eine reaktive, kompositionelle, FRP-ähnliche Manipulation und Verarbeitung von Signalen in offenen und verteilten Systemen ermöglicht und den lokalen Zustand beseitigt. RDP wird erreicht, indem Nebenwirkungen durch Signale im Laufe der Zeit auf einen kommutativen, idempotenten Einfluss auf den Ressourcenzustand beschränkt werden. RDP erfordert ein Umdenken der Ressourcen- und Zustandsmodelle.


Eine Sache, mit der ich mit FRP nicht zufrieden bin, ist, dass das Zuordnen einer Funktion zu einem Ereignis eine begrenzte Zeit in Anspruch nimmt, FRP jedoch davon ausgeht, dass das resultierende Ereignis zur gleichen Zeit wie das ursprüngliche Ereignis aufgetreten ist. Dies kann dazu führen, dass der interne Zeitbegriff von FRP nicht mehr mit der Wandzeit Schritt hält, und insbesondere dazu führen, dass Ereignisse in Bezug auf die Wandzeit falsch angeordnet werden. Ich mag auch nicht die Fiktion, dass Ereignis B nach Ereignis A eintreten kann, sondern zur selben intern aufgezeichneten Zeit wie Ereignis A.
Robin Green

1
@RobinGreen Die Fähigkeit, den 'sofortigen' Fortschritt oder die Transformation von Ereignissen zu modellieren, ist sehr nützlich. Es steht Entwicklern frei, Verzögerungen entweder im Upstream oder im Downstream zu modellieren. Mit abhängigen oder linearen Typen könnte man einen Begriff der Zeitsicherheit (Echtzeit-Eigenschaften; Zuweisung von Latenz als Ressource) für FRP-Systeme entwickeln, der in zeitgemäßen Systemen schwer zu modellieren wäre.
Dmbarbour

@RobinGreen - in Bezug auf "die Fiktion, dass Ereignis B nach Ereignis A eintreten kann, aber zur gleichen aufgezeichneten Zeit" ist der Begriff von Ereignissen, die in der augenblicklichen oder transzendentalen Zeit auftreten (lim (x-> 0 +) (T + x)) einer der universellen Irrtümer der "Ereignis" -Abstraktion. Die Reihenfolge von Ereignissen beim Duplizieren, Aufteilen und Zusammenführen von Ereignisströmen wird willkürlich, inkonsistent und verliert leicht zeitliche Informationen. (vgl. Why Not Events )
dmbarbour

Verwandeln Sie Ihr RDP-Projekt in das Awelon-Projekt?
CMCDragonkai

1
In einem weiteren Projekt wird das RDP-Modell / -Paradigma stark genutzt. Stellen Sie sich RDP ähnlich wie OOP vor. Ein Programmiermodell hat Auswirkungen auf die Architektur und das Sprachdesign, aber ich würde es nicht als "Projekt" bezeichnen.
Dmbarbour

7

Ich möchte darauf hinweisen, wie sie sich aus praktischer Sicht unterscheiden:

1) Akteure senden Nachrichten an andere Akteure, diese Nachrichtenübergabe wird explizit und zwingend beschrieben .

Beispielsweise:

send msg to Actor137.

2) In FRP wird der Datenfluss deklarativ beschrieben :

Beispielsweise:

Cell134=Cell185+Cell42.

Die Nachrichtenübergabe wird vom FRP-Framework verwaltet und Sie müssen nicht "manuell" beschreiben, wie Nachrichten von einer Zelle (ähnlich wie bei Actor, Encapsulated State, aka Behavior) an eine andere übergeben werden.

Mit anderen Worten:

Das Wesen der funktionalen reaktiven Programmierung besteht darin, das dynamische Verhalten eines Wertes zum Zeitpunkt der Deklaration vollständig zu spezifizieren . So werden alle Abhängigkeiten von Cell134am Deklarationspunkt definiert.

Dies gilt nicht für das Darstellermodell. Akteure, die das Verhalten eines Akteurs beeinflussen, Awerden nicht an derselben Stelle im Quellcode definiert, an der der Akteur Adefiniert ist.

Kürzlich ist mir aufgefallen, dass es eine interessante Mischung zwischen den beiden gibt: Akka-Streams, bei denen der Datenfluss deklarativ beschrieben wird, aber mithilfe von Akteuren implementiert wird.

Ein weiterer Unterschied ist: Schauspieler sein async neigen , während FRP zu werden synchron dazu neigt , (oft Glitch frei).

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.