In diesem Kapitel geht es darum folgende Dinge zu verstehen und zu können
Eine formale Sprache …
Eine Grammatik beschreibt bzw. regelt die Syntax einer formalen Sprache
Eine Produktion ist eine syntaktisch mögliche Kombination von terminalen Symbolen
Die Semantik beschreibt die Bedeutung der Zeichen
Nomen := ( wArtikel wSubstantiv ) | ( mArtikel mSubstantiv )
wArtikel := "die"
mArtikel := "der"
wSubstantiv := "frau"
mSubstantiv := "mann"
Programm := "PROGRAM " Bezeichner
"BEGIN"
{ Zuweisung \[";"\] }
"END"
Bezeichner := Buchstabe { ( Buchstabe | Ziffer ) } ;
Zahl := \[ "-" \] Ziffer { Ziffer } ;
String := """ { Buchstabe | Ziffer } """ ;
Zuweisung := Bezeichner “=" ( Zahl | Bezeichner | String ) ;
Buchstabe := "A" | "B" | "C" | "D" | "E" | "F" | "G"
| "H" | "I" | "J" | "K" | "L" | "M" | "N"
| "O" | "P" | "Q" | "R" | "S" | "T" | "U"
| "V" | "W" | "X" | "Y" | "Z" ;
Ziffer := "0" | "1" | "2" | "3" | "4" | "5" | "6"
| "7" | "8" | "9" ;
PROGRAM DEMO1
BEGIN
A0=3;
B=45;
H=-100023;
C=A;
D123=B34A;
ESEL=GIRAFFE;
TEXTZEILE="HALLO WELT";
END
Die Grammatik einer Sprache L(G) ist ein 4-Tupel mit:
G = { N, T, Σ, P }
Anmerkungen
Welche Sprache L erzeugt folgende Grammatik ?
G = { N, T, Σ, P }
L = <span class=‘fragment '
{ aⁿ bⁿ | n є N }
In diesem Kapitel geht es darum folgende Dinge zu verstehen und zu können
Als Compiler wird ein Programm bezeichnet, das Quellcode in ein lauffähiges Programm überführt
Die Kompilierung besteht aus zwei Phasen
Die lexikalische Analyse wird vom lexikalischen Scanner (kurz: Lexer) ausgeführt
Beispiel: y = 3 + x;
Input | Token |
---|---|
y |
Bezeichner (LValue) |
= |
Zuweisungsoperator |
3 |
Integer (RValue) |
+ |
Additionsoperator |
x |
Bezeichner (LValue) |
; |
Befehlsende |
Die syntaktische Analyse wird vom Parser ausgeführt
y = 3 + x;
Bei der semantischen Analyse werden die einzelnen Anweisungen überprüft
<span class=‘fragment fr mh-2’
Syntax-Fehler
x = 3
x = 5;
<span class=‘fragment fr’
->Ungültiger Bezeichner (kein Token für 3d) Lexer-Fehler
3d = true;
<span class=‘fragment fr color-red’
Laufzeitfehler, wird beim Kompilieren nicht erkannt!
x = 10/0
Die Synthesephase besteht aus …
Viele verschiedene Optimierungen möglich
Als statische Formeln werden Formeln bezeichnet, welche (mehrere) Konstanten enthalten
Beispiel
pi = 3.141592653; u = 2 * pi * r;
pi = 3.141592653; u = 6.28318531 \* r;
… und unbenutzten Variablen
int addiere(int a, int b) {
int c;
return (a + b);
c = a + b;
return c;
}
int addiere(int a, int b) {
return (a + b);
}
Bei kleinen Funktionen ist der Aufwand der Adressumsetzung und des Sprungbefehls oft größer, als der Nutzen des strukturierten Codes
int addiere(int a, int b) {
return a + b;
}
int c = addiere(3, 4);
int c = 7; //Constant folding von 3+4;
We should forget about small efficiencies, say about 97% of the time: premature optimization is the root of all evil" Donald Knuth
The First Rule of Program Optimization: Don’t do it. The Second Rule of Program Optimization (for experts only!): Don’t do it yet.” Michael A. Jackson:
Ein Linker erstellt aus verschiedenen Programmodulen (Objektdateien) ein lauffähiges Programm
Alle verfügbaren Objektdateien werden zu einer einzigen, ausführbaren Programmdatei gelinkt
Funktions- und Variablenadressen werden erst zur Laufzeit des Programms aufgelöst
Als Programmbibliothek wird eine Sammlung von Funktionen bezeichnet
Quellcode wird nicht kompiliert, sondern bei der Programmausführung eingelesen und Schritt für Schritt ausgeführt
Einfacher Interpreter
Wichtige Unterschiede in Hinblick auf die Optimierung
When I see a bird that walks like a duck and swims like a duck and quacks like a duck, I call that bird a duck. James Whitcomb Riley