Seminar Übersetzung von künstlichen Sprachen SS09 Code-Erzeugung Arne Kostulski (...

Preview:

Citation preview

Seminar „Übersetzung von künstlichen Sprachen“ SS09

Code-ErzeugungArne Kostulski

( arne@kostulski.net )

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