+ All Categories
Home > Documents > Code-Erzeugung

Code-Erzeugung

Date post: 23-Feb-2016
Category:
Upload: aquila
View: 33 times
Download: 0 times
Share this document with a friend
Description:
Code-Erzeugung. Arne Kostulski ( [email protected] ). 1. Abgrenzung, Motivation, Einordnung 2. Grundlagen 3. Code-Repräsentation 4. Code-Erzeugung 5. Fazit und weiterführende Themen. - PowerPoint PPT Presentation
69
Seminar „Übersetzung von künstlichen Sprachen“ SS09 Code- Erzeugung Arne Kostulski ( [email protected] )
Transcript
Page 1: Code-Erzeugung

Seminar „Übersetzung von künstlichen Sprachen“ SS09

Code-ErzeugungArne Kostulski

( [email protected] )

Page 2: Code-Erzeugung

2

Seminar „Übersetzung von künstlichen Sprachen“ SS09

1. Abgrenzung, Motivation, Einordnung2. Grundlagen3. Code-Repräsentation4. Code-Erzeugung5. Fazit und weiterführende Themen

Page 3: Code-Erzeugung

3

Seminar „Übersetzung von künstlichen Sprachen“ SS09

1. Abgrenzung, Motivation, Einordnung2. Grundlagen3. Code-Repräsentation4. Code-Erzeugung5. Fazit und weiterführende Themen

Page 4: Code-Erzeugung

4

Seminar „Übersetzung von künstlichen Sprachen“ SS09

Abgrenzung und Motivation

Effizienz durch Automatisierung

Page 5: Code-Erzeugung

5

Seminar „Übersetzung von künstlichen Sprachen“ SS09

Einordnung innerhalb des Kompilierungsprozesses

Page 6: Code-Erzeugung

6

Seminar „Übersetzung von künstlichen Sprachen“ SS09

Einordnung innerhalb des Kompilierungsprozesses

Page 7: Code-Erzeugung

7

Seminar „Übersetzung von künstlichen Sprachen“ SS09

Einordnung innerhalb des Kompilierungsprozesses

1.

Page 8: Code-Erzeugung

8

Seminar „Übersetzung von künstlichen Sprachen“ SS09

Einordnung innerhalb des Kompilierungsprozesses

1.2.

3.

Page 9: Code-Erzeugung

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

Page 10: Code-Erzeugung

10

Seminar „Übersetzung von künstlichen Sprachen“ SS09

Zielgrößen

Semantische Korrektheit

LaufzeiteffizienzVirtuelle SpeichernutzungPhysische Speichernutzung

Kompilierzeit

Heuristiken für komplexe Optimierungsprobleme

konträr

Page 11: Code-Erzeugung

11

Seminar „Übersetzung von künstlichen Sprachen“ SS09

Speicherhierarchie

Page 12: Code-Erzeugung

12

Seminar „Übersetzung von künstlichen Sprachen“ SS09

Speicherhierarchie

Page 13: Code-Erzeugung

13

Seminar „Übersetzung von künstlichen Sprachen“ SS09

Registerverwendung

AufgabenRegisterzuteilungRegisterauswahl

ZielTotale Lade- und Speicherzeiten minimieren

Architekturparameter

Registeranzahl

Kernaufgabe

Registerverwendung

Page 14: Code-Erzeugung

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

Page 15: Code-Erzeugung

15

Seminar „Übersetzung von künstlichen Sprachen“ SS09

Architekturparameter

Anzahl der Prozessorkerne

Kernaufgabe

Instruktionsanordnung

Instruktionsanordnung

AufgabeBefehlsfolgen reorganisieren

ZieleCode-VereinfachungBessere RegisterausnutzungParallelisierung unabhängiger Befehle

Page 16: Code-Erzeugung

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

Page 17: Code-Erzeugung

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

Page 18: Code-Erzeugung

18

Seminar „Übersetzung von künstlichen Sprachen“ SS09

Abstrakte Zielmaschine

DefinitionZielspracheUniversalregister: R1, …,Rn

Administrative Register separatAdressierungen

Page 19: Code-Erzeugung

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

Page 20: Code-Erzeugung

20

Seminar „Übersetzung von künstlichen Sprachen“ SS09

Code-Repräsentation: Basisblöcke

Strukturierung des ZwischencodesKontrollflussVariablenverwendung

BasisblockMinimale Sequenz von InstruktionenBlockanfänge definiert durch:

