Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

15. Semantik, Übersetzen und Interpretieren, Verfikation

Ähnliche Präsentationen


Präsentation zum Thema: "15. Semantik, Übersetzen und Interpretieren, Verfikation"—  Präsentation transkript:

1 15. Semantik, Übersetzen und Interpretieren, Verfikation
Korrektheit von Programmen zentrale Frage der Informatik Problem allgemein nicht algorithmisch lösbar, Kompromiß zwischen Risikominimierung und dafür nötigem Aufwand ist zu finden Test: Suche nach Fehlern anhand vorgegebener Solldaten Verifikation: Nachweis der Korrektheit mit mathematischen Mitteln Verifikation setzt präzise formale Beschreibung der Bedeutung (Semantik) von Programmen voraus formale Semantiken sind auch beim Übersetzerbau von entscheidender Bedeutung Ansätze zur Definition von Semantiken: Übersetzersemantik operationale Semantik denotationale Semantik axiomatische Semantik

2 Semantiktypen 1 Übersetzersemantik:
die Bedeutung von Anweisungen einer Programmiersprache PN wird durch die Bedeutung von Anweisungen einer bereits bezüglich Syntax und Semantik bekannten alten Programmiersprache PA festgelegt. Das Grundprinzip ist also die formale Zurückführung einer jeden Anweisung von PN in eine äquivalente Anweisung oder Anweisungsfolge aus PA. Operationale Semantik: Man definiert bei der operationalen Semantik eine (mathematische) Maschine (auch Automat genannt) für eine Programmiersprache, die aus Eingabedaten durch schrittweise Abarbeitung des Programms die Ausgabedaten erzeugt. Das Adjektiv operational verdeutlicht, daß ein konkretes Verfahren angegeben wird, wie der Ausgabewert durch eine Folge von Rechenschritten (Operationen) effektiv aus der Eingabe erzeugt werden kann. Zur exakten Definition der Maschine eignen sich verschiedene Modelle.

3 Semantiktypen 2 Denotationale Semantik:
Bei der denotationalen Semantik wird von einem konkreten Maschinenmodell (wie es bei der operationalen Semantik notwendig war) abstrahiert und nur die Wirkung von Anweisungen in Form veränderter Variablenbelegungen untersucht. Wenn Z die Menge aller möglichen Zustände ist, die bei der Ausführung eines Programms P durchlaufen werden können (formal: Z  W(v1)  W(v2)  W(vn), wobei v1, ..., vn die in P auftretenden Variablen und W(vi) der Wertebereich von vi, d.h. die Menge aller Werte, die vi annehmen kann, sind), dann ist die Wirkung einer Anweisung a eine Abbildung F [a] : Z  Z, die einem Zustand z einen Folgezustand z' zuordnet. F ordnet also einer Anweisung eine Zustandsänderung als Bedeutung in Form veränderter Variablenbelegung zu. F wird auch semantische Funktion genannt.

4 Beispiel: {-1000 < x ≤ 0} x := x - 1 {-1000 ≤ x < 0}
Semantiktypen 3 Axiomatische Semantik: Bei der axiomatischen Semantik wird nur noch auf Eigenschaften von Zuständen und nicht mehr – wie bei der denotationalen – auf konkrete Zustände selbst Bezug genommen. Die Wirkung einer Anweisung a wird durch ein Tripel ({P}, a, {Q}) definiert, wobei P und Q Prädikate (Bedingungen) sind. Wenn P vor Ausführung von a gilt, dann muß Q nach Ausführung von a gelten, allerdings unter der wichtigen Voraussetzung, daß a terminiert. Beispiel: {-1000 < x ≤ 0} x := x - 1 {-1000 ≤ x < 0} Der axiomatische Semantikansatz ist geeignet, Eigenschaften von Programmen zu beweisen, z.B. deren Korrektheit bezüglich einer vorgegebenen, spezifizierten Funktion.

