Code-Optimierung Philipp Bergener Seminar „Übersetzung künstlicher Sprachen“

Slides:



Advertisements
Ähnliche Präsentationen
Blue J.
Advertisements

ALP II: Objektorientierte Programmierung Sommersemester 2006
der Universität Oldenburg
Motivation Compilerbau klingt abstrakt, Kenntnisse sind aber für die Programmierung von Vorteil Übersetzung von Hochsprachen sorgt für tieferes Verständnis.
Vorlesung Compilertechnik Sommersemester 2009 Optimierung M. Schölzel.
Forschungszentrum caesar
Rekursion vs. Iteration
Informatik 12 | DAES Compilerbau Wintersemester 2010 / 2011 Dr. Heiko Falk Technische Universität Dortmund Lehrstuhl Informatik 12 Entwurfsautomatisierung.
Hochschule Fulda – FB ET Sommersemester 2010
Einführung in die Programmierung Zusammenfassung
Zusammenfassung der Vorwoche
Einführung in JavaScript II
Kapitel 6. Suchverfahren
10. Grundlagen imperativer Programmiersprachen
Synonyme: Stapel, Keller, LIFO-Liste usw.
DINAMISCHE STRUKTUREN FACHBEGRIFFE 1. DER POINTERDER POINTER 2. DER BUFFERDER BUFFER 3. DER KNOTENDER KNOTEN DIE EINFACHVERKETTETE LISTE DEFINITION DEFINITION.
Christos, Kornelia, Jan Christos, Kornelia, Jan Entwicklungsumgebung Versteht unseren Java Programm Code Versteht unseren Java Programm.
Christos, Kornelia, Jan Christos, Kornelia, Jan Entwicklungsumgebung Versteht unseren Java Programm Code Versteht unseren Java Programm.
Christos, Kornelia, Jan Christos, Kornelia, Jan Entwicklungsumgebung Versteht unseren Java Programm Code Versteht unseren Java Programm.
Java: Grundlagen der Sprache
1 Vorlesung Informatik 2 Algorithmen und Datenstrukturen (02 – Funktionenklassen) Prof. Dr. Th. Ottmann.
Vorlesung Informatik 2 Algorithmen und Datenstrukturen (02 – Funktionenklassen) Tobias Lauer.
Imperative Programmierung Funktionen und Parameter
Imperative Programmierung
PKJ 2005/1 Stefan Dissmann Zusammenfassung Bisher bekannt: Einfache Variable Feld Vereinbarung Zuweisung Block while-Schleife Bedingte Anweisung (if) Typ.
Grundlegende Analysen & Zwischendarstellungen
Semantische Fehler Seminar im Grundstudium WS2002/2003:
DVG Einführung in Java1 Einführung in JAVA.
Einführung in die Programmierung Anweisungen und Datentypen
Maschinenunabhängige Codeoptimierung
Splay Trees Von Projdakov Benjamin.
Javakurs FSS 2012 Lehrstuhl Stuckenschmidt
1. Abgrenzung, Motivation, Einordnung 2. Grundlagen 3
Präsentation C Tutorium von Daniel J. Nowak Folie 1 C Tutorium.
Einführung in die Programmierung
Abteilung für Telekooperation Übung Softwareentwicklung 1 für Wirtschaftsinformatik Dr. Wieland Schwinger
Auswahlanweisungen, Iterationsanweisungen, Blöcke, Sprunganweisungen
Vortrag: Visual Basic Neuerungen Autor : Dennis Hoyer
Purga - Scriptengine Ein Einblick.
Informatik II Grundlagen der Programmierung Programmieren in C Programmstrukturen / Kontrollstrukturen Hochschule Fulda – FB ET Sommersemester 2014.
Grundlagen Wissenschaftlichen Arbeitens Hilal Tekoglu
Algorithmen und Datenstrukturen Übungsmodul 3
MODULA-2.
Agenda für heute, 7. April, 2005 Bedingte ProgrammausführungBedingte Programmausführung Algorithmische Grundlagen Vergleichsoperatoren, Wahrheitswerte.
Übung 4.1 Strukturierte Datentypen
Programmieren in C Grundlagen C 2
BMEVIEEA100 Grundlagen der Programmierung
PHP: Operatoren und Kontrollstrukturen
Hochschule Fulda – FB ET Sommersemester 2014
Programmieren in C Grundlagen C 2
Johann Baron von Neumann
Paul, Morten, Yannick Blue J. Entwicklungsumgebung  versteht Java Programmcode  Für die Entwicklung eigener Software  Durch die Programmierung.
Agenda Motivation und Einordnung Syntaxgerichtete Übersetzung
Java Syntaxdiagramme Buchstabe A B Z a z ... Ziffer
Software Engineering Struktogramme
Agenda für heute, 21. April, 2005 Interaktion mit Pascal-ProgrammenInteraktion mit Pascal-Programmen Dateneingabe Programmsteuerung Debugging Datentypen:
Java-Kurs - 4. Übung Hausaufgabe Weitere Kontrollstrukturen
Lernlandkarte OOP (ObjektOrientiertes Programmieren)
Java-Kurs - 4. Übung Hausaufgabe Weitere Kontrollstrukturen
Programmierkurs JavaUE 4 Anweisungen und ProgrammeDietrich BolesSeite 1 Programmierkurs Java Dr. Dietrich Boles Teil Imperative Programmierung Unterrichtseinheit.
The Programming Language Pascal
Einführung in Java PING e.V. Weiterbildung Andreas Rossbacher 24. März 2005.
Wann ist eine Funktion (über den natürlichen Zahlen) berechenbar?
Datenflussanalyse - Klassisch Seminar “Progammanalyse” (SS 2009) Referent: Lorenz Schauer Vortrag:
Prüfungsbesprechung Barbara Scheuner Vorlesung: Programmieren und Problemlösen Prof. Hans Hinterberger.
Programmiersprache PASCAL
Objektorientierte (OO) Programmierung
Christos, Kornelia, Jan Christos, Kornelia, Jan Entwicklungsumgebung Versteht unseren Java Programm Code Versteht unseren Java Programm.
Ein-/ Ausgabe in Java ein Überblick. © eigentlich ganz einfach ? Ein-/Ausgabe durch package java.io Ausgabe (auf Konsole) mit System.out.println()
Objektorientierte Programmierung
 Präsentation transkript:

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] = x a[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 E ingang l = 0 r = N-1 t1 = l+r m = t1/2 t2 = 8*m t3 = a[t2] ifFalse k<t3 goto B4 Ausgang l = m+1 r = m-1 goto B5 if l<r goto B2 t4 = 8*m t5 = a[t4] ifFalse k==t5 goto B2 B1 B2 B3 B4 B5 B6

9 Agenda Einführung Grundlagen Datenflussanalyse Methoden zur Code-Optimierung Zusammenfassung

10 Datenflussanalyse Viele Optimierungsansätze brauchen Informationen über Datenfluss im Programm Programm ist eine Folge von Zuständen Zustand: unter anderem aktuelle Werte der Variablen Anweisungen sind Zustandsübergänge Durch Sprünge sind Zustände nicht immer eindeutig Nur der für ein Problem relevante Teil des Zustandes betrachtet Es wird nicht unterschieden auf welchem Pfad ein Programmpunkt erreicht wird

11 Bestandteile eines Datenflussproblems Datenflussproblem ist 4-Tupel (D, V, ^, F) Datenflussrichtung D  {Vorwärts, Rückwärts} Gibt an ob Informationen mit oder gegen Informationsfluss fließen Domäne V relevanter Teil des Zustandes Konfluenzoperator ^ (z.B.  ) Zum Übergang zwischen Blöcken Menge von Transferfunktionen F F: V  V Für ganze Basisblöcke

12 Verfügbare Definitionen Fragestellung: Welche Definition für eine Variable ist an einem bestimmten Programmpunkt gültig Datenflussrichtung: D = Vorwärts Domäne: Potenzmenge der Menge aller Definitionen Konfluenzoperator: , also IN[B] =  P Vorgänger von B OUT[P] Transferfunktion: gen B : Menge generierter Definitionen in Block B kill B : Menge gelöschter Definitionen in Block B Dann OUT[B] = gen B  (IN[B] - kill B )

13 Verfügbare Definitionen l = 0(d1) r = N-1(d2) l = m+1(d8) r = m-1(d7) goto B5 B1 B3 B4 gen[B1]={d1, d2} kill[B1]={d7,d8} gen[B3]={d7} kill[B3]={d2} gen[B4]={d8} kill[B4]={d1}... B2

14 Aktive Variablen Eine Variable x ist aktiv an Punkt p, wenn der Wert von x in p entlang eines Pfades von p an benutzt kann und wird. Andernfalls ist sie passiv. Datenflussrichtung: D = Rückwärts Domäne: Potenzmenge der Menge aller Variablen Konfluenzoperator: , also OUT[B] =  P Nachfolger von B IN[P] Transferfunktion: def B : Menge der Variablen, die in Block B definiert werden use B : Menge der Variablen, die in B benutzt werden (bevor sie neu definiert werden) Dann: IN[B] = use B  (OUT[B] - def B )

15 Verfügbare Ausdrücke Ein Ausdruck der Form x op y ist an einem Punkt p verfügbar, wenn der Ausdruck auf jedem Pfad zu p berechnet wird und weder x noch y danach überschrieben werden Datenflussrichtung: D = Vorwärts Domäne: Potenzmenge der Menge aller Ausdrücke Konfluenzoperator:  also IN[B] =  P Vorgänger von B OUT[P] Transferfunktion: e_gen B : Menge aller Ausdrücke, die in B (neu) berechnet werden e_kill B : Menge aller Ausdrücke, die in B ungültig werden Dann: OUT[B] = e_gen B  (IN[B] - e_kill B )

16 Halbverband Ein Datenflussproblem bildet einen Halbverband Eigenschaften eines Halbverbands: x ^ x = x x ^ y = y ^ x x ^ (y ^ z) = (x ^ y) ^ zx, y, z  V Halbverbände haben oberstes Element T mit T ^ x = x  x  V Für  : T =  Für  : T = Basismenge der Potenzmenge

17 Algorithmus zum Lösen von Datenflussproblemen Zusätzlich noch Startmenge v (meist  ) OUT[Eingang]=v Eingang ; for(jeden Block B außer Eingang) OUT[B] = T; while(min. ein OUT wird geändert) for(jeden Block B außer Eingang) { IN[B]=^ P Vorgänger von p OUT[P]; OUT[B]=f B (IN[B]); } Für D = Rückwärts IN und OUT vertauschen Ausgang statt Eingang

18 Agenda Einführung Grundlagen Datenflussanalyse Methoden zur Code-Optimierung Zusammenfassung

19 Eliminierung gemeinsamer Teilausdrücke Gemeinsamer Teilausdruck: Vorkommen von Ausdruck E der schon einmal berechnet wurde und sich nicht mehr geändert hat. Ziel: wiederholte Berechnungen des gleichen Ausdrucks vermeiden Ermitteln mit Verfügbaren Ausdrücken Eliminierung Teilausdruck in Hilfsvariable speichern Dann statt Teilausdruck Hilfsvariable verwenden

20 Eliminierung gemeinsamer Teilausdrücke t1 = l+r m = t1/2 t2 = 8*m t3 = a[t2] ifFalse k<t3 goto B4 t4 = 8*m t5 = a[t4] ifFalse k==t5 goto B2 t1 = l+r m = t1/2 h1 = 8*m t2 = h1 t3 = a[t2] ifFalse k<t3 goto B4 t4 = h1 t5 = a[t4] ifFalse k==t5 goto B2... B2 B5 l = m+1 r = m-1 goto B5 B3 B4 l = m+1 r = m-1 goto B5 B3 B4...

21 Weitergabe von Kopien Durch andere Optimierungsverfahren entstehen Kopien der Form x = y Ziel: y anstelle von x benutzen Dadurch kann die Kopieranweisung überflüssig werden Lösung mit Verfügbaren Definitionen: Ersetzung ist in p möglich, wenn x und y noch gleichen Wert besitzen Dazu müssen sowohl die Definition x = y als auch die Definition für y, die in x = y galt, gültig in p sein Außerdem dürfen keine anderen Definitionen x und y p erreichen

22 Weitergabe von Kopien t1 = l+r m = t1/2 h1 = 8*m t2 = h1 t3 = a[t2] ifFalse k<t3 goto B4 t4 = h1 t5 = a[t4] ifFalse k==t5 goto B2 t1 = l+r m = t1/2 h1 = 8*m t2 = h1 t3 = a[h1] ifFalse k<t3 goto B4 t4 = h1 t5 = a[h1] ifFalse k==t5 goto B2... B2 B5 l = m+1 r = m-1 goto B5 B3 B4 l = m+1 r = m-1 goto B5 B3 B4...

23 Eliminierung von totem Code Toter Code: Anweisungen, die nie erreicht werden Zuweisungen, die nie benutzt werden Entsteht durch andere Optimierungen oder (selten) durch Programmierfehler Identifizierung über aktive Variablen Beispiel: x = true...//Hier keine Zuweisungen an x if x goto L1 a = b + c //Toter Code L1:b = 2 * c

24 Optimierung von Schleifen Programme verbringen einen Großteil ihrer Zeit in Schleifen Optimierung von Schleifen daher besonders wichtig 2 Ansätze zur Optimierung von Schleifen Export schleifeninvarianter Variablen Eliminierung von Induktionsvariablen

25 Optimierung von Schleifen Identifikation von Schleifen Dominator: Knoten d dominiert Knoten n (d dom n), wenn jeder Pfad im Flussgraph von Eingang zu n über d führt Rückwärtskante: Kante n → d mit d dom n Natürliche Schleife einer Rückwärtskante n → d: Alle Knoten von denen n erreicht werden kann ohne durch d zu laufen

26 Optimierung von Schleifen E ingang l = 0 r = N-1 t1 = l+r m = t1/2 t2 = 8*m t3 = a[t2] ifFalse k<t3 goto B4 Ausgang l = m+1 r = m-1 goto B5 if l<r goto B2 t4 = 8*m t5 = a[t4] ifFalse k==t5 goto B2 B1 B2 B3 B4 B5 B6

27 Optimierung von Schleifen E ingang l = 0 r = N-1 t1 = l+r m = t1/2 t2 = 8*m t3 = a[t2] ifFalse k<t3 goto B4 Ausgang l = m+1 r = m-1 goto B5 if l<r goto B2 t4 = 8*m t5 = a[t4] ifFalse k==t5 goto B2 B1 B2 B3 B4 B5 B6

28 Optimierung von Schleifen E ingang l = 0 r = N-1 t1 = l+r m = t1/2 t2 = 8*m t3 = a[t2] ifFalse k<t3 goto B4 Ausgang l = m+1 r = m-1 goto B5 if l<r goto B2 t4 = 8*m t5 = a[t4] ifFalse k==t5 goto B2 B1 B2 B3 B4 B5 B6

29 Optimierung von Schleifen Export schleifeninvarianter Variablen: Variable ist schleifeninvariant, wenn in Schleife keine Zuweisung an sie erfolgt Ein Ausdruck ist schleifeninvariant, wenn er nur aus schleifeninvarianten Variablen besteht Diese sollen aus der Schleife herausgezogen werden while (i < max) do x := 3*y//3*y ist schleifeninvariant z := x+j j := i*2 i := i+1 end

30 Optimierung von Schleifen Eliminierung von Induktionsvariablen Induktionsvariable, die sich bei jedem Schleifendurchlauf um den gleichen, konstanten Wert ändert Diese sollen (bis auf eine) eliminiert werdenx := 3*y while (i < max) doj := 2*i z := x+jwhile (j < 2*max) do j := i*2z := x+j i := i+1j := j+2end i := max

31 Konstantenfaltung Konstanten verbessern die Lesbarkeit von Programmen Auf Ebenen des Zwischencodes nicht nötig Daher: Variablen, die an einer Stelle immer den gleichen Wert haben durch diesen ersetzen Ausdrücke, die nur aus Konstanten bestehen, können dann ebenfalls berechnet werden Ermittlung von Konstanten auch mit Datenflussanalyse möglich

32 Konstantenfaltung Beispiel: N = 10//Konstante... x = 2//Wert in nächster Anweisung immer gleich y = N*x//N und x können ersetzt werden N = x = 2 y = 10*2//Ausdruck kann jetzt berechnet werden

33 Algebraische Umformungen Ersetzen von langsameren Befehlen durch schnellere Ausnutzen von mathematischen Gesetzen Beispiele x*2 n → x shiftl n x + 0 oder x * 1 → x x 2 → x*x 2*x → x+x x/4 → x * 0,25

34 Agenda Einführung Grundlagen Datenflussanalyse Methoden zur Code-Optimierung Zusammenfassung

35 Zusammenfassung Direkt übersetzter Code kann noch weiter optimiert werden Es gibt verschiedene Ansätze zur Optimierung Datenflussanalyse bildet eine wichtige Grundlage für viele dieser Ansätze Es gibt weitere Optimierungsmethoden, z.B. für Maschinen-Code für OO-Sprachen

36 Fragen Vielen Dank für die Aufmerksamkeit Fragen?