Generování vnitřní reprezentace programu

46
Generování vnitřní reprezentace programu Miroslav Beneš Dušan Kolář

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

Transcript of Generování vnitřní reprezentace programu

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