+ All Categories
Home > Documents > Generování vnitřní reprezentace programu

Generování vnitřní reprezentace programu

Date post: 24-Jan-2016
Category:
Upload: clodia
View: 40 times
Download: 0 times
Share this document with a friend
Description:
Generování vnitřní reprezentace programu. Miroslav Beneš Dušan Kolář. Možnosti překladu. Interpre tace Okamžité provádění programu Překlad do instrukcí procesoru Závislost na konkrétním typu procesoru Překlad do vnitřní reprezentace - PowerPoint PPT Presentation
46
Generování vnitřní reprezentace programu Miroslav Beneš Dušan Kolář
Transcript
Page 1: Generování vnitřní reprezentace programu

Generování vnitřní reprezentace programu

Miroslav Beneš

Dušan Kolář

Page 2: Generování vnitřní reprezentace programu

Vnitřní reprezentace programu 2

Možnosti překladu Interpretace

Okamžité provádění programu Překlad do instrukcí procesoru

Závislost na konkrétním typu procesoru Překlad do vnitřní reprezentace

Následuje interpretace nebo překlad do instrukcí procesoru

Page 3: Generování vnitřní reprezentace programu

Vnitřní reprezentace programu 3

Výhody překladu do vnitřní reprezentace

Strukturalizace překladače Mnohem jednodušší přenos na více typů

procesorů Možnost optimalizace na úrovni vnitřní

reprezentace strojově nezávislé metody

Page 4: Generování vnitřní reprezentace programu

Vnitřní reprezentace programu 4

Formáty vnitřní reprezentace programu

Grafová reprezentace Zásobníkový kód Tříadresový kód

Page 5: Generování vnitřní reprezentace programu

Vnitřní reprezentace programu 5

Grafová reprezentace Abstraktní syntaktický strom (AST)

a:=b*(-c)+b*(-c)

assign

bb

+

*

c c

a

*

uminusuminus

Uzly - operátory

Listy - operandy

Page 6: Generování vnitřní reprezentace programu

Vnitřní reprezentace programu 6

Grafová reprezentace

DAG (Directed Acyclic Graph) a:=b*(-c)+b*(-c)

assign

b

+

*

c

a

uminus

Společné podvýrazy jako sdílené uzly

Používá se pro optimalizaci

Page 7: Generování vnitřní reprezentace programu

Vnitřní reprezentace programu 7

Příklad

var n, f: Integer;

begin read n; f:=1; while n>1 do begin f:=f*n; n:=n-1 end; write f,”\n”end.

Page 8: Generování vnitřní reprezentace programu

Vnitřní reprezentace programu 8

Grafová reprezentace

read

seq

:=

n 1f >

while

1n

write

seq \nf

:= :=

f *

f n

n -

n 1

Page 9: Generování vnitřní reprezentace programu

Vnitřní reprezentace programu 9

Zásobníkový kód

Postfixová notacea b c uminus * b c uminus * + assign výsledek průchodu AST nebo DAG typu post-

order uzel následuje bezprostředně za svými

následníky žádný formální rozdíl mezi operandy a

operátory

Page 10: Generování vnitřní reprezentace programu

Vnitřní reprezentace programu 10

Zásobníkový kód

Virtuální zásobníkový procesorload b (b) vrchol zás. vpravoload c (b) (c)inv (b) (-c)mul (b*-c)load b (b*-c) (b)load c (b*-c) (b) (c)inv (b*-c) (b) (-c)mul (b*-c) (b*-c)add (b*-c+b*-c)store a

Page 11: Generování vnitřní reprezentace programu

Vnitřní reprezentace programu 11

Zásobníkový kód

Virtuální zásobníkový procesor virtuální počítač s pamětí a zásobníkem P-kód (Wirth)

přenositelný mezikód pro Pascal specializované procesory

Java Virtual Machine MSIL – Microsoft Intermediate Language

