Compiler-Phasen
erzeugt Liste von Tokens
erzeugt Syntaxbaum
erzeugt Programm der Zielsprache
Informationen im Syntaxbaum
Parser benutzt kontextfreie Grammatik
jedes Programm besitzt auch kontextabhängige Eigenschaften
müssen durch Durchlaufen des gesamten
Syntaxbaumes berechnet werden.
Beispiele für solche Informationen:
Daten-Fluß-Analyse
bestimmt für jeden Code-Block:
ermöglicht Beantwortung der Fragen:
Problem: zur exakten Beantwortung müßte man Code ausführen. (Bsp: Verzweigungen, Schleifen)
Ausweg: Approximation durch abstrakte Interpretation
Zwischencode-Generierung
Id: zwigen.tex,v 1.1 2004/01/19 14:23:29 joe Exp
Aufgabe:
Arbeitsschritte (für Registermaschinen):
Common Subexpression Elimination -- CSE
Idee: gleichwertige (Teil)ausdrücke (auch aus verschiedenen Ausdrücken) nur einmal auswerten.
Implementierung: Sharing von Knoten im Syntaxbaum
Vorsicht: Ausdrücke müssen wirklich völlig gleichwertig sein, einschließlich aller Nebenwirkungen.
Auch Pointer/Arrays gesondert behandeln.
Beispiele:
;
und
;
und
;
.. a [4] .. a [4] ..
Aufgabe: untersuchen, wie weit gcc
CSE durchführt.
Bis zum Seminar Testprogramme ausdenken!
Constant Propagation
Id: cp.tex,v 1.1 2004/01/19 14:23:29 joe Exp
z. B. vor der Schleife statt in der Schleife)
z. B. A
nicht vor einer Verzweigung if ( .. ) { x = A; }
Constant Folding, Strength Reduction
Id: cf.tex,v 1.1 2004/01/19 14:23:29 joe Exp
strength reduction:
``starke'' Operationen ersetzen,
z. B. x * 17
durch x << 4 + x
constant folding:
Operationen ganz vermeiden:
konstante Ausdrücke zur Compile-Zeit bestimmen
z. B. c + ('A' - 'a')
Aufgabe: wieweit macht gcc
das? Tests ausdenken!
evtl. autotool zu strength reduction (Additionsketten)
Linearisieren
Id: linear.tex,v 1.1 2004/01/19 14:23:29 joe Exp
zusammengesetzte Ausdrücke übersetzen
in einzelne Anweisungen mit neuen Variablen:
h1 = a*a; h2 = 4*b; h3 = h2 * c; x = h1 + h3
Registervergabe
Id: reg.tex,v 1.2 2004/01/19 19:16:00 joe Exp
benötigen Speicher für
es gibt aber nur begrenzt viele Register.
Zwischencode-Generierung für ``unendlich'' viele symbolische Register, dann Abbildung auf Maschinenregister und Hauptspeicher (register spilling).
Register-Interferenz-Graph
(für einen basic block)
Knoten: die symbolischen Register
Kanten:
,
falls
und
gleichzeitig lebendig sind.
(lebendig: wurde geschrieben, und wird noch gebraucht)
finde Knotenfärbung
(d. i. Zuordnung : symbolisches Register
Maschinenregister)
mit möglichst wenig Farben (Maschinenregistern), für die
.
Ist algorithmisch lösbares, aber schweres Problem (NP-vollständig)
Register-Graphen-Färbung (Heuristik)
Heuristik für Färbung von :
Aufgabe: finde Graphen , für die man nach dieser Heuristik
keine optimale Färbung erhält.
Falls dabei mehr Farben als Maschinenregister, dann lege die seltensten Registerfarben in Hauptspeicher.
(Es gibt bessere, aber kompliziertere Methoden.)
Peephole-Optimierung, Instruction Selection
Id: is.tex,v 1.1 2004/01/19 14:23:29 joe Exp
Zwischencode-Liste übersetzen in Zielcode-Liste.
kurze Blöcke von aufeinanderfolgenden Anweisungen optimieren (peephole) und dann passenden Maschinenbefehl auswählen.
durch Mustervergleich (pattern matching), dabei Kosten berechnen und optimieren
gcc
: Zwischencode ist
maschinenunabhängige RTL (Register Transfer Language),
damit ist nur Instruction Selection maschinenabhängig
leichter portierbar.
Id: semi.tex,v 1.1 2004/01/21 09:58:39 joe Exp