a) Die erste Instruktion des Zwischencodes.b) Jede direkte Nachfolge-Instruktion eines Sprunges.c) Jede Zielinstruktion eines (bedingen oder unbedingten) Sprungbefehls.

Page 21: Code-Erzeugung

21

Seminar „Übersetzung von künstlichen Sprachen“ SS09

Code-Repräsentation: BasisblöckeBeispiel

a) Die erste Instruktion des Zwischencodes.

Page 22: Code-Erzeugung

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.

Page 23: Code-Erzeugung

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.

Page 24: Code-Erzeugung

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.

Page 25: Code-Erzeugung

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.

Page 26: Code-Erzeugung

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.

Page 27: Code-Erzeugung

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)

Page 28: Code-Erzeugung

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.

Page 29: Code-Erzeugung

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.

Page 30: Code-Erzeugung

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.

Page 31: Code-Erzeugung

31

Seminar „Übersetzung von künstlichen Sprachen“ SS09

Code-Repräsentation: Blockoptimierung mit DAG

Innendarstellung eines Blocksgerichteter, azyklischer Graph (DAG)

ZieleRegisterausnutzung verbessernCode-VereinfachungToten Code eliminieren

Elemente

Initiale Variable

Operation Label

Page 32: Code-Erzeugung

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

Page 33: Code-Erzeugung

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

Page 34: Code-Erzeugung

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

Page 35: Code-Erzeugung

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

Page 36: Code-Erzeugung

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.

Page 37: Code-Erzeugung

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

Page 38: Code-Erzeugung

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

Page 39: Code-Erzeugung

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 explizitkeine globalen Register

Variablen mit nächster Verwendung am Blockanfang zu ladenlive on exit-Variablen zu speichern

Page 40: Code-Erzeugung

40

Seminar „Übersetzung von künstlichen Sprachen“ SS09

Elementare Code-Erzeugung

Hilfsfunktion getReggetReg(B) mit Drei-Adress-Befehl BFür a := b OP c

Lade nötige VariablenFühre den Befehl OP Ra, Rb, Rc aus.

Fallunterscheidungen für Code-Erzeugung1. LD R, a2. ST a, R3. a := b OP c4. a := b

Page 41: Code-Erzeugung

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 R3 a b c d

Beispiel: a := b * c

Page 42: Code-Erzeugung

42

Seminar „Übersetzung von künstlichen Sprachen“ SS09

Elementare Code-ErzeugungRegister-

Deskriptor

Adress-Deskriptor

¬lebendig

Blockende

lebendig

Blockende

Zwischencode Zielcode Regel R1 R2 R3 a 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.

Page 43: Code-Erzeugung

43

Seminar „Übersetzung von künstlichen Sprachen“ SS09

Elementare Code-ErzeugungRegister-

Deskriptor

Adress-Deskriptor

¬lebendig

Blockende

lebendig

Blockende

Zwischencode Zielcode Regel R1 R2 R3 a 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.

Page 44: Code-Erzeugung

44

Seminar „Übersetzung von künstlichen Sprachen“ SS09

Elementare Code-Erzeugung

Register-

Deskriptor

Adress-Deskriptor

¬lebendig

Blockende

lebendig

Blockende

Zwischencode Zielcode Regel R1 R2 R3 a 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.

Page 45: Code-Erzeugung

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

Page 46: Code-Erzeugung

46

Seminar „Übersetzung von künstlichen Sprachen“ SS09

Globale Register

BeispielBetrachte Variable bLesezugriff

LD R, a

Page 47: Code-Erzeugung

47

Seminar „Übersetzung von künstlichen Sprachen“ SS09

Globale Register

BeispielBetrachte Variable bLesezugriff

LD R, aSchreibzugriff

live on exit

LösungRegisterinhalte überdauern Basisblöcke

Registerzuteilung?Bewertung:

Page 48: Code-Erzeugung

48

Seminar „Übersetzung von künstlichen Sprachen“ SS09

Graphfärbung

ProblemRegister vollRegisterauswahl?

Lebensspanne für ideelle Register

Hier: Graph 2-fach färbbarKollisionen unvermeidbar Zwischenspeicherung

Page 49: Code-Erzeugung

49

Seminar „Übersetzung von künstlichen Sprachen“ SS09

InstruktionsselektionIdee: Alternative Instruktionskombinationen

+Ma

C1Ri

=

Page 50: Code-Erzeugung

