Beispiel einer Übersetzung Ausdruck in C aktuelle_zeit = Startzeit + vergangene_minuten*60 + vergangene_sekunden; Ausdruck im Instruktionssatz des R10000 LW r1,minuten LW r1,sekunden ADDI r2,r0,60 ADD r1,r1,r3 LW r3,startzeit MFLO r3 MULTU r1,r2 ADD r1,r1,r3 61
Quelldatei des Benutzers weitere Module Preprocessor modifizierte Quelldatei Fehlermeldung Frontend eines Compilers Symboltabelle Analyse der Quelldatei Fehlermeldung Zwischencode Kern des Compilers, abgeschlossene Einheit Synthese des Assemblercodes Assemblerdatei Assembler Kommentare, Hinweise Backend des Compilers Verschiebbarer Objektcode weiterer Objektcode Laden / Binden ausführbarer Maschinencode Fehlermeldung 62
Analyseschritte beim Übersetzen Quelldatei Fehlermeldungen lexikalische Analyse syntaktische Analyse Symboltabelle semantische Analyse 63
Parsebaum für den Ausdruck 6+3+2-5 Term Term Term Zahl Zahl Zahl Zahl 6 + 3 + 2-5 64
Parsebaum für den Ausdruck while (a>b) c++ while stmt while ( expr ) stmt comma expr assignment stmt, 65
Parsebaum für den Ausdruck 3+4+7 cr P E.wert=14 cr E.wert=7 + A.wert=7 E.wert=3 + A.wert=4 Ziffer.lexwert=7 A.wert=3 Ziffer.lexwert=4 Ziffer.lexwert=3 66
Parsebaum für die Definition int stunden, minuten, sekunden R ; T.typ:=Integer V.att=Integer int V.att=Integer, sekunden V.att=Integer, minuten stunden 67
Probleme mit Optimierungen Ursprungsprogramm void test (float* a, float* b, int n, int k) { int i; for (i = n-1; i >= 0; i--) a[i] = a[i] + b[k] + 100000.0; return; } Optimiertes Programm void test (float* a, float* b, int n, int k) { int i; float c; c = b[k] + 100000.0; for (i = 0; i < n; i++) a[i] = a[i] + c; return; } 68
Typische Operationen im Drei-Adress-Code x = y op z goto L if x relop y goto L : bedingter Sprung relop ist eine Vergleichsoperation x = y [i] x = & y x = * y : indizierte Zuweisung : Adresse von y : Inhalt der Adresse von y 69
Beispiel: Bubble-Sort-Programm for (i=n-2; i>=0; i--) for (j=0; j<=i; j++) if (A[j] > A[j+1]) { temp = A[j]; A[j] = A[j+1]; Vertauschen von A[j] und A[j+1] A[j+1] = temp; } 70
Drei-Adress-Code des Bespiels 1 i = n-2 2 L5: if i < 0 goto L1 3 j = 0 4 L4: if j > i goto L2 t1 = j t2 = 4 * t1 t3 = A[t2] #A[j] 5 t4 = j+1 t5 = 4 * t4 t6 = A[t5] #A[j+1] if t3 <= t6 goto L3 t7 = j t8 = 4 * t7 temp = A[t8]#temp = A[j] t9 = j+1 t10 = 4 * t9 t11 = A[t10] 6 t12 = j t13 = 4 * t12 A[t13] = t11 t14 = j+1 t15 = 4 * t14 A[t15] = temp 7 8 L3: j = j+1 goto L4 L2: i = i-1 goto L5 L1: halt # A[j+1] # A[j] = A[j+1] #A[j+1] = temp A[j] benötigt ein Wort (4 Byte) A[j] befindet sich an addr (A) + 4 * j 71
Kontrollflussgraph des Bubble-Sort-Programms Start 1 2 3 Halt 4 5 8 6 7 72
Abhängigkeitsgraph des Grundblocks 6 t7 t9 t12 t14 t8 t10 t13 t15 temp t11 echte Abhängigkeiten A[t13] Schreibabhängigkeit? Blockierabhängigkeit? A[t15] 73
Common Subexpression Elimination t8 = 4 * j temp = A[t8] t9 = j+1 t10 = 4 * t9 t11 = A[t10] t13 = 4 * j A[t13] = t11 t14 = j+1 t15 = 4 * t14 t8 = 4 * j temp = A[t8] t9 = j+1 t10 = 4 * t9 t11 = A[t10] t13 = t8 A[t13] = t11 t14 = t9 t15 = 4 * t14 t8 = 4 * j temp = A[t8] t9 = j+1 t10 = 4 * t9 t11 = A[t10] A[t8] = t11 A[t15] = temp A[t15] = temp A[t10] = temp 3-Adress-Code 3-Adress-Code nach Common Subexpression Elimination Optimierter 3-Adress-Code 74
Superoptimierung t1 = j t2 = 4 * t1 t3 = A[t2] t4 = j + 1 t5 = 4 * t4 t6 = A[t5] if t3 t6 goto L3 t1 = j t2 = 4 * t1 t4 = j + 1 t5 = 4 * t4 t3 = A[t2] t6 = A[t5] if t3 t6 goto L3 t2 = 4 * j t5 = t2 + 4 t3 = A[t2] t6 = A[t5] if t3 t6 goto L3 3-Adress-Code 3-Adress-Code nach Umordnung 3-Adress-Code nach Superoptimierung 75
Bubble-Sort-Programm Grundblock 5 Grundblock 6 t1 = j t2 = 4 * t1 t3 = A[t2] t4 = j+1 t5 = 4 * t4 t6 = A[t5] if t3 <= t6 goto L3 t7 = j t8 = 4 * t7 temp = A[t8] t9 = j+1 t10 = 4 * t9 t11 = A[t10] t12 = j t13 = 4 * t12 A[t13] = t11 t14 = j+1 t15 = 4 * t14 A[t15] = temp t2 = 4 * j t5 = t2 + 4 t8 = 4 * j t10 = t8 + 4 t13 = 4 * j A[t8] = t11 t15 = t13 + 4 A[t10] = temp 76
Teil des Kontrollflussgraphen des Bubble-Sort Programms 5 6 Eine Übertragung der Optimierungen von Grundblock 5 auf Grundblock 6 ist möglich. 7 Eine Übertragung der Optimierungen von Grundblock 5 auf Grundblock 7 ist nicht möglich. 77
Optimierte Grundblöcke 5 und 6 des Bubble-Sort-Programms 5 6 t2 = 4 * j t5 = t2 + 4 t3 = A[t2] t6 = A[t5] if t3 t6 goto L3 t8 = 4 * j t10 = t8 + 4 temp = A[t8] t11 = A[t10] A[t8] = t11 A[t10] = temp t2 = 4 * j t5 = t2 + 4 t3 = A[t2] t6 = A[t5] if t3 t6 goto L3 A[t2] = t6 A[t5] = t3 3-Adress-Code nach Grundblockoptimierung 3-Adress-Code nach erweiterter Grundblockoptimierung 78
Registerzuweisung...... t1 = 4 * j t2 = A[t1] t3 = t1 + 4 t4 = A[t3] t5 = t3 + 4 t6 = t4 + t2 A[t5] = t6 3-Adress Code Ausschnitt j t1 t2 t3 t4 t5 t6 Lebensdauer der Variablen 79
Registerzuweisung über Knotenfärbung R3 = 4 * R1 j R2 = A[R3] t5 t6 t1 R3 = R3 + 4 R4 = A[R3] R3 = R3 + 4 t4 t3 t2 R4 = R4 + R2 A[R3] = R4 Interferenzgraph 3-Adress Code nach Registerzuweisung 80