Zustandsautomaten (State Machines)

 

In der heutigen Ausgabe des Zirkulars soll das Konzept der Zustandsautomaten (engl. state machines) kurz vorgestellt werden. Dieses Programmierkonzept kann bei Software, deren wesentliches Merkmal das Verwalten von Zuständen ist, wertvolle Dienste leisten. Die Leistungsfähigkeit von State Machines entfaltet sich hierbei umso besser, je größer die Anzahl von Zuständen und Ereignissen ist.

Das klassische Beispiel aus den Lehrbüchern ist eine Fahrstuhlsteuerung. Genauso oft wird aber auch ein Fahrscheinautomat als Beispiel genommen. In letzterem kann eine variable Anzahl von Münzen (beispielsweise von 5 Cent bis hinauf zu 2 Euro) eingeworfen werden, bis der Fahrpreis erreicht ist. Jeder Zwischenwert des zu bezahlenden Fahrpreises kann als ein eigener Zustand in diesem Zustandsautomaten angesehen werden. Für jeden Zwischenwert kann auf jeden denkbaren nächsten Münzeinwurf ein Folgezustand zugeordnet werden.

Vorab ein paar Begriffserläuterungen:

Zustand: eine Anwendung bzw. Software-Komponente kann sich in einem von mehreren logischen Zuständen befinden. Zwischen diesen Zuständen können Übergänge stattfinden. Welche Übergänge es konkret sind, hängt von den Eingaben ab. Zum Programmstart muss sich die Anwendung bereits in einem Zustand befinden. Ein Zustand kann ein bestimmter Bearbeitungsstand einer (umfangreicheren) Aufgabe oder eine bestimmte Betriebsart sein.

Eingabe: In der Anwendung können mehrere verschiedene Eingaben getätigt werden. Dies können Benutzeraktionen oder anderweitige Ereignisse im System sein (Berechnung abgeschlossen, Datenübertragung beendet, etc.). Eine Eingabe kann (muss aber nicht zwangsläufig) einen Übergang zum nächsten Zustand veranlassen.

Aktion: eine Anwendung kann eine bestimmte Anzahl an vordefinierten Aktionen ausführen. Sie stellen die eigentlichen Aufgaben des Programms dar. Welche Aktionen erlaubt sind, hängt vom momentanen Zustand ab, in dem sich das Programm befindet.

Wie könnte eine Beispielimplementierung aussehen? Zunächst mal muss eine Logik festgelegt werden, die, ausgehend vom bisherigen Zustand und der erfolgten Eingabe, einen jeweils neuen Zustand bestimmt. Diese Zuordnung kann mittels einer 2x2-Matrix (ein zweidimensionales Feld) vorgenommen werden, deren Horizontalen alle möglichen Zustände und deren Vertikalen alle möglichen Eingaben durchlaufen: jedes Matrixelement enthält den neuen Zustand, abhängig vom vorigen Zustand und der Eingabe. Ungültige oder unmögliche Übergänge sollten mit einem Fehlerzustand gekennzeichnet werden, damit derartige Fehler schon beim Testen auffallen.

Der Programmcode könnte z.B. in einer Schleife fortlaufend auf Eingaben warten. Erfolgt eine Eingabe, so wird innerhalb eines Schleifendurchlaufs anhand des 2D-Arrays der neue Zustand ermittelt. Anschließend werden sämtliche im Programm vorgesehenen Aktionen einmal angestartet. Innerhalb jeder Aktion befindet sich eingangs eine Abfrage, ob diese Aktion für diesen Zustand überhaupt zulässig ist. Falls nein, wird die Aktion sofort beendet, falls ja, wird der weitere Programmcode dieser Aktion durchlaufen. Sind sämtliche Aktionen einmal durchlaufen worden (egal, ob abgebrochen oder ausgeführt), so ist der Schleifendurchlauf beendet und es wird auf die nächste Eingabe gewartet.

Dies ist sicherlich ein einfaches Beispiel für Zustandsautomaten. Es gibt andere Wege der Implementierung, genauso wie es verschiedene Varianten von Zustandsautomaten gibt, die auch schon mal komplexer werden und zum Teil mehrerer Typen von Eingaben bzw. Aktionen kennen. Selbstverständlich können Zustandsautomaten auch ineinander verschachtelt werden. Eine weiterführende Übersicht geben die beiden Wikipedia-Artikel zum Virtuellen Endlichen Automaten und zum Zustandsautomaten.

Auch für die astronomische Programmierung können Zustandsautomaten das Mittel der Wahl sein, und zwar genau dann, wenn ein Programm oder eine Software-Komponente mehrere Betriebsmodi abbilden soll, die zwar Gemeinsamkeiten besitzen oder anderweitig voneinander abhängen, die aber, ganz oder teilweise, einen eigenen Workflow, eine eigene GUI oder eigene Datensätze mitbringen.