(.NET – C#, C++, VB, …)

Page 12: Generování vnitřní reprezentace programu

Vnitřní reprezentace programu 12

Příklad - JVM

public class Priklad {

public static void main(String[] args) {

int x = 1;

System.out.println(x + 2);

}

}

Page 13: Generování vnitřní reprezentace programu

Vnitřní reprezentace programu 13

Příklad - JVM

0: iconst_1 1: istore_1 2: getstatic #2; //java/lang/System.out

5: iload_1 6: iconst_2 7: iadd 8: invokevirtual #3; //java/io/PrintStream.println11: return

Page 14: Generování vnitřní reprezentace programu

Vnitřní reprezentace programu 14

Příklad - MSIL

using System;

public class Priklad {

public static void Main(string[] args) {

int x = 1;

Console.WriteLine(x + 2);

}

}

Page 15: Generování vnitřní reprezentace programu

Vnitřní reprezentace programu 15

Příklad - MSIL.method public static void Main(string[] args) { .entrypoint .maxstack 2 .locals init (int32 V_0) ldc.i4.1 stloc.0 ldloc.0 ldc.i4.2 add call void System.Console::WriteLine(int32) ret}

Page 16: Generování vnitřní reprezentace programu

Vnitřní reprezentace programu 16

Tříadresový kód

x := y op z x - (dočasná) proměnná y, z - (dočasné) proměnné, konstanty

Operandy nemohou být výrazy rozklad na primitivní výrazy s dočasnými

proměnnými Explicitní odkazy na operandy

možnost přesouvání příkazů při optimalizaci

Page 17: Generování vnitřní reprezentace programu

Vnitřní reprezentace programu 17

Příklad 1

a:=b*(-c)+b*(-c)

t1 := -c t1 := -c t2 := b*t1 t2 := b*t1 t3 := -c t5 := t2+t2 t4 := b*t3 a := t5 t5 := t2+t4 a := t5 Strom DAG

dočasné proměnné = vnitřní uzly stromu (DAG)

Page 18: Generování vnitřní reprezentace programu

Vnitřní reprezentace programu 18

Příklad 2

var n,f:integer;begin 1: read n read n; 2: f := 1 f:=1; 3: if n<=1 goto 7 while n>1 do begin 4: f := f * n f:=f*n; n:=n-1 5: n := n - 1 end; 6: goto 3 write f,"\n" 7: write f end. 8: write "\n"

Page 19: Generování vnitřní reprezentace programu

Vnitřní reprezentace programu 19

Příkazy tříadresového kódu x := y op z op – binární operátor x := op y op - unární operátor

(-, not, typová konverze, …)

x := y goto L nepodmíněný skok if x relop y goto L podmíněný skok

Page 20: Generování vnitřní reprezentace programu

Vnitřní reprezentace programu 20

Příkazy tříadresového kódu

param x1

… param xn volání podprogramucall p,n p(x1,…,xn)

return y návrat z podprogramu

Page 21: Generování vnitřní reprezentace programu

Vnitřní reprezentace programu 21

Příkazy tříadresového kódu x := y[j]

x[j] := y indexování

x := &y reference (získání adresy)

x := *y*x := y dereference ukazatele

Page 22: Generování vnitřní reprezentace programu

Vnitřní reprezentace programu 22

Čtveřice

op arg1 arg2 výsledek

(0) uminus c t1(1) * b t1 t2(2) uminus c t3(3) * b t3 t4(4) + t2 t4 t5(5) := t5 a

a:=b*(-c)+b*(-c)

Page 23: Generování vnitřní reprezentace programu

Vnitřní reprezentace programu 23

Příklad – překlad výrazů

Atributy id.name – jméno identifikátoru E.place – jméno proměnné obsahující hodnotu E

Pomocné funkce newtemp – vytvoří novou proměnnou lookup – vyhledá proměnnou v tabulce emit – generuje instrukci error – hlášení chyby

Page 24: Generování vnitřní reprezentace programu

Vnitřní reprezentace programu 24

Příklad – překlad výrazů

S -> id := E { p = lookup(id.name); if( p != null ) emit(p,‘:=’,E.place); else error(); }

E -> E1 + E2 { E.place = newtemp(); emit(E.place,‘:=’,

E1.place,’+’,E2.place);}

E -> E1 * E2 { E.place := newtemp(); emit(E.place,‘:=’,

E1.place,’*’,E2.place);}

Page 25: Generování vnitřní reprezentace programu

Vnitřní reprezentace programu 25

Příklad – překlad výrazů

E -> - E1 { E.place = newtemp(); emit(E.place,‘:=’,

‘uminus’,E1.place);}

E -> (E1) { E.place = E1.place; }

E -> id { p := lookup(id.name);

if( p != null ) E.place := p; else error(); }

Page 26: Generování vnitřní reprezentace programu

Vnitřní reprezentace programu 26

array [low..high] of T

prvek a[j] leží na adrese:

base+(j-low)*w = j*w+(base-low*w) =konstanta!

Přístup k prvkům pole

low low+1 highw=sizeof(T)

base

Page 27: Generování vnitřní reprezentace programu

Vnitřní reprezentace programu 27

Přístup k prvkům pole

a[j1,j2] base+((j1-low1)*n2+j2-low2)*w =>

((j1*n2)+j2)*w+(base-((low1*n2)+low2)*w)=konstanta!

base

low1

low2

high1

n2 := high2-low2+1

high2

Page 28: Generování vnitřní reprezentace programu

Vnitřní reprezentace programu 28

Přístup k prvkům pole

Obecně: a[j1, … , jk] addresa:

(…(j1n2+j2)n3+j3)…)nk+jk)*w + base-(…(low1n2+low2)n3+low3)…)nk+lowk)*w

