Seminar „Übersetzung von künstlichen Sprachen“ SS09
Code-ErzeugungArne Kostulski
2
Seminar „Übersetzung von künstlichen Sprachen“ SS09
1. Abgrenzung, Motivation, Einordnung2. Grundlagen3. Code-Repräsentation4. Code-Erzeugung5. Fazit und weiterführende Themen
3
Seminar „Übersetzung von künstlichen Sprachen“ SS09
1. Abgrenzung, Motivation, Einordnung2. Grundlagen3. Code-Repräsentation4. Code-Erzeugung5. Fazit und weiterführende Themen
4
Seminar „Übersetzung von künstlichen Sprachen“ SS09
Abgrenzung und Motivation
Effizienz durch Automatisierung
5
Seminar „Übersetzung von künstlichen Sprachen“ SS09
Einordnung innerhalb des Kompilierungsprozesses
6
Seminar „Übersetzung von künstlichen Sprachen“ SS09
Einordnung innerhalb des Kompilierungsprozesses
7
Seminar „Übersetzung von künstlichen Sprachen“ SS09
Einordnung innerhalb des Kompilierungsprozesses
1.
8
Seminar „Übersetzung von künstlichen Sprachen“ SS09
Einordnung innerhalb des Kompilierungsprozesses
1.
2.
3.
9
Seminar „Übersetzung von künstlichen Sprachen“ SS09
1. Abgrenzung, Motivation, Einordnung2. Grundlagen * Zielgrößen * Entwurfsfaktoren * Kernaufgaben * Referenzmaschine3. Code-Repräsentation4. Code-Erzeugung 5. Fazit und weiterführende Themen
10
Seminar „Übersetzung von künstlichen Sprachen“ SS09
Zielgrößen
Semantische Korrektheit
Laufzeiteffizienz
Virtuelle Speichernutzung
Physische Speichernutzung
Kompilierzeit
Heuristiken für komplexe Optimierungsprobleme
konträr
11
Seminar „Übersetzung von künstlichen Sprachen“ SS09
Speicherhierarchie
12
Seminar „Übersetzung von künstlichen Sprachen“ SS09
Speicherhierarchie
13
Seminar „Übersetzung von künstlichen Sprachen“ SS09
Registerverwendung
AufgabenRegisterzuteilung
Registerauswahl
ZielTotale Lade- und Speicherzeiten minimieren
Architekturparameter
Registeranzahl
Kernaufgabe
Registerverwendung
14
Seminar „Übersetzung von künstlichen Sprachen“ SS09
Instruktionsselektion
AufgabeAuswahl von Instruktionskombination
ZielMinimiere totale Instruktionskosten!
BeispielZwischencode: a := a + 1
Zielcode: LD R, aADD R, R, #1ST a, R
121
111
∑ 4 ∑ 3
Architekturparameter
Befehlssatz
Kernaufgabe
Instruktionsselektion
LD R, aINC aST a, R
15
Seminar „Übersetzung von künstlichen Sprachen“ SS09
Architekturparameter
Anzahl der Prozessorkerne
Kernaufgabe
Instruktionsanordnung
Instruktionsanordnung
AufgabeBefehlsfolgen reorganisieren
ZieleCode-Vereinfachung
Bessere Registerausnutzung
Parallelisierung unabhängiger Befehle
16
Seminar „Übersetzung von künstlichen Sprachen“ SS09
Instruction Set Architecture (ISA)Complex Instruction Set Computer (CISC)
Reduced Set Computer (RISC)
Very Long Instruction Word (VLIW)
Architekturparameter
RegisteranzahlBefehlssatzAnzahl der Prozessorkerne
Kernaufgaben
RegisterzuteilungInstruktionsselektionInstruktionsanordnung
Kernaufgaben und ISA
17
Seminar „Übersetzung von künstlichen Sprachen“ SS09
Abstrakte Zielmaschine - Zielsprache
Notation für Operationen:
Bsp.: MUL R3, R1, R2
OP <destination>, <source>, <source>, mit
<destination> = Ri
| { Kleinbuchstabe }
<source> = Ri
| { Kleinbuchstabe }
| „#“ { Ziffer }
OP = ADD | SUB | MUL | DIV
Ausnahmen:LD R, x ST x, R
18
Seminar „Übersetzung von künstlichen Sprachen“ SS09
Abstrakte Zielmaschine
DefinitionZielsprache
Universalregister: R1, …,Rn
Administrative Register separat
Adressierungen
19
Seminar „Übersetzung von künstlichen Sprachen“ SS09
1. Abgrenzung, Motivation, Einordnung 2. Grundlagen3. Code-Repräsentation * Basisblöcke * Flussgraphen * DAG4. Code-Erzeugung 5. Fazit und weiterführende Themen
20
Seminar „Übersetzung von künstlichen Sprachen“ SS09
Code-Repräsentation: Basisblöcke
Strukturierung des ZwischencodesKontrollfluss
Variablenverwendung
BasisblockMinimale 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.
21
Seminar „Übersetzung von künstlichen Sprachen“ SS09
Code-Repräsentation: BasisblöckeBeispiel
a) Die erste Instruktion des Zwischencodes.
22
Seminar „Übersetzung von künstlichen Sprachen“ SS09
// B1: Fall a)
// B2: Fall c)
// B3: Fall b)
// B4: Fall b)
// B5: Fall b)
// B6: Fall b)
Code-Repräsentation: BasisblöckeBeispiel
a) Die erste Instruktion des Zwischencodes.
23
Seminar „Übersetzung von künstlichen Sprachen“ SS09
// B1: Fall a)
// B2: Fall c)
// B3: Fall b)
// B4: Fall b)
// B5: Fall b)
// B6: Fall b)
Code-Repräsentation: BasisblöckeBeispiel
b) Jede direkte Nachfolge-Instruktion eines Sprunges.
24
Seminar „Übersetzung von künstlichen Sprachen“ SS09
// B1: Fall a)
// B2: Fall c)
// B3: Fall b)
// B4: Fall b)
// B5: Fall b)
// B6: Fall b)
Code-Repräsentation: BasisblöckeBeispiel
b) Jede direkte Nachfolge-Instruktion eines Sprunges.
25
Seminar „Übersetzung von künstlichen Sprachen“ SS09
// B1: Fall a)
// B2: Fall c)
// B3: Fall b)
// B4: Fall b)
// B5: Fall b)
// B6: Fall b)
Code-Repräsentation: BasisblöckeBeispiel
c) Jede Zielinstruktion eines (bedingen oder unbedingten) Sprungbefehls.
26
Seminar „Übersetzung von künstlichen Sprachen“ SS09
// B1: Fall a)
// B2: Fall c)
// B3: Fall b)
// B4: Fall b)
// B5: Fall b)
// B6: Fall b)
Code-Repräsentation: BasisblöckeBeispiel
c) Jede Zielinstruktion eines (bedingen oder unbedingten) Sprungbefehls.
27
Seminar „Übersetzung von künstlichen Sprachen“ SS09
Code-Repräsentation: BasisblöckeErgebnis
// B1: Fall a)
// B2: Fall c)
// B3: Fall b)
// B4: Fall b)
// B5: Fall b)
// B6: Fall b)
28
Seminar „Übersetzung von künstlichen Sprachen“ SS09
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.
29
Seminar „Übersetzung von künstlichen Sprachen“ SS09
Code-Repräsentation: Flussgraphen
B1
B2
B3
B4
B5
B6
Beispiel:a) Bj folgt direkt auf Bi in der Programmfolge und Bi enthält keinen
unbedingten Sprung.
30
Seminar „Übersetzung von künstlichen Sprachen“ SS09
Code-Repräsentation: Flussgraphen
B1
B2
B3
B4
B5
B6
Beispiel:b) Bj ist Ziel eines Sprungbefehls.
31
Seminar „Übersetzung von künstlichen Sprachen“ SS09
Code-Repräsentation: Blockoptimierung mit DAG
Innendarstellung eines Blocksgerichteter, azyklischer Graph (DAG)
ZieleRegisterausnutzung verbessern
Code-Vereinfachung
Toten Code eliminieren
Elemente
Initiale Variable
Operation Label
32
Seminar „Übersetzung von künstlichen Sprachen“ SS09
Code-Repräsentation: Blockoptimierung mit DAG
DAG-Konstruktion
1. a := b * c2. c := a + d3. b := a * b
Erzeuge
- Blatt / Blätter- Operationssymbol- Kanten- Label
33
Seminar „Übersetzung von künstlichen Sprachen“ SS09
Code-Repräsentation: Blockoptimierung mit DAG
DAG-Konstruktion
1. a := b * c2. c := a + d3. b := a * b
Erzeuge
- Blatt / Blätter - Operationssymbol- Kanten- Label
34
Seminar „Übersetzung von künstlichen Sprachen“ SS09
Code-Repräsentation: Blockoptimierung mit DAG
DAG-Konstruktion
1. a := b * c2. c := a + d3. b := a * b
Erzeuge
- Blatt / Blätter - Operationssymbol- Kanten- Label
35
Seminar „Übersetzung von künstlichen Sprachen“ SS09
Code-Repräsentation: Blockoptimierung mit DAG
Code-Vereinfachung
, d1. a := b * c2. c := a + d3. b := a * b4. d := a + d
1. a := b * c2. c := a + d3. b := a * b4. d := c
Erzeuge
- Blätter- Operationssymbol- Kanten- Label
36
Seminar „Übersetzung von künstlichen Sprachen“ SS09
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.
37
Seminar „Übersetzung von künstlichen Sprachen“ SS09
Code-Repräsentation: Blockoptimierung mit DAG
Toter CodeInstruktionen mit nicht benötigten Ergebnissen
Beispielc, d nicht live on exit
XX
X
X
38
Seminar „Übersetzung von künstlichen Sprachen“ SS09
1. Abgrenzung, Motivation, Einordnung 2. Grundlagen3. Code-Repräsentation4. Code-Erzeugung * Elementare Code-Erzeugung * Globale Registerzuteilung * Optimale Code-Erzeugung * Peephole-Optimierung5. Fazit und weiterführende Themen
39
Seminar „Übersetzung von künstlichen Sprachen“ SS09
Elementare Code-Erzeugung
Register-DeskriptorZuordnungen: Register Variablennamen
Adressen-DeskriptorZuordnungen: Variablen Speicheradresse
Annahmen für ZielmaschineLD und ST explizit
keine globalen RegisterVariablen mit nächster Verwendung am Blockanfang zu laden
live on exit-Variablen zu speichern
40
Seminar „Übersetzung von künstlichen Sprachen“ SS09
Elementare Code-Erzeugung
Hilfsfunktion getReggetReg(B) mit Drei-Adress-Befehl B
Für a := b OP cLade nötige Variablen
Führe den Befehl OP Ra, Rb, Rc aus.
Fallunterscheidungen für Code-Erzeugung1. LD R, a
2. ST a, R
3. a := b OP c
4. a := b
41
Seminar „Übersetzung von künstlichen Sprachen“ SS09
Elementare Code-Erzeugung
Register-Deskriptor Adress-Deskriptor
¬live on exit live on exit
Zwischencode Zielcode Regel R1 R2 R3a b c d
Beispiel: a := b * c
42
Seminar „Übersetzung von künstlichen Sprachen“ SS09
Elementare Code-ErzeugungRegister-
Deskriptor
Adress-Deskriptor
¬lebendig
Blockende
lebendig
Blockende
Zwischencode Zielcode Regel R1 R2 R3a b c d
1. a := b * c b c d
2. LD R1, b 1 b b,R1 c d
3. LD R2, c 1 b c 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.[…]
5.LD R, a1.1 Der Inhalt von R im Register-Deskriptor ist durch a zu ersetzen1.2 Füge im Adress-Deskriptor R zu a hinzu.
43
Seminar „Übersetzung von künstlichen Sprachen“ SS09
Elementare Code-ErzeugungRegister-
Deskriptor
Adress-Deskriptor
¬lebendig
Blockende
lebendig
Blockende
Zwischencode Zielcode Regel R1 R2 R3a b c d
1. a := b * c b c d
2. LD R1, b 1 b b,R1 c d
3. LD R2, c 1 b c b,R1 c, R2 d
4. MUL R2, R1, R2 3 b c, a R2 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.
44
Seminar „Übersetzung von künstlichen Sprachen“ SS09
Elementare Code-Erzeugung
Register-
Deskriptor
Adress-Deskriptor
¬lebendig
Blockende
lebendig
Blockende
Zwischencode Zielcode Regel R1 R2 R3a b c d
4. MUL R2, R1, R2 3 b a R2 b,R1 c, R2 d
5. EXIT
6. ST a, R2 c a a, R2 b, R1 c d
2.ST a, RDer Inhalt von a im Adress-Deskriptor ist durch R zu ersetzen.
45
Seminar „Übersetzung von künstlichen Sprachen“ SS09
Globale Register
ProblemViele Hauptspeicherzugriffe
ST a, R1
LD R1, a
LösungST a, R1
LD R1, a
ProblemST a, R1
if … then goto …
LD R1, a
46
Seminar „Übersetzung von künstlichen Sprachen“ SS09
Globale Register
BeispielBetrachte Variable b
Lesezugriff LD R, a
47
Seminar „Übersetzung von künstlichen Sprachen“ SS09
Globale Register
BeispielBetrachte Variable b
Lesezugriff LD R, a
Schreibzugrifflive on exit
LösungRegisterinhalte überdauern Basisblöcke
Registerzuteilung?Bewertung:
48
Seminar „Übersetzung von künstlichen Sprachen“ SS09
Graphfärbung
ProblemRegister voll
Registerauswahl?
Lebensspanne für ideelle Register
Hier: Graph 2-fach färbbar
Kollisionen unvermeidbar Zwischenspeicherung
49
Seminar „Übersetzung von künstlichen Sprachen“ SS09
Instruktionsselektion
Idee: Alternative Instruktionskombinationen
+Ma
C1Ri
=
50
Seminar „Übersetzung von künstlichen Sprachen“ SS09
Optimale Code-Erzeugung
ZielCode mit minimaler Registeranzahl
BerücksichtigtRegisterzuteilung
Registerauswahl
Instruktionsanordnung
BasisDirected Acyclic Graph (DAG)
Procedere:1. Annotiere Ershov-Nummern an Graph-Knoten
2. Führe Generierungsalgorithmus aus
51
Seminar „Übersetzung von künstlichen Sprachen“ SS09
Optimale Code-Erzeugung
Ershov-Nummer für Knoten v:
val(v) =
a := b * cc := a * bd := a + de := c + d
52
Seminar „Übersetzung von künstlichen Sprachen“ SS09
Optimale Code-Erzeugung
Ershov-Nummer für Knoten v:
val(v) =
a := b * cc := a * bd := a + de := c + d
1 1
1
53
Seminar „Übersetzung von künstlichen Sprachen“ SS09
Optimale Code-Erzeugung
Ershov-Nummer für Knoten v:
val(v) =
a := b * cc := a * bd := a + de := c + d
1 1
12
54
Seminar „Übersetzung von künstlichen Sprachen“ SS09
Optimale Code-Erzeugung
Ershov-Nummer für Knoten v:
val(v) =
a := b * cc := a * bd := a + de := c + d
1 1
12
2 2
3
55
Seminar „Übersetzung von künstlichen Sprachen“ SS09
Optimale Code-Erzeugunggencode(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))
gencode-Algorithmus
fRegel Code v b vl vrk R1 R2 R3
a) k := label(v1) v11 v2 v3
3
b) R3:= gencode(v1, 1) v11 v2 v3
3
1.1 k := label(v2) v11 v2 v3
2
1.2 R3 := gencode(v3, 2) v11 v2 v3
2
3.1 k := label(v4) v32 v4 v5
2
3.2 R3 := gencode(v4, 2) v32 v4 v5
2
1.1 k := label(v6) v42 v6 v7
1
1.2 R3 := gencode(v7, 3) v73 - - 1
4.1 print(„LD“, R3, c) v73 - - 1 c0
1.3 R2 := gencode(v6, 2) v62 - - 1 c0
4.1 print(„LD“, R2, b) v62 - - 1 b0 c0
1.4 print(„MUL“, R3, R2, R3) v42 v6 v7
1 b0a
3.3 m := label(v5) // m := 1 v32 v4 v5
2 b0a
3.4 R2 := gencode(v5, 2) v32 v4 v5
2 b0a
4.1 print(„LD“, R2, d) v52 - - 1 d0
a
3.5 print(„ADD“, R3, R2, R3) v32 v4 v5
2 d0d
1.3 R2 := gencode(v2, 1) v11 v2 v3
2 d0d
2.1 k := label(v4) v21 v6 v4
2 d0d
2.2 R2 := gencode(v4, 2) v21 v6 v4
2 d0d
Beispiel
56
Seminar „Übersetzung von künstlichen Sprachen“ SS09
gencode
Optimale Code-Erzeugung
Regel Code v b vl vrk R1 R2 R3
LD R3, c
LD R2, b
1 1
12
2 2
3
57
Seminar „Übersetzung von künstlichen Sprachen“ SS09
Optimale Code-Erzeugung
MUL“, R3, R2, R3
1 1
12
2 2
3
58
Seminar „Übersetzung von künstlichen Sprachen“ SS09
Optimale Code-Erzeugung
1 1
12
2 2
3
1 1
12
2 2
3
59
Seminar „Übersetzung von künstlichen Sprachen“ SS09
…c := a * bd := a + de := c + da := b * cST a, R1
LD R1, ac := a * bd := a + de := c + d…
ProblemKomplexität
IdeeLokale Suche im “Gucklock”
BeispielViele HauptspeicherzugriffeST a, R1
LD R1, a
Peephole Optimization
60
Seminar „Übersetzung von künstlichen Sprachen“ SS09
1. Abgrenzung, Motivation, Einordnung 2. Grundlagen3. Code-Repräsentation * Basisblöcke * Flussgraphen4. Code-Erzeugung 5. Fazit und weiterführende Themen
61
Seminar „Übersetzung von künstlichen Sprachen“ SS09
Fazit
GelöstElementare Codeerzeugung
Erzeugung mit minimaler Registeranzahl
AnsätzeRegisterverwendung
Instruktionsselektion
Instruktionsanordnung
OffenErweiterte Heuristiken
Parallelisierung
Just-In-Time-Compilation
62
Seminar „Übersetzung von künstlichen Sprachen“ SS09
Diskussion
63
Seminar „Übersetzung von künstlichen Sprachen“ SS09
Code-Repräsentation
DAG-KonstruktionFür jeden Drei-Adress-Befehl der Form a := b OP c eines Basisblocks B:
1. 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.
2. Erzeuge für OP einen Knoten mit dem Operationssymbol und setze b als linken, c als rechten Kindknoten für OP.
3. Füge a als Label an OP an.
BACKUP
64
Seminar „Übersetzung von künstlichen Sprachen“ SS09
Elementare Code-Erzeugung
Eintragung in die Deskriptoren1. 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, RDer Inhalt von a im Adress-Deskriptor ist durch R zu ersetzen.
3. a := b OP c (mit den Registern Ra, Rb, Rc)3.1 Falls b bzw. c nicht im Register, führe LD Rb, b bzw. LD Rc, c aus.
3.2 Der Inhalt von Ra im Register-Deskriptor ist durch a zu ersetzen.
3.3 Der Inhalt von a im Adress-Deskriptor ist durch Ra zu ersetzen.
3.4 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.
BACKUP
65
Seminar „Übersetzung von künstlichen Sprachen“ SS09
Elementare Code-ErzeugungRegister-Deskriptor Adress-Deskriptor
¬lebendig
Blockende
lebendig Blockende
Zwischencode Zielcode Regel R1 R2 R3a b c d
1. a := b * c b c d
2. LD R1, b 1 b b,R1 c d
3. LD R2, c 1 b c b,R1 c,R2 d
4. MUL R2, R1, R2 3 b a R2 b,R1 c,R2 d
5. c := a + d
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
8. 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
BACKUP
66
Seminar „Übersetzung von künstlichen Sprachen“ SS09
Elementare Code-ErzeugungRegister-Deskriptor Adress-Deskriptor
¬lebendig
Blockende
lebendig Blockende
Zwischencode Zielcode Regel R1 R2 R3a b c d
10. ST d, R3 c a c,d R2 b c,R1 d,R3
11. MUL R1, R2, R1 3 c a c,d R2 b,R1 R1 R3
12. 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
15. c d
BACKUP
67
Seminar „Übersetzung von künstlichen Sprachen“ SS09
BACKUP Optimale CodeerzeugungFunktionsaufruf: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) then1.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) then2.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) then3.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 Blattknoten4.1. print(„LD“, Rb, name(v))
68
Seminar „Übersetzung von künstlichen Sprachen“ SS09
BACKUP Optimale CodeerzeugungRegel Code v b vl vr
k R1 R2 R3
a) k := label(v1) v11 v2 v3
3
b) R3:= gencode(v1, 1) v11 v2 v3
3
1.1 k := label(v2) v11 v2 v3
2
1.2 R3 := gencode(v3, 2) v11 v2 v3
2
3.1 k := label(v4) v32 v4 v5
2
3.2 R3 := gencode(v4, 2) v32 v4 v5
2
1.1 k := label(v6) v42 v6 v7
1
1.2 R3 := gencode(v7, 3) v73 - - 1
4.1 print(„LD“, R3, c) v73 - - 1 c0
1.3 R2 := gencode(v6, 2) v62 - - 1 c0
4.1 print(„LD“, R2, b) v62 - - 1 b0 c0
1.4 print(„MUL“, R3, R2, R3) v42 v6 v7
1 b0a
3.3 m := label(v5) // m := 1 v32 v4 v5
2 b0a
3.4 R2 := gencode(v5, 2) v32 v4 v5
2 b0a
4.1 print(„LD“, R2, d) v52 - - 1 d0
a
3.5 print(„ADD“, R3, R2, R3) v32 v4 v5
2 d0d
1.3 R2 := gencode(v2, 1) v11 v2 v3
2 d0d
2.1 k := label(v4) v21 v6 v4
2 d0d
2.2 R2 := gencode(v4, 2) v21 v6 v4
2 d0d
69
Seminar „Übersetzung von künstlichen Sprachen“ SS09
BACKUP Optimale Codeerzeugung
… … siehe Schritte 6-12 mit b=1 … … … … . … … …
2.3 m := label(v6) // m := 1 v21 v6 v4
2 b0a d
2.4 R1 := gencode(v6, 1) v21 v6 v4
2 b0a d
4.1 print(„LD“, R1, b) v61 - - 1 b0
a d
2.5 print(„MUL“, R2, R1, R2) v21 v6 v4
2 b0c d
1.4 print(„ADD“, R3, R2, R3) v11 v2 v3
2 b0c e