Code-Erzeugung

Werbung
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. a
2. c
3. b
4. 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
Zugehörige Unterlagen
Herunterladen