# Actor Model

Das Actor Model (deutsch Aktorenmodell, auch Aktormodell) ist in der Informatik ein Modell für nebenläufige Berechnungen bzw. Programme. Diese werden in nebenläufige Einheiten unterteilt, die Aktoren, die ausschließlich über Nachrichtenaustausch kommunizieren. Es stellt somit eine mögliche Ausprägung des Message passings dar und wurde erstmals 1973 von Carl Hewitt, Peter Bishop und Richard Steiger beschrieben. Verwendet wird das Actor Model heute u. a. in den Programmiersprachen Erlang, Io, D, Pony, Scala, Swift und Dart.

## Funktionsweise

Aktoren sind nebenläufige Einheiten, die nicht über einen geteilten Speicherbereich verfügen, sondern ausschließlich über Nachrichten kommunizieren. Die Kapselung des Zustandes des Aktors ähnelt dem Prinzip der Kapselung in der objektorientierten Programmierung. Jeder Aktor verfügt über einen Posteingang, eine Adresse und ein Verhalten.
Der Empfang einer Nachricht wird als Ereignis bezeichnet. Empfangene Nachrichten werden zunächst im Posteingang gespeichert. Der Aktor bearbeitet die darin enthaltenen Nachrichten nach dem FIFO-Prinzip. Das Verhalten des Aktoren beschreibt Reaktionen auf Nachrichten, abhängig von deren Aufbau. Aktoren können drei verschiedene Reaktionen durchführen:
* Nachrichten an sich selbst oder an andere Aktoren verschicken.
* neue Aktoren erzeugen.
* das eigene Verhalten ändern.
Der Nachrichtenaustausch erfolgt asynchron, d. h. der Sender einer Nachricht kann nach dem Abschicken sofort mit anderen Aktionen fortfahren und muss nicht warten, bis der Empfänger die Nachricht akzeptiert.
Das Actor Model legt nicht fest, wie lange die Vermittlung einer Nachricht dauern darf; es wird nur definiert, dass jede Nachricht nach endlicher Zeit beim Empfänger ankommen muss.
Überdies müssen Nachrichten nicht zwingend in derselben Reihenfolge ankommen, in der sie versendet werden. Letzteres wird in vielen Implementierungen trotzdem garantiert.

### Vorteile

Dass Aktoren zu einem Zeitpunkt nur eine Nachricht abarbeiten und kein anderer nebenläufiger Prozess den internen Speicherbereich eines Aktors beeinflussen darf, führt dazu, dass die Programmierung innerhalb des Aktors rein sequentiell ist. Vermutungen, die aufgrund des internen Zustandes des Aktors zu Beginn der Verarbeitung einer Nachricht getroffen wurden, behalten über die gesamte Abarbeitung der Nachricht weiterhin ihre Gültigkeit. Dies unterscheidet das Actor Model grundlegend von klassischen und verbreiteten Shared-Memory-Concurrency-Ansätzen, in denen alle nebenläufigen Threads auf einen gemeinsamen Speicherbereich zugreifen und dieser in Teilen über Locking-Primitive wie Semaphore, Mutexe und Signals geschützt wird.

### Nachteile

Da Aktoren nicht über einen gemeinsamen Speicherbereich verfügen, stellen sowohl die Nachrichten, als auch der interne Speicherbereich eines anderen Aktors eine Kopie von bestimmten Werten dar. Somit liegt die gleiche Information mehrfach im Speicher vor, was zu einem erhöhten Speicherbedarf führt.
Darüber hinaus steht das Versenden, In-die-Mailbox-Legen und Verarbeiten einer Nachricht im Actor Model einem (im besten Fall statisch gebundenen) Funktionsaufruf bei der Shared State Concurrency gegenüber. Der Aufwand ist im Actor Model somit wesentlich erhöht.

## Verbreitung

Das Actor Model ist stark bei funktionalen Programmiersprachen verbreitet. So stellt es das grundlegende Modell für Nebenläufigkeit in der Programmiersprache Erlang dar. Eine weitere Verbreitung erhält das Modell durch Sprachen mit gemischten Paradigmen wie Scala. Auch für klassisch imperative Programmiersprachen existieren Implementierungen des Actor Models, wie z. B. Theron als Actor-Bibliothek für C++.