Code-Erzeugung Arne Kostulski ( [email protected] ) Seminar „Übersetzung von künstlichen Sprachen“ SS09 1. 2. 3. 4. 5. Abgrenzung, Motivation, Einordnung Grundlagen Code-Repräsentation Code-Erzeugung Fazit und weiterführende Themen Seminar „Übersetzung von künstlichen Sprachen“ SS09 1 1. 2. 3. 4. 5. Abgrenzung, Motivation, Einordnung Grundlagen Code-Repräsentation Code-Erzeugung Fazit und weiterführende Themen Seminar „Übersetzung von künstlichen Sprachen“ SS09 2 Abgrenzung und Motivation Effizienz durch Automatisierung Seminar „Übersetzung von künstlichen Sprachen“ SS09 3 Einordnung innerhalb des Kompilierungsprozesses Seminar „Übersetzung von künstlichen Sprachen“ SS09 4 Einordnung innerhalb des Kompilierungsprozesses Seminar „Übersetzung von künstlichen Sprachen“ SS09 5 Einordnung innerhalb des Kompilierungsprozesses 1. Seminar „Übersetzung von künstlichen Sprachen“ SS09 6 Einordnung innerhalb des Kompilierungsprozesses 3. 1. 2. Seminar „Übersetzung von künstlichen Sprachen“ SS09 7 1. Abgrenzung, Motivation, Einordnung 2. Grundlagen * Zielgrößen * Entwurfsfaktoren * Kernaufgaben * Referenzmaschine 3. Code-Repräsentation 4. Code-Erzeugung 5. Fazit und weiterführende Themen Seminar „Übersetzung von künstlichen Sprachen“ SS09 8 Zielgrößen Semantische Korrektheit Laufzeiteffizienz Virtuelle Speichernutzung Physische Speichernutzung konträr Kompilierzeit Heuristiken für komplexe Optimierungsprobleme Seminar „Übersetzung von künstlichen Sprachen“ SS09 9 Speicherhierarchie Seminar „Übersetzung von künstlichen Sprachen“ SS09 10 Speicherhierarchie Seminar „Übersetzung von künstlichen Sprachen“ SS09 11 Registerverwendung Architekturparameter Kernaufgabe Registeranzahl Registerverwendung Aufgaben Registerzuteilung Registerauswahl Ziel Totale Lade- und Speicherzeiten minimieren Seminar „Übersetzung von künstlichen Sprachen“ SS09 12 Instruktionsselektion Architekturparameter Kernaufgabe Befehlssatz Instruktionsselektion Aufgabe Auswahl von Instruktionskombination Ziel Minimiere totale Instruktionskosten! Beispiel Zwischencode: Zielcode: LD ADD ST a := a + 1 R, a R, R, #1 a, R 1 2 1 LD INC ST ∑4 Seminar „Übersetzung von künstlichen Sprachen“ SS09 13 R, a a a, R 1 1 1 ∑3 Instruktionsanordnung Architekturparameter Kernaufgabe Anzahl der Prozessorkerne Instruktionsanordnung Aufgabe Befehlsfolgen reorganisieren Ziele Code-Vereinfachung Bessere Registerausnutzung Parallelisierung unabhängiger Befehle Seminar „Übersetzung von künstlichen Sprachen“ SS09 14 Kernaufgaben und ISA Architekturparameter Kernaufgaben Registeranzahl Befehlssatz Anzahl der Prozessorkerne Registerzuteilung Instruktionsselektion Instruktionsanordnung Instruction Set Architecture (ISA) Complex Instruction Set Computer (CISC) Reduced Set Computer (RISC) Very Long Instruction Word (VLIW) Seminar „Übersetzung von künstlichen Sprachen“ SS09 15 Abstrakte Zielmaschine - Zielsprache Notation für Operationen: Bsp.: MUL R3, R1, R2 OP <destination>, <source>, <source>, mit <destination> = Ri <source> | { Kleinbuchstabe } = Ri OP | { Kleinbuchstabe } | „#“ { Ziffer } = ADD | SUB | MUL | DIV Ausnahmen: LD ST R, x x, R Seminar „Übersetzung von künstlichen Sprachen“ SS09 16 Abstrakte Zielmaschine Definition Zielsprache Universalregister: R1, …,Rn Administrative Register separat Adressierungen Seminar „Übersetzung von künstlichen Sprachen“ SS09 17 1. Abgrenzung, Motivation, Einordnung 2. Grundlagen 3. Code-Repräsentation * Basisblöcke * Flussgraphen * DAG 4. Code-Erzeugung 5. Fazit und weiterführende Themen Seminar „Übersetzung von künstlichen Sprachen“ SS09 18 Code-Repräsentation: Basisblöcke Strukturierung des Zwischencodes Kontrollfluss Variablenverwendung Basisblock Minimale Sequenz von Instruktionen Blockanfänge definiert durch: a) Die erste Instruktion des Zwischencodes. b) Jede direkte Nachfolge-Instruktion eines Sprunges. c) Jede Zielinstruktion eines (bedingen oder unbedingten) Sprungbefehls. Seminar „Übersetzung von künstlichen Sprachen“ SS09 19 Code-Repräsentation: Basisblöcke Beispiel a) Die erste Instruktion des Zwischencodes. Seminar „Übersetzung von künstlichen Sprachen“ SS09 20 Code-Repräsentation: Basisblöcke Beispiel a) Die erste Instruktion des Zwischencodes. // B1: Fall a) // B2: Fall c) // B3: Fall b) // B4: Fall b) // B5: Fall b) // B6: Fall b) Seminar „Übersetzung von künstlichen Sprachen“ SS09 21 Code-Repräsentation: Basisblöcke Beispiel b) Jede direkte Nachfolge-Instruktion eines Sprunges. // B1: Fall a) // B2: Fall c) // B3: Fall b) // B4: Fall b) // B5: Fall b) // B6: Fall b) Seminar „Übersetzung von künstlichen Sprachen“ SS09 22 Code-Repräsentation: Basisblöcke Beispiel b) Jede direkte Nachfolge-Instruktion eines Sprunges. // B1: Fall a) // B2: Fall c) // B3: Fall b) // B4: Fall b) // B5: Fall b) // B6: Fall b) Seminar „Übersetzung von künstlichen Sprachen“ SS09 23 Code-Repräsentation: Basisblöcke Beispiel c) Jede Zielinstruktion eines (bedingen oder unbedingten) Sprungbefehls. // B1: Fall a) // B2: Fall c) // B3: Fall b) // B4: Fall b) // B5: Fall b) // B6: Fall b) Seminar „Übersetzung von künstlichen Sprachen“ SS09 24 Code-Repräsentation: Basisblöcke Beispiel c) Jede Zielinstruktion eines (bedingen oder unbedingten) Sprungbefehls. // B1: Fall a) // B2: Fall c) // B3: Fall b) // B4: Fall b) // B5: Fall b) // B6: Fall b) Seminar „Übersetzung von künstlichen Sprachen“ SS09 25 Code-Repräsentation: Basisblöcke Ergebnis // B1: Fall a) // B2: Fall c) // B3: Fall b) // B4: Fall b) // B5: Fall b) // B6: Fall b) Seminar „Übersetzung von künstlichen Sprachen“ SS09 26 Code-Repräsentation: Flussgraphen Flussgraph gerichteter, zyklischer Graph G=(V,E) mit Knotenmenge V: Menge aller Basisblöcke (Block als Blackbox) Kantenmenge E: e(Bi, Bj) Є E genau dann, wenn: a) Bj folgt direkt auf Bi in der Programmfolge und Bi ohne unbedingten Sprung. b) Bj ist Ziel eines Sprungbefehls. Seminar „Übersetzung von künstlichen Sprachen“ SS09 27 Code-Repräsentation: Flussgraphen Beispiel: a) Bj folgt direkt auf Bi in der Programmfolge und Bi enthält keinen unbedingten Sprung. B1 B2 B3 B4 B5 B6 Seminar „Übersetzung von künstlichen Sprachen“ SS09 28 Code-Repräsentation: Flussgraphen Beispiel: b) Bj ist Ziel eines Sprungbefehls. B1 B2 B3 B4 B5 B6 Seminar „Übersetzung von künstlichen Sprachen“ SS09 29 Code-Repräsentation: Blockoptimierung mit DAG Innendarstellung eines Blocks gerichteter, azyklischer Graph (DAG) Ziele Registerausnutzung verbessern Code-Vereinfachung Toten Code eliminieren Elemente Operation Label Initiale Variable Seminar „Übersetzung von künstlichen Sprachen“ SS09 30 Code-Repräsentation: Blockoptimierung mit DAG DAG-Konstruktion 1. a := b * c 2. c := a + d 3. b := a * b Seminar „Übersetzung von künstlichen Sprachen“ SS09 31 Erzeuge - Blatt / Blätter - Operationssymbol - Kanten - Label Code-Repräsentation: Blockoptimierung mit DAG DAG-Konstruktion 1. a := b * c 2. c := a + d 3. b := a * b Seminar „Übersetzung von künstlichen Sprachen“ SS09 32 Erzeuge - Blatt / Blätter - Operationssymbol - Kanten - Label Code-Repräsentation: Blockoptimierung mit DAG DAG-Konstruktion 1. a := b * c 2. c := a + d 3. b := a * b Seminar „Übersetzung von künstlichen Sprachen“ SS09 33 Erzeuge - Blatt / Blätter - Operationssymbol - Kanten - Label Code-Repräsentation: Blockoptimierung mit DAG Code-Vereinfachung 1. a 2. c 3. b 4. d := := := := b a a a * + * + c d b d ,d Erzeuge - Blätter - Operationssymbol - Kanten - Label Seminar „Übersetzung von künstlichen Sprachen“ SS09 34 1. 2. 3. 4. a c b d := := := := b * c a + d a * b c Code-Repräsentation: Blockoptimierung mit DAG Lebendigkeit von Variablen Eine Variable x ist lebendig in Anweisung Ai (1 ≤ i < n), wenn: x in Anweisung A1 ein Wert zugewiesen wird, x in Anweisung An als Operand benutzt bzw. gelesen wird, x zwischen A1 und An kein Wert zugewiesen wird. x hat bei Ai die nächste Verwendung in An, wenn An der erste Lesezugriff auf x nach A1 ist. Eine am Basisblockende lebendige Variable heißt live on exit. Seminar „Übersetzung von künstlichen Sprachen“ SS09 35 Code-Repräsentation: Blockoptimierung mit DAG Toter Code Instruktionen mit nicht benötigten Ergebnissen Beispiel c, d nicht live on exit X XX X Seminar „Übersetzung von künstlichen Sprachen“ SS09 36 1. 2. 3. 4. Abgrenzung, Motivation, Einordnung Grundlagen Code-Repräsentation Code-Erzeugung * Elementare Code-Erzeugung * Globale Registerzuteilung * Optimale Code-Erzeugung * Peephole-Optimierung 5. Fazit und weiterführende Themen Seminar „Übersetzung von künstlichen Sprachen“ SS09 37 Elementare Code-Erzeugung Register-Deskriptor Zuordnungen: Register Variablennamen Adressen-Deskriptor Zuordnungen: Variablen Speicheradresse Annahmen für Zielmaschine LD und ST explizit keine globalen Register Variablen mit nächster Verwendung am Blockanfang zu laden live on exit-Variablen zu speichern Seminar „Übersetzung von künstlichen Sprachen“ SS09 38 Elementare Code-Erzeugung Hilfsfunktion getReg getReg(B) mit Drei-Adress-Befehl B Für a := b OP c Lade nötige Variablen Führe den Befehl OP Ra, Rb, Rc aus. Fallunterscheidungen für Code-Erzeugung 1. 2. 3. 4. LD R, a ST a, R a := b OP c a := b Seminar „Übersetzung von künstlichen Sprachen“ SS09 39 Elementare Code-Erzeugung Beispiel: a := b * c Register-Deskriptor Zwischencode Zielcode Regel R1 R2 R3 Seminar „Übersetzung von künstlichen Sprachen“ SS09 40 Adress-Deskriptor ¬live on exit live on exit a c b d Elementare Code-Erzeugung Register- Adress-Deskriptor Deskriptor Zwischencode 1. Zielcode Regel R1 R2 R3 a := b * c 2. LD R1, b 1 b 3. LD R2, c 1 b c ¬lebendig lebendig Blockende Blockende a c b d b c d b,R1 c d b,R1 c, R2 d 4. a := b OP c (mit den Registern Ra, Rb, Rc) 4.1 Falls b bzw. c nicht im Register, führe LD Rb, b bzw. LD Rc, c aus. […] 1. LD R, a 1.1 Der Inhalt von R im Register-Deskriptor ist durch a zu ersetzen 1.2 Füge im Adress-Deskriptor R zu a hinzu. Seminar „Übersetzung von künstlichen Sprachen“ SS09 41 Elementare Code-Erzeugung Register- Adress-Deskriptor Deskriptor Zwischencode 1. Zielcode Regel R1 R2 R3 ¬lebendig lebendig Blockende Blockende a c a := b * c 2. LD R1, b 1 b 3. LD R2, c 1 b c 4. MUL R2, R1, R2 3 b c, a R2 b d b c d b,R1 c d b,R1 c, R2 d b,R1 c, R2 d 4. a := b OP c (mit den Registern Ra, Rb, Rc) 4.1 Falls b bzw. c nicht im Register, führe LD Rb, b bzw. LD Rc, c aus. 4.2 Der Inhalt von Ra im Register-Deskriptor ist durch a zu ersetzen. 4.3 Der Inhalt von a im Adress-Deskriptor ist durch Ra zu ersetzen. 4.4 Entferne Ra von allen anderen Variablen im Adress-Deskriptor. Seminar „Übersetzung von künstlichen Sprachen“ SS09 42 Elementare Code-Erzeugung Register- Adress-Deskriptor Deskriptor Zwischencode 4. 5. Zielcode MUL R2, R1, R2 Regel 3 R1 R2 lebendig Blockende Blockende R3 a b c d b a R2 b,R1 c, R2 d c a a, R2 b, R1 c d EXIT 6. ST 2. a, R2 ST a, R Der Inhalt von a im Adress-Deskriptor ist durch R zu ersetzen. Seminar „Übersetzung von künstlichen Sprachen“ SS09 43 ¬lebendig Globale Register Problem Viele Hauptspeicherzugriffe ST a, R1 LD R1, a Lösung ST a, R1 LD R1, a Problem ST a, R1 if … then goto … LD R1, a Seminar „Übersetzung von künstlichen Sprachen“ SS09 44 Globale Register Beispiel Betrachte Variable b Lesezugriff LD R, a Seminar „Übersetzung von künstlichen Sprachen“ SS09 45 Globale Register Beispiel Betrachte Variable b Lesezugriff LD R, a Schreibzugriff live on exit Lösung Registerinhalte überdauern Basisblöcke Registerzuteilung? Bewertung: Seminar „Übersetzung von künstlichen Sprachen“ SS09 46 Graphfärbung Problem Register voll Registerauswahl? Lebensspanne für ideelle Register Hier: Graph 2-fach färbbar Kollisionen unvermeidbar Zwischenspeicherung Seminar „Übersetzung von künstlichen Sprachen“ SS09 47 Instruktionsselektion Idee: Alternative Instruktionskombinationen = Ma + Ri C1 Seminar „Übersetzung von künstlichen Sprachen“ SS09 48 Optimale Code-Erzeugung Ziel Code mit minimaler Registeranzahl Berücksichtigt Registerzuteilung Registerauswahl Instruktionsanordnung Basis Directed Acyclic Graph (DAG) Procedere: 1. Annotiere Ershov-Nummern an Graph-Knoten 2. Führe Generierungsalgorithmus aus Seminar „Übersetzung von künstlichen Sprachen“ SS09 49 Optimale Code-Erzeugung Ershov-Nummer für Knoten v: val(v) = a c d e := := := := b a a c * * + + c b d d Seminar „Übersetzung von künstlichen Sprachen“ SS09 50 Optimale Code-Erzeugung Ershov-Nummer für Knoten v: val(v) = a c d e := := := := b a a c * * + + c b d d 1 1 Seminar „Übersetzung von künstlichen Sprachen“ SS09 51 1 Optimale Code-Erzeugung Ershov-Nummer für Knoten v: val(v) = a c d e := := := := b a a c * * + + c b d d 2 1 Seminar „Übersetzung von künstlichen Sprachen“ SS09 52 1 1 Optimale Code-Erzeugung Ershov-Nummer für Knoten v: val(v) = 3 a c d e := := := := b a a c * * + + 2 c b d d 2 1 Seminar „Übersetzung von künstlichen Sprachen“ SS09 53 2 1 1 gencode-Algorithmus Optimale Code-Erzeugung gencode(v, b) 1. if v hat Kindknoten vl, vr mit label(vl) = label(vr) then 1.1 k := label(vl) 1.2 Rb+k := gencode(vr, b+1) fRegel Code 1.3 Rb+k-1 := gencode(vl, b) a) k := label(v1) b) R3:= gencode(v1, 1) 1.4 print(name(v), Rb+k, Rb+k-1, Rb+k) 1.1 k := label(v2) 2. else if v hat Kindknoten vl, vr mit label(vl) < label(v r) then 1.2 R3 := gencode(v3, 2) 2.1 k := label(vr) 3.1 k := label(v4) 2.2 Rb+k-1 := gencode(vr, b) 3.2 R3 := gencode(v4, 2) 1.1 k := label(v6) 2.3 m := label(vl) 1.2 R3 := gencode(v7, 3) 2.4 Rb+m-1 := gencode(vl, b) 4.1 print(„LD“, R3, c) 2.5 print(name(v), Rb+k-1, Rb+m-1, Rb+k-1) 1.3 R2 := gencode(v6, 2) 3. else if v hat Kindknoten vl, vr mit label(vl) > label(vr) 4.1 thenprint(„LD“, R2, b) 1.4 print(„MUL“, R3, R2, R3) 3.1 k := label(vl) 3.3 m := label(v5) // m := 1 3.2 Rb+k-1 := gencode(vl, b) 3.4 R2 := gencode(v5, 2) 3.3 m := label(vr) 4.1 print(„LD“, R2, d) 3.4 Rb+m-1 := gencode(vr, b) 3.5 print(„ADD“, R3, R2, R3) 1.3 R2 := gencode(v2, 1) 3.5 print(name(v), Rb+k-1, Rb+k-1, Rb+m-1) 2.1 k := label(v4) 4. else // v ist Blattknoten 2.2 R2 := gencode(v4, 2) 4.1 print(„LD“, Rb, name(v)) Beispiel Seminar „Übersetzung von künstlichen Sprachen“ SS09 54 v b vl vr k R1 R2 R3 v1 1 v2 v3 3 v1 1 v2 v3 3 v1 1 v2 v3 2 v1 1 v2 v3 2 v3 2 v4 v5 2 v3 2 v4 v5 2 v4 2 v6 v7 1 v7 3 - - 1 v7 3 - - 1 c0 v6 2 - - 1 c0 v6 2 - - 1 b0 c0 v4 2 v6 v7 1 b0 a v3 2 v4 v5 2 b0 a v3 2 v4 v5 2 b0 a v5 2 - - 1 d0 a v3 2 v4 v5 2 d0 d v1 1 v2 v3 2 d0 d v2 1 v6 v4 2 d0 d v2 1 v6 v4 2 d0 d Optimale Code-Erzeugung gencode Regel Code v b vl vr k R1 R2 R3 3 2 2 2 1 1 LD R3, c LD R2, b 1 Seminar „Übersetzung von künstlichen Sprachen“ SS09 55 Optimale Code-Erzeugung 3 2 2 2 1 1 MUL“, R3, R2, R3 1 Seminar „Übersetzung von künstlichen Sprachen“ SS09 56 Optimale Code-Erzeugung 3 3 2 2 1 2 2 2 1 1 1 Seminar „Übersetzung von künstlichen Sprachen“ SS09 57 2 1 1 Peephole Optimization Problem Komplexität Idee Lokale Suche im “Gucklock” Beispiel Viele Hauptspeicherzugriffe ST a, R1 LD R1, a Seminar „Übersetzung von künstlichen Sprachen“ SS09 58 … c := a * d := a + e := c + a := b * ST a, R1 LD R1, a c := a * d := a + e := c + … b d d c b d d 1. Abgrenzung, Motivation, Einordnung 2. Grundlagen 3. Code-Repräsentation * Basisblöcke * Flussgraphen 4. Code-Erzeugung 5. Fazit und weiterführende Themen Seminar „Übersetzung von künstlichen Sprachen“ SS09 59 Fazit Gelöst Elementare Codeerzeugung Erzeugung mit minimaler Registeranzahl Ansätze Registerverwendung Instruktionsselektion Instruktionsanordnung Offen Erweiterte Heuristiken Parallelisierung Just-In-Time-Compilation Seminar „Übersetzung von künstlichen Sprachen“ SS09 60 Diskussion Seminar „Übersetzung von künstlichen Sprachen“ SS09 61 BACKUP Code-Repräsentation DAG-Konstruktion Für jeden Drei-Adress-Befehl der Form a := b OP c eines Basisblocks B: 1. 2. 3. Suche nach Vorkommen von b und c in Blättern, Knoten und Labels des Graphs (dies entspricht einer vorigen Benutzung der Variablen). Erzeuge für nicht existierende Variablen neue Blätter mit ihrem Variablennamen und dem Index 0 als Kennzeichnung der Erstverwendung. Erzeuge für OP einen Knoten mit dem Operationssymbol und setze b als linken, c als rechten Kindknoten für OP. Füge a als Label an OP an. Seminar „Übersetzung von künstlichen Sprachen“ SS09 62 BACKUP Elementare Code-Erzeugung Eintragung in die Deskriptoren 1. LD R, a 1.1 Der Inhalt von R im Register-Deskriptor ist durch a zu ersetzen. 1.2 Füge im Adress-Deskriptor R zu a hinzu. 2. ST a, R Der Inhalt von a im Adress-Deskriptor ist durch R zu ersetzen. 3. a := b OP c (mit den Registern Ra, Rb, Rc) 3.1 3.2 3.3 3.4 Falls b bzw. c nicht im Register, führe LD Rb, b bzw. LD Rc, c aus. Der Inhalt von Ra im Register-Deskriptor ist durch a zu ersetzen. Der Inhalt von a im Adress-Deskriptor ist durch Ra zu ersetzen. Entferne Ra von allen anderen Variablen im Adress-Deskriptor. 4. a := b (mit den Registern Ra, Rb) 4.1 Falls b nicht im Register, führe LD Rb, b aus (siehe 1.). 4.2 Der Inhalt von Rb im Register-Deskriptor ist durch a zu ergänzen. 4.3 Der Inhalt von a im Adress-Deskriptor ist durch Rb zu ersetzen. Seminar „Übersetzung von künstlichen Sprachen“ SS09 63 BACKUP Elementare Code-Erzeugung Register-Deskriptor Adress-Deskriptor ¬lebendig lebendig Blockende Blockende Zwischencode 1. Zielcode Regel R1 R2 R3 a a := b * c b c d b c d b,R1 c d b,R1 c,R2 d R2 b,R1 c,R2 d 2. LD R1, b 1 b 3. LD R2, c 1 b c 4. MUL R2, R1, R2 3 b a 6. LD R3, d 1 b a d R2 b,R1 c R3 7. ADD R3, R2, R3 3 b a c R2 b,R1 R3 R3 5. 8. c := a + d EXIT 9. ST c, R1 c a c,d R2 b c,R1 R3 10. ST d, R3 c a c,d R2 b c,R1 d,R3 Seminar „Übersetzung von künstlichen Sprachen“ SS09 64 BACKUP Elementare Code-Erzeugung Register-Deskriptor Adress-Deskriptor ¬lebendig lebendig Blockende Blockende Zwischencode Zielcode 10. ST 11. MUL R1, R2, R1 12. Regel d, R3 3 R1 R2 R3 a b c d c a c,d R2 b c,R1 d,R3 c a c,d R2 b,R1 R1 R3 EXIT 13. ST c, R1 c a c,d R2 b c,R1 R3 14. ST d, R3 c a c,d R2 b c,R1 d,R3 c d 15. Seminar „Übersetzung von künstlichen Sprachen“ SS09 65 BACKUP Optimale Codeerzeugung Funktionsaufruf: a) k := label(vroot) b) Rk := gencode(vroot, 1) Funktionsdeklaration: gencode(v, b) 1. if v hat Kindknoten vl, vr mit label(vl) = label(vr) then 1.1. k := label(vl) 1.2. Rb+k := gencode(vr, b+1) 1.3. Rb+k-1 := gencode(vl, b) 1.4. print(name(v), Rb+k, Rb+k-1, Rb+k) 2. else if v hat Kindknoten vl, vr mit label(vl) < label(vr) then 2.1. k := label(vr) 2.2. Rb+k-1 := gencode(vr, b) 2.3. m := label(vl) 2.4. Rb+m-1 := gencode(vl, b) 2.5. print(name(v), Rb+k-1, Rb+m-1, Rb+k-1) 3. else if v hat Kindknoten vl, vr mit label(vl) > label(vr) then 3.1. k := label(vl) 3.2. Rb+k-1 := gencode(vl, b) 3.3. m := label(vr) 3.4. Rb+m-1 := gencode(vr, b) 3.5. print(name(v), Rb+k-1, Rb+k-1, Rb+m-1) 4. else // v ist Blattknoten 4.1. print(„LD“, Rb, name(v)) Seminar „Übersetzung von künstlichen Sprachen“ SS09 66 BACKUP Optimale Codeerzeugung Regel Code v b vl vr k a) k := label(v1) v1 1 v2 v3 3 b) R3:= gencode(v1, 1) v1 1 v2 v3 3 1.1 k := label(v2) v1 1 v2 v3 2 1.2 R3 := gencode(v3, 2) v1 1 v2 v3 2 3.1 k := label(v4) v3 2 v4 v5 2 3.2 R3 := gencode(v4, 2) v3 2 v4 v5 2 1.1 k := label(v6) v4 2 v6 v7 1 1.2 R3 := gencode(v7, 3) v7 3 - - 1 print(„LD“, R3, c) v7 3 - - 1 c0 R2 := gencode(v6, 2) v6 2 - - 1 c0 print(„LD“, R2, b) v6 2 - - 1 b0 c0 print(„MUL“, R3, R2, R3) v4 2 v6 v7 1 b0 a 3.3 m := label(v5) // m := 1 v3 2 v4 v5 2 b0 a 3.4 R2 := gencode(v5, 2) v3 2 v4 v5 2 b0 a print(„LD“, R2, d) v5 2 - - 1 d0 a print(„ADD“, R3, R2, R3) v3 2 v4 v5 2 d0 d R2 := gencode(v2, 1) v1 1 v2 v3 2 d0 d 2.1 k := label(v4) v2 1 v6 v4 2 d0 d 2.2 R2 := gencode(v4, 2) v2 1 v6 v4 2 d0 d 4.1 1.3 4.1 1.4 4.1 3.5 1.3 R1 R2 R3 Seminar „Übersetzung von künstlichen Sprachen“ SS09 67 BACKUP … … Optimale Codeerzeugung siehe Schritte 6-12 mit … … … … . … … … b=1 2.3 m := label(v6) // m := 1 v2 1 v6 v4 2 b0 a d 2.4 R1 := gencode(v6, 1) v2 1 v6 v4 2 b0 a d print(„LD“, R1, b) v6 1 - - 1 b0 a d print(„MUL“, R2, R1, R2) v2 1 v6 v4 2 b0 c d print(„ADD“, R3, R2, R3) v1 1 v2 v3 2 b0 c e 4.1 2.5 1.4 Seminar „Übersetzung von künstlichen Sprachen“ SS09 68