mapovací funkce nj = highj-lowj+1

Page 29: Generování vnitřní reprezentace programu

Vnitřní reprezentace programu 29

Překlad výrazů s indexy

S -> L := EE -> E1 + E2 | (E1) | LL -> Elst ] | idElst -> Elst1 , E | id [ E

Page 30: Generování vnitřní reprezentace programu

Vnitřní reprezentace programu 30

Překlad výrazů s indexy

L.offsetindex (null=bez indexu)

L.placeproměnná

E.placeproměnná s hodnotou

id.place

Elst.array popis pole

Elst.ndim počet rozměrů

Elst.place proměnná obsahující

index

Page 31: Generování vnitřní reprezentace programu

Vnitřní reprezentace programu 31

Překlad výrazů s indexy

const(Elst.array) konstantní část mapovací funkce

width(Elst.array) velikost prvku pole

limit(Elst.array,m) počet prvků v m-té dimenzi

Page 32: Generování vnitřní reprezentace programu

Vnitřní reprezentace programu 32

Překlad výrazů s indexy

S -> L := E{ if( L.offset==null ) /* bez indexu */ emit(L.place,‘:=’,E.place); else emit(L.place,‘[’,L.offset,‘]’, ‘:=’,E.place); }

E -> E1 + E2

{ E.place = newtemp(); emit(E.place,‘:=’,E1.place, ‘+’,E2.place); }

Page 33: Generování vnitřní reprezentace programu

Vnitřní reprezentace programu 33

Překlad výrazů s indexy

E -> (E1){ E.place = E1.place }

E -> L{ if( L.offset==null ) /* bez indexu */ E.place = L.place; else { E.place = newtemp(); emit(E.place,‘:=’,L.place, ‘[’,L.offset,‘]’) }}

Page 34: Generování vnitřní reprezentace programu

Vnitřní reprezentace programu 34

Překlad výrazů s indexy

L -> Elst ]{ L.place = newtemp(); L.offset = newtemp(); emit(L.place,‘:=’,const(Elst.array)); emit(L.offset,‘:=’,Elst.place,‘*’, width(Elst.array)); }

L -> id{ L.place = id.place; L.offset = null; }

Page 35: Generování vnitřní reprezentace programu

Vnitřní reprezentace programu 35

Překlad výrazů s indexy

Elst -> Elst1 , E{ t = newtemp(); m = Elst1.ndim+1; emit(t,‘:=’,Elst1.place,‘*’, limit(Elst1.array,m)); emit(t,‘:=’,t,‘+’,E.place); Elst.array = Elst1.array; Elst.place = t; Elst.ndim = m;}

