Synchrone Programmiersprache
aus Wikipedia, der freien Enzyklopädie
Eine synchrone Programmiersprache ist eine Programmiersprache, die sich aufgrund ihres Verhaltens vorwiegend für reaktive Systeme eignet.
Inhaltsverzeichnis |
[Bearbeiten] Allgemeines
Synchrone Programmiersprachen basieren grundsätzlich auf der synchronen Hypothese, welche aus folgenden Annahmen besteht:
- zero-delay model of circuits
- perfectly snychronous model
- multi-form time
Multi-form time: Hierauf basiert der grundsätzliche Ablauf eines synchronen Programms. Die Zeit wird einzig durch die Rangfolge von Eingaben bestimmt. Eine Zeitdauer kann durch die Anzahl und Form von Eingaben definiert werden, z. B. dreimaliger Empfang eines selbst definierten Signals MINUTE ergibt eine Zeitdauer von 3 Minuten.
Zero-delay model of circuits: Ein Programmablauf kann in einzelne (Prozess‑)Schritte zerlegt werden. Ein Prozessschritt spiegelt den Übergang von einem (Programm‑)Zustand in den nachfolgenden wieder. Ein Prozessschritt kann das Schließen einer offenen Aufzugstür sein: aktueller Zustand = Tür offen, nächster Zustand = Tür zu. Hierbei werden die linearen Prozessschritte ohne Zeitverzögerung abgearbeitet. Um beim Beispiel Aufzugstür zu bleiben: der Vorgang des Schließens würde nicht wahrgenommen werden. Nach Betätigung des „Tür schließen“-Knopfes kann kein Fuß zwischen Tür und Türrahmen gehalten werden, denn die Tür wäre im nächsten Moment bereits geschlossen. Praktisch wird die Verzögerung hauptsächlich durch die Hardware, wie Bauteile oder Leiterbahnen, verursacht.
Perfectly synchronous model: Diesem Modell nach laufen alle Prozessschritte (zumindest im Konzept) parallel (=gleichzeitig) ab. Ist die kleinste Zeiteinheit (zwischen zwei zeitlich unterschiedlichen Eingaben) ein Zyklus und agieren mehrere Prozesse miteinander, so kommunizieren diese prinzipiell zur gleichen Zeit, d.h. im selben Zyklus. Die Ausgabe eines Prozesses dient im selben Zyklus einem anderen Prozess als Eingabe, ähnlich einer Kette. Als einfaches Beispiel dienen eine Glühbirne und ein Helligkeitssensor. Schaltet sich die Glühbirne ein, erkennt der Sensor dies sofort und gibt im Idealfall noch im selben Zyklus ein Resultat aus.
Determiniertes Verhalten, eine Eigenheit von z. B. Esterel und Lustre, bildet die Grundlage für einfache Programmverifikation und Möglichkeiten zur Bestimmung von (Programm-)Laufzeiten. Letzteres ist bei nicht-determinierten Systemen oder Sprachen, wie ADA, sehr aufwendig. Deswegen sind azyklische (lineare) Programme, welche keine Schleifen enthalten, i. A. zu bevorzugen.
[Bearbeiten] Synchrone Programmiersprachen
[Bearbeiten] Vor- und Nachteile
Synchrone Programmiersprachen finden überwiegend Anwendung bei sicherheitskritischen Systemen. Durch ihren deterministischen Aufbau und die leichter abschätzbare Laufzeit haben synchrone Sprachen hier einen klaren Vorteil gegenüber imperativen Sprachen. Durch die Automaten-Struktur wird die Verifikation der Programme mittels Model Checking möglich und gibt somit zusätzliche Sicherheit bei der Implementierung.
Sprachen wie Esterel können ein statisches Scheduling (fester Ablauf der Anweisungen über alle beteiligten Prozesse betrachtet) erzeugen, da alle in diesem Programm vorkommenden nebenläufigen Prozesse und alle Anweisungen zur Compile-Zeit bekannt sind. Programme mit statischen Scheduling sind im Hinblick auf Nebenläufigkeit sicher.
Synchrone Sprachen sind natürlich nicht für jede Art von Problemstellung geeignet. Das was ihnen Sicherheit verschafft, nämlich z.B. das Wissen, wieviel Prozesse überhaupt vorkommen, geht zu lasten dynamischer Eigenschaften. Es können also z.B. nicht spontan Prozesse erzeugt werden, die eine Netwerkverbindung bedienen, der Prozess müsste schon zur Compile-Zeit erzeugt werden. Genausowenig wird dynamisch Speicher alloziiert oder freigegeben. So sind sie z.B. auch für Datenbank-Systeme gänzlich fehl am Platz, da hier enorme Datenmengen anfallen können und die Vorhersehbarkeit des benötigten Speichers nicht oder nur teilweise gegeben ist.
Software für Mikrocontroller mit Pipelining und Caching ist auch nicht erstellbar, da hier undefinierte Zustände, resultierend aus dem Caching, auftreten können. Diese Art von komplexen Programmen ist nur in Verbindung mit anderen Sprachen möglich.
Gut geeignet sind sie aber z.B. für regelungstechnische Anwendungen, oder aber allgemein für alles, was sich vernünftig in einer State-Machine mit der entsprechenden Semantik ausdrücken lässt.