5 Operationale Semantik für MINI
<Programm> => read <Varliste> ; <Anweisung> ; write <Varliste> . <Varliste> => <Bezeichner> | <Bezeichner> ; <Varliste> <Bezeichner> => a | b | c | ... | z <Anweisung> =>  | <Bezeichner> := 0 | <Bezeichner> := <Bezeichner> +1 | <Bezeichner> := <Bezeichner> -1 | <Anweisung> ; <Anweisung> | if <Bezeichner> = 0 then <Anweisung> else <Anweisung> end | while <Bezeichner> ≠ 0 do <Anweisung> end MINI-Syntax

6 Definition der Assemblersprache ASS
<Anweisung> => lade 0 | lade <Bezeichner> | speichere <Bezeichner> | add1 | sub1 | <Anweisung> ; <Anweisung> |  | jump<Marke>| jumpnull <Marke> | <Marke>:<Anweisung> <Bezeichner> => wie bei MINI <Programm> => wie bei MINI <Variablenliste> => wie bei MINI <Marke> => <Bezeichner><Ziffernfolge> <Ziffernfolge> => <Zifer> | <Ziffer><Ziffernfolge> <Ziffer> => 0 |1| 2|3|4|5|6|7|8|9 ASS-Syntax

7 Übersetzung MINI in ASS
a:=0 a:=b+1 a:=b-1 <Anweisung1>;<Anweisung2> if a=0 then <Anweisung1> else <Anweisung2> end while a  0 do <Anweisung> end ASS lade0; speichere a lade b; add1; speichere a lade b; sub1; speichere a <Anweisung1>;<Anweisung2> lade a; jumpnull l; <Anweisung2>; jump m; l: <Anweisung1>; m:  l: lade a; jumpnull m;<Anweisung>; jump l; m: 

8 Übersetzung MINI in ASS
a:=0 a:=b+1 a:=b-1 <Anweisung1>;<Anweisung2> if a=0 then <Anweisung1> else <Anweisung2> end while a  0 do <Anweisung> end ASS

9 Mathematische Maschinen
Eine mathematische Maschine M ist ein Tupel M = (I, O, K, , , ) I: Eingabe, d.h. Programmanweisungen und Eingabedaten, O: eine Menge von Ausgabedaten, K: eine Menge von Konfigurationen, : I  K eine Eingabefunktion, : K O eine Ausgabefunktion, : K  K eine Übergangsfunktion. Die Menge der Konfigurationen K dieser Maschine definiert man als K = A  Z, wobei im konkreten Fall gilt: A ist die Menge aller Anweisungsfolgen von MINI, Z ist die Menge der Zustände, die ein Programm annehmen kann. Zustand: Wertebelegung der Bezeichner eines Programmes, z(b): Wert von b in Zustand z, z0: Anfangszustand, alle Bezeichner haben Wert 0, z <b w> : Zustand, der sich von z nur im Wert w von b unterscheidet (Zustand, den man aus z erhält, indem man den Wert der Variablen b auf w setzt).

10 Übergangsfunktion  else a; • berechnet Konfigurationsübergänge
• Startkonfiguration (Programm, z) wird durch Iteration von  schrittweisein Zielkonfiguration (, z') überführt neuer Zustand (z ist alter Zustand) z z<b  0> z<b  z(b´) + 1> z<b  z(b´) - 1> verbleibende Anweisungsfolge a a; a2 falls z(b) = 0 a1; a2 sonst if b=0 then  else a; a falls b  0; a1 sonst alte Anweisungsfolge ; a b:= 0; a b := b´ + 1; a b1 := b´ - 1; a if b = 0 then a else a1 end; a2 while b  0 do a end; a1

11 Ein-, Ausgabefunktionen
Unser MINI-Programm P habe die Form read b1, ..., br; a; write c1,..., cs. Eingabefunktion: (P, x1,..., xr) = (a, , z0<b1  x1> ...<br  xr>) Ausgabefunktion: (, z) = (z(c1),...,z(cs)) Die Semantik von P ist die Funktion f: W  W, die auf folgende Weise entsteht: r s 1) Anwendung von  auf (P, x1,..., xr), 2) wiederholte Anwendung von  auf das Resultat von (1) bis eine Konfiguration z erreicht ist, 3) Anwendung von  auf , z. Mathematische Maschinen der beschriebenen Art heißen auch Interpreter