50

Seminar „Übersetzung von künstlichen Sprachen“ SS09

Optimale Code-Erzeugung

ZielCode mit minimaler RegisteranzahlBerücksichtigt

RegisterzuteilungRegisterauswahlInstruktionsanordnung

BasisDirected Acyclic Graph (DAG)

Procedere:1. Annotiere Ershov-Nummern an Graph-Knoten2. Führe Generierungsalgorithmus aus

Page 51: Code-Erzeugung

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

Page 52: Code-Erzeugung

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

Page 53: Code-Erzeugung

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

Page 54: Code-Erzeugung

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

Page 55: Code-Erzeugung

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) 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))

gencode-Algorithmus

fRegel Code v b vl vr k R1 R2 R3

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

         4.1 print(„LD“, R3, c) v7 3 - - 1 c0

      1.3 R2 := gencode(v6, 2) v6 2 - - 1 c0

         4.1 print(„LD“, R2, b) v6 2 - - 1 b0 c0

      1.4 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

      4.1 print(„LD“, R2, d) v5 2 - - 1 d0 a

   3.5 print(„ADD“, R3, R2, R3) v3 2 v4 v5 2 d0 d

1.3 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

Beispiel

Page 56: Code-Erzeugung

56

Seminar „Übersetzung von künstlichen Sprachen“ SS09

gencode

Optimale Code-Erzeugung

Regel Code v b vl vr k R1 R2 R3

LD R3, c

LD R2, b

1 1

12

2 2

3

Page 57: Code-Erzeugung

57

Seminar „Übersetzung von künstlichen Sprachen“ SS09

Optimale Code-Erzeugung

MUL“, R3, R2, R3 1 1

12

2 2

3

Page 58: Code-Erzeugung

58

Seminar „Übersetzung von künstlichen Sprachen“ SS09

Optimale Code-Erzeugung

1 1

12

2 2

3

1 1

12

2 2

3

Page 59: Code-Erzeugung

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

Page 60: Code-Erzeugung

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

Page 61: Code-Erzeugung

61

Seminar „Übersetzung von künstlichen Sprachen“ SS09

Fazit

GelöstElementare CodeerzeugungErzeugung mit minimaler Registeranzahl

AnsätzeRegisterverwendungInstruktionsselektionInstruktionsanordnung

OffenErweiterte HeuristikenParallelisierungJust-In-Time-Compilation

Page 62: Code-Erzeugung

62

Seminar „Übersetzung von künstlichen Sprachen“ SS09

Diskussion

Page 63: Code-Erzeugung

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

Page 64: Code-Erzeugung

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

Page 65: Code-Erzeugung

65

Seminar „Übersetzung von künstlichen Sprachen“ SS09

Elementare Code-ErzeugungRegister-Deskriptor Adress-Deskriptor

¬lebendig

Blockende

lebendig Blockende

Zwischencode Zielcode Regel R1 R2 R3 a 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

Page 66: Code-Erzeugung

66

Seminar „Übersetzung von künstlichen Sprachen“ SS09

Elementare Code-ErzeugungRegister-Deskriptor Adress-Deskriptor

¬lebendig

Blockende

lebendig Blockende

Zwischencode Zielcode Regel R1 R2 R3 a 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

Page 67: Code-Erzeugung

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))

Page 68: Code-Erzeugung

68

Seminar „Übersetzung von künstlichen Sprachen“ SS09

BACKUP Optimale CodeerzeugungRegel Code v b vl vr k R1 R2 R3

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

         4.1 print(„LD“, R3, c) v7 3 - - 1 c0

      1.3 R2 := gencode(v6, 2) v6 2 - - 1 c0

         4.1 print(„LD“, R2, b) v6 2 - - 1 b0 c0

      1.4 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

      4.1 print(„LD“, R2, d) v5 2 - - 1 d0 a

   3.5 print(„ADD“, R3, R2, R3) v3 2 v4 v5 2 d0 d

1.3 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

Page 69: Code-Erzeugung

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 v2 1 v6 v4 2 b0 a d

   2.4 R1 := gencode(v6, 1) v2 1 v6 v4 2 b0 a d

      4.1 print(„LD“, R1, b) v6 1 - - 1 b0 a d

   2.5 print(„MUL“, R2, R1, R2) v2 1 v6 v4 2 b0 c d

1.4 print(„ADD“, R3, R2, R3) v1 1 v2 v3 2 b0 c e


Recommended