360 likes | 603 Views
Agenda. EinfhrungGrundlagenDatenflussanalyseMethoden zur Code-OptimierungZusammenfassung. Ziele und Anforderungen. Verbesserung des Codes, der bei direkter, naiver bersetzung entstehtOptimierungsmglichkeitenVerbesserung der AusfhrgeschwindigkeitVerringerung des Speicherbedarfs zur
E N D
1. Code-Optimierung Philipp Bergener
Seminar „Übersetzung künstlicher Sprachen“
2. Agenda Einführung
Grundlagen
Datenflussanalyse
Methoden zur Code-Optimierung
Zusammenfassung
3. Ziele und Anforderungen Verbesserung des Codes, der bei direkter, „naiver“ Übersetzung entsteht
Optimierungsmöglichkeiten
Verbesserung der Ausführgeschwindigkeit
Verringerung des Speicherbedarfs zur Laufzeit
Verkleinerung des erzeugten Codes
Anforderungen
Semantik des Programms muss erhalten bleiben
Aufwand für Optimierung muss sich lohnen
4. Systematisierung Nach Zeitpunkt für Code-Optimierung:
Nach Zwischen-Codeerzeugung: Eher allgemeine Methoden
Nach Maschinen-Codeerzeugung: Eher maschinenspezifisch
Globale vs. lokale Optimierung
Lokal: Nur Ausschnitt (Basisblock) wird betrachtet
Global: Mehrere Basisblöcke werden betrachtet
5. Agenda Einführung
Grundlagen
Datenflussanalyse
Methoden zur Code-Optimierung
Zusammenfassung
6. Drei-Adress-Code Zur Darstellung des Zwischencodes
Maximal 3 Adressen pro Befehl
Typen von Befehlen
Zuweisung: x = y op z op: arithmetisch (+,-,*,/) oder logisch (AND, OR)
Kopieranweisungen: x = y
Unbedingte Sprünge: goto L (L Sprungmarke)
Bedingte Sprünge: if x goto L bzw. ifFalse x goto L
oder if x relop y bzw. ifFalse x relop y (relop: <, ==, >, etc.)
Indizierte Kopieranweisungen: x = a[i] bzw. a[i] = xa[i]: Speicherstelle i Einheiten hinter a
7. Basisblöcke und Flussgraphen Basisblöcke
Strukturieren den Code
Eigenschaften eines Basisblocks:
Kann nur durch die erste Anweisung betreten werden
Wird ohne Sprünge durchlaufen. Sprünge nur in der letzten Anweisung
Ein Basisblock beginnt
Bei der ersten Codezeile
Bei Zeilen, die Ziel von Sprüngen sind
Bei Zeilen, die auf Sprünge folgen
Flussgraphen
stellen Kontrollfluss grafisch dar
Basisblöcke sind Knoten
2 zusätzliche Knoten Eingang und Ausgang
8. Beispiel: Binäre Suche public Ingeger binsearch(Integer k) { Integer m,l,r; //Anfang l = 0; r = N-1; do { m = (l+r)/2; if(k < a[m]) r = m-1; else l = m+1; while((k != a[m])||(l<r)); //Ende ... end