12 Übersetzen vs. Interpretieren
Interpretation: Für jede Aktion (Deklaration, statement, ...) der höheren Programmiersprache gibt es ein Unterprogramm in Maschinensprache, das die Aktion ausführt. Ausführung des (höheren) Programms durch Aufruf von Unterprogrammen (in Maschinensprache) in der richtigen Reihenfolge. Interpreter führt folgenden Zyklus aus: 1. Hole nächsten Befehl. 2. Bestimme die Aktionen, die auszuführen sind. 3. Führe diese Aktionen aus. Interpretation kann als Simulation eines Rechners für die höhere Sprache aufgefaßt werden. Gegebenenfalls muß dieselbe Instruktion häufig dekodiert werden => größere Laufzeit Vorteile: interaktive Programmentwicklung, Fehlersuche, ... Oft werden sowohl Interpreter wie Compiler bereitgestellt - Interpreter für Entwicklung, Compiler für Generierung effizienten Codes nach der Validierung des Programms (Häufig auch Mischformen: Übersetzung in intermediate code, der dann interpretiert wird. Java: übersetzt in Java Bytecode, der auf client Maschinen interpretiert wird.)

13 Compilierung: Terminologie:
Ein Übersetzer (translator ) ist ein Programm, das als Eingabe ein Programm in einer Quellsprache (source language) L1 bekommt und daraus ein äquivalentes Programm in der Zielsprache (target language ) L2 erzeugt. Wenn die Quellsprache eine höhere Programmiersprache und die Zielsprache Assembler oder Maschinensprache ist, so bezeichnet man den Übersetzer als Compiler. Wenn die Quellsprache eine Assemblersprache und die Zielsprache Maschinensprache ist, so nennt man Übersetzer Assembler Übersetzer, die von einer höheren Sprache in eine höhere übersetzen (z.B. in eine Teilmenge der Quellsprache) nennt man Präprozessor (preprocessor). Compiler, die auf Maschine M1 laufen und Maschinencode für eine andere Maschine M2 produzieren, heißen Cross-Compiler

14 Analyse Lexikalische Analyse: Gruppierung der Zeichen des Quellcodes in elementare Bestandteile (tokens, lexikalische Einheiten): Bezeichner, Zahlen, Schlüsselwörter, Operatoren, Kommentare... Syntaxanalyse (Parsing): Identifikation von Programmstrukturen, Syntaxbaum, Anweisungen, Deklarationen, Ausdrücke ... Semantische Analyse: Erzeugung von Zwischencode (interne Darstellung), Pflege d. Symboltabelle, Fehlererkennung, Makrobehandlung Synthese Optimierung: Zwischencode wird analysiert, Registernutzung, Berechnung von gemeinsamen Unterausdrücken optimiert, redundante Berechnungsschritte eliminiert Codeerzeugung: Generieren des Objektcodes aus dem optimierten Zwischencode

15 Binder fügt Ergebnisse getrennter Übersetzungen (etwa verschiedener Unterprogramme, Module) zu einer Einheit zusammen. Lader lädt gesamtes Programm als ausführbaren Maschinencode in den Hauptspeicher. Informationen über Namen im Quellprogramm werden in der Symboltabelle gespeichert, z.B.: Typ von Variablen, Größe von Arrays, Anzahl und Typ der Argumente einer Funktion, zugewiesener Speicherplatz. Sobald ein Name im Quellcode gefunden wird, wird überprüft, ob er bereits in der Symboltabelle enthalten ist. Ist das nicht der Fall, wird ein neuer Eintrag vorgenommen. Die Symboltabelle enthält Informationen, die immer wieder vom Compiler benötigt werden, etwa um zu prüfen, ob Deklarationen und die Verwendung von Namen konsistent sind, ob Operationen anwendbar sind, oder wieviel Speicher bei der Codegenerierung für ein Datenobjekt zu Verfügung gestellt werden muß.