Page 36: Generování vnitřní reprezentace programu

Vnitřní reprezentace programu 36

Překlad výrazů s indexy

Elst -> id [ E{ Elst.array = id.place; Elst.place = E.place; Elst.ndim = 1;}

Page 37: Generování vnitřní reprezentace programu

Vnitřní reprezentace programu 37

Příklad

A: array [1..10,1..20] of integer; sizeof(integer) = 4 n1 = 10

n2 = 20w = 4

x := A[y, z]

Page 38: Generování vnitřní reprezentace programu

Vnitřní reprezentace programu 38

Příklad

x := A[y, z]

t1 := y*20t2 := t1+zt3 := c /* konstanta c = &A-84 */t4 := 4*t2 (1*20+1)*4=84t5 := t3[t4]x := t5

Page 39: Generování vnitřní reprezentace programu

Vnitřní reprezentace programu 39

Překlad logických výrazů E -> E or E

| E and E | (E) | not E | id relop id | true | false

Page 40: Generování vnitřní reprezentace programu

Vnitřní reprezentace programu 40

Překlad logických výrazů Reprezentace logických hodnot celými čísly:

true=1, false=0

a or b and not c x<y1: t1 := not c 1: if x<y goto 42: t2 := b and t1 2: t1 := 03: t3 := a or t2 3: goto 54: … 4: t1 := 1

5: …

Page 41: Generování vnitřní reprezentace programu

Vnitřní reprezentace programu 41

Překlad logických výrazů

Zkrácené vyhodnocení reprezentace logických hodnot tokem řízení

(pozicí v programu)

a<b or c<d and e<fif a<b goto Ltruegoto L1

L1: if c<d goto L2goto Lfalse

L2: if e<f goto Ltruegoto Lfalse

Page 42: Generování vnitřní reprezentace programu

Vnitřní reprezentace programu 42

Překlad řídicích příkazů

Instrukce zásobníkového kódu: LBL L – definice návěští L pro skok JMP L – nepodmíněný skok na návěští L FJP L - podmíněný skok na návěští L, pokud

je na vrcholu zásobníku False

výstupní symboly překladové gramatiky - {LBL} Pomocné funkce:

getLbl() – vygeneruje nové číslo návěští

zanoření příkazů – nelze použít konstanty!

Page 43: Generování vnitřní reprezentace programu

Vnitřní reprezentace programu 43

Překlad příkazu IF

S -> if ( E ) S <E> FJP L1 <S> LBL L1

S -> if ( E ) {FJP} S {LBL} FJP.l = LBL.l = getLbl();

E

S

FJP L1

LBL L1

Page 44: Generování vnitřní reprezentace programu

Vnitřní reprezentace programu 44

Překlad příkazu IF

S -> if ( E ) S1 else S2

S -> X {LBL}

LBL.l = X.l

S -> X {JMP} {LBL1} else S {LBL2} JMP.l = LBL2.l = getLbl();LBL1.l = X.l

X -> if (E) {FJP} S

FJP.l = getLbl()

E

FJP L1

S1

S1

JMP L2L1:

L2:

Page 45: Generování vnitřní reprezentace programu

Vnitřní reprezentace programu 45

Překlad příkazu WHILE

S -> while ( E ) S LBL L1 <E> FJP L2 <S> JMP L1 LBL L2

E

S

L1:

L2:

FJP L2

JMP L1

Page 46: Generování vnitřní reprezentace programu

Vnitřní reprezentace programu 46

Překlad příkazu WHILE

S -> {LBL1} while ( E ) {FJP2} S {JMP1} {LBL2}LBL1.l = JMP1.l = getLbl();LBL2.l = FJP.l = getLbl();

S -> break/continue ; S.blab – dědičný atribut, návěští pro break S.clab – dědičný atribut, návěští pro continue while musí zajistit předání návěští speciální hodnota návěští – poznáme, že nejsme uvnitř

cyklu, break/continue může hlásit chybu


Recommended