Um auf Michael Madsen's Antwort etwas zu erweitern, könnte ein Beispiel das Verhalten des ++ Operators sein. Informell beschreiben wir den Operator, der einfaches Englisch verwendet. Zum Beispiel:
Wenn x
ist eine Variable vom Typ int
, ++x
Ursachen x um eins erhöht werden.
(Ich gehe davon keine ganze Zahl überläuft, und dass ++x
nicht alles zurück)
in einer formalen Semantik (und ich werde operationale Semantik verwenden), wir ein bisschen haben würden der Arbeit zu tun. Zuerst müssen wir einen Begriff von Typen definieren. In diesem Fall gehe ich davon aus, dass alle Variablen vom Typ int
sind. In dieser einfachen Sprache kann der aktuelle Zustand des Programms durch einen Speicher beschrieben werden, der eine Zuordnung von Variablen zu Werten darstellt. Zum Beispiel kann an einem Punkt im Programm x
gleich 42 sein, während y
gleich -5351 ist. Der Speicher kann als eine Funktion verwendet werden - so zum Beispiel, wenn der Speicher s
die Variable x
mit dem Wert 42 hat, dann s(x) = 42
.
Ebenfalls im aktuellen Zustand des Programms enthalten sind die restlichen Anweisungen des Programms, die wir ausführen müssen. Wir können dies als <C, s>
bündeln, wobei C
das verbleibende Programm ist und s
das Geschäft ist.
Also, wenn wir den Zustand <++x, {x -> 42, y -> -5351}>
haben, diese informell ein Zustand, in dem der einzige verbleibende Befehl ++x
ist auszuführen, wird die Variable x
hat den Wert 42, und die Variable y
hat Wert -5351
.
Wir können dann Übergänge von einem Zustand des Programms zu einem anderen definieren - wir beschreiben, was passiert, wenn wir den nächsten Schritt im Programm machen.Also, für ++
, könnten wir die folgende Semantik definieren:
<++x, s> --> <skip, s{x -> (s(x) + 1)>
Etwas informell, durch ++x
Ausführung der nächste Befehl ist skip
, die keine Wirkung hat, und die Variablen im Speicher sind unverändert, mit Ausnahme von x
, welches jetzt den Wert hat, den es ursprünglich plus eins hatte. Es gibt noch etwas zu tun, wie zum Beispiel die Notation, die ich für die Aktualisierung des Ladens verwendet habe (was ich nicht getan habe, um diese Antwort noch länger zu machen!). Eine bestimmte Instanz der allgemeinen Regel könnte also lauten:
<++x, {x -> 42, y -> -5351}> --> <skip, {x -> 43, y -> -5351}>
Hoffentlich gibt Ihnen das die Idee. Beachten Sie, dass dies nur ein Beispiel für formale Semantik ist - zusammen mit operationaler Semantik gibt es axiomatische Semantik (die oft Hoare-Logik verwendet) und denotationale Semantik und wahrscheinlich noch viel mehr, mit denen ich nicht vertraut bin.
Wie ich in einem Kommentar zu einer anderen Antwort erwähnte, ist ein Vorteil der formalen Semantik, dass Sie sie verwenden können, um bestimmte Eigenschaften Ihres Programms zu beweisen, zum Beispiel, dass es endet. Neben der Tatsache, dass Ihr Programm kein fehlerhaftes Verhalten zeigt (z. B. Nicht-Beendigung), können Sie auch beweisen, dass sich Ihr Programm wie erforderlich verhält, indem Sie beweisen, dass Ihr Programm einer bestimmten Spezifikation entspricht. Abgesehen davon habe ich die Idee, ein Programm zu spezifizieren und zu verifizieren, nie so überzeugend gefunden, da ich festgestellt habe, dass die Spezifikation in der Regel nur das in Logik umgeschriebene Programm ist und die Spezifikation daher genauso fehlerhaft ist.
Es ist, wenn die Semantik mit Smokings gezeichnet wird. – blowdart
Was ist Giotto? –
Wikipedia sagt: "Die Giotto Programmiersprache für Echtzeit eingebettete Systeme". Und sagt nichts mehr. – asveikau