16 1. Lexikalische Analyse:
Beispiel (FORTRAN): IF(5.EQ.MAX)GOTO100 erzeugt token stream, z.B.: if( [const,341] eq [id, 729] ] goto [label, 554] Die Symboltabelle könnte folgende Informationen beinhalten: 341: constant, integer, value = 5 ... 554: label, value = 100 729: variable, integer, value = MAX Für die Implementierung spielen endliche Automaten eine wesentliche Rolle. Prinzip der längsten Teilkette: X12 1,2 oder 3 Token(s)? An jeder Stelle wird die längste mögliche Zeichenkette zu einem Token zusammengefaßt, also hier nur 1 Token.

17 2. Parsing Häufig verwendete Parsing-Technik: rekursiv absteigendes Parsing angelehnt an erweiterte Backus-Naur-Form (EBNF) für Grammatik: Regeln mit geschweiften Klammern (für beliebig oft wiederholte Bestandteile): <exp> ::= <term> {+ term} Regeln mit eckigen Klammern für optimale Teile <if-statement> ::= if <condition> then <statement> [else<statement>] Prozedur für jedes Nichtterminalsymbol wird aus EBNF erzeugt, Eingabe wird von links nach rechts gescannt, Fehlermeldung, falls String nicht als entsprechendes syntaktisches Objekt erkannt werden kann.

18 Beispielgrammatik: Erzeugte Prozeduren:
<sentence> ::= <nounPhrase> <verbPhrase> <nounPhrase> ::= <article> <noun> <aticle> ::= a | the <noun> ::= girl | dog <verbPhrase> ::= <verb> <nounPhrase> <verb> ::= sees | pets Erzeugte Prozeduren: procedure sentence; begin nounPhrase; verbPhrase; end; procedure nounPhrase; article; noun;

19 procedure article; begin if Token =‘a‘ then GetToken else if Token = ‘the‘ then GetToken else Error; end; procedure noun; if Token =‘girl‘ then GetToken else if Token =‘dog‘ then GetToken procedure verbPhrase; verb; nounPhrase;

20 Spezifikation und Verifikation
Spezifikation legt fest, was Programm leisten soll. Verifikation zeigt, daß Programm tut, was es tun soll. Axiomatische Methode verwendet hierfür Ausdrücke der Form A = {P} S {Q} Aussage P heißt Vorbedingung, Aussage Q Nachbedingung (Zusicherung). Bedeutung von A: falls vor Ausführung des Programmstückes S P gegolten hat, so gilt nach seiner Ausführung Q (S muß terminieren!!). Häufig interessiert man sich für das schwächste P, so daß {P} S {Q} wahr ist. Wir können A je nach Kontext für drei verschiedene Zwecke verwenden: Ist S eine einzelne Anweisung, so dient A der Definition dieser Anweisung. (axiomatische Semantik). Ist S ein Programm (oder Programm-Fragment), so kann A aus den Definitionen der einzelnen Befehle synthetisiert werden. A ist dann die Beschreibung des Programms. Ist S ein noch zu schaffendes Programm, so ist A die Spezifikation des Programms.

21 Zusammenfassung Die Beschreibung der Semantik kann u.a. folgenden Zwecken dienen: Axiomatische Definition einer Programmiersprache Programmbeschreibung (Was tut das Programm?) Programmspezifikation (Was soll das Programm tun?) Programmverifikation (Tut das Programm das, was es soll?). Die Definition ist die Vorschrift für denjenigen, der ein Sprachsystem (Interpreter, Compiler) implementiert. Eine Spezifikation ist eine Präzisierung der Anforderungen an ein Programm. Die Beschreibung des Programms entsteht dann durch Zusammensetzung der Axiome entsprechend dem Programmaufbau. Sie setzt also die formale Definition der Programmiersprache voraus. Die Verifikation setzt voraus, daß eine Spezifikation und eine Beschreibung aufgestellt wurden. Sie besteht im Nachweis, daß Beschreibung und Spezifikation übereinstimmen.


Herunterladen ppt "15. Semantik, Übersetzen und Interpretieren, Verfikation"

Ähnliche Präsentationen


Google-Anzeigen