Пређи на садржај

Dostupnost izraza

С Википедије, слободне енциклопедије

Izraz je dostupan na čvoru grafičke reprezentacije programa ako je njegova vrednost prethodno izračunata a zatim nije poništena ( nijedan od operanada izraza nije modifikovan ) duž svake putanje do čvora .

Programi mogu sadržati kod čiji je rezultat potreban, ali u kome je određeno računanje zapravo suvišno ponavljanje ranijeg računanja unutar istog programa. Koncept dostupnosti izraza ( eng. expression availability) je koristan u rešavanju ovakve situacije.

Svaki program sadrži konačan broj izraza, tako da možemo govoriti o skupu svih izraza jednog programa.

int z=x*y;
print s+t;
int w= u/v;

Skup izraza gore navedenog programa je { }.

Dostupnost je data-flow svojstvo izraza. Pri svakoj instrukciji, svaki izraz u programu je ili dostupan ili nedostupan. Zbog toga, obično razmatramo dostupnost iz perspektive instrukcije: svaka instrukcija tj. čvor graficke reprezentacije programa (eng. node of the flowgraph) ima pridružen skup dostupnih izraza. Tako je skup dostunih izraza u čvoru 3 gore navedenog koda {}


Mi želimo da znamo koji izrazi su definitivno dostupni (tj.već izračunati) za određenu instrukciju. Razmotrićemo razliku između semantičke i sintaksne dostupnsti izraza, i detalja aproksimacije koje nastojimo da otkrijemo analizom.


Izraz je semantički dostupan na čvoru graficke reprezentacije programa ako se njegova vrednost izracuna (a zatim ne poništava) duž svake izvršne sekvence programa koja se završava na .

int x= y*z;
.
.
.
return y*z; //y*z AVAILABLE
int x=y*z;
.
.
.
y=a+b;
.
.
.
return y*z; //y*z UNAVAILABLE

Izraz je sintaksno dostupan na čvoru ako se njegova vrednost izračunava (a zatim ne ponistava) duz svakog puta od ulaska u grafičku reprezentaciju programa pa sve do čvora . Semantička dostupnost se bavi izvršnim ponašanjem programa, dok se sintaksna dostupnost bavi sintaksnom strukturom programa.

if ((x+1)*(x+1) == y) {
  s = x + y;
}
if (x*x + 2*x + 1 != y) {
  t = x + y;
}
return x+y; // x+y AVAILABLE

Gledano semantički, jedan od gore navedenih uslova će biti tačan, pa na svakoj izvršnoj putanji grafičke reprezentacije gore navedenog koda,  se izračunava dva puta. Ponovno računanje je suvišno.


Analiza dostupnosti izraza

[уреди | уреди извор]

Prvo ćemo razmatrati više intuituvnu prezentaciju, a onda ćemo je malo izmeniti do ekvilalentne standardne prezentacije analize dostupnosti izraza(eng. Availabe expression analisys ).


Dostupnost izraza prolongira kroz program. Svaka instrukcija utiče na skup dostupnih izraza. Instrukcija čini izraz dostupnim kada generiše (izračunava) njegovu trenutnu vrednost.

int a,b;
// {} skup dostupnih izraza je prazan
print a*b; // generate a*b
// {a*b}
c = d+1; // generate d+1
// {a*b,d+1}
e=f/g; // generate e/g
//{a*b,d+1,f/g}

Instrukcija čini izraz nedostupnim kada ubija (poništava) njegovu trenutnu vrednost.

//pretpostavimo da je do ovog dela koda skup dostupnih izraza {a*b,c+1,d/e,d-1}
a=7; // kill a*b
//{c+1,d/e,d-1}
c=11; //kill c+1
//{d/e,d-1}
d=13; //kill d/e,d-1
//{}

Dalje ćemo posmatrati funkcije i koje daju redom skupove izraza generisanih i poništenih instrukcijom na čvoru . Redefinisanje varijable ubija sve izraze u programu koji sadrže pojave .

U nastavku, je skup izraza koji u programu sadrže pojave varijable .

Kako dostupnost teče dalje kroz programm mimo instrukcije, mi želimo da modifikujemo  skup dostupnih izraza dodavanjem bilo kojih izraza koje ta instrukcija generiše (oni postaju dostupni) i uklanjanjem svih koje ubija (oni postaju nedostupni).

U slučaju da instrukcija i generiše i ubija izraze, mi moramo ukolniti ubijene izraze nakon dodavanja generisanih.


,

Za skupove koji su dostupni neposredno pre i neposredno posle čvora , sledeća jednačina mora da važi:

Primer:

Kada čvor ima jednog prethodnika , očekivano će važiti . A kada ima nekoliko prethodnika, izrazi dostupni na ulazu tog cvora  su  upravo oni izrazi dostupni na izlazu svih njegovih prethodnika.

Data-flow jednačine

[уреди | уреди извор]

Ovo su data-flow jednačine za analizu dostupnog izraza, i one nam govore sve što treba da znamo o tome kako širiti(popagirati) informacije o raspolozivosti kroz program.

,

gde je

Kombinacijom ove dve jednakosti dolazimo do uopštene jednačine dostupnosti (eng. availability equation).

Funkcije i jednačine koje su predstavljene do sada su tačne, i njihove definicije su poprilično intuitivne. Ipak, mozda ćemo želeti da data-flow jednačine budu u obliku koji se bliži onom kod LVA (eng. Live variable analysis) jednačina, i tako lakše uočiti sličnost između ove dve analize. Nekoliko modifikacija je neophodno da bi se ovo postiglo.

Najpre ćemo uvesti sledeće dve definicije:

  • Čvor genereiše izraz ako mora da izračuna vrednost i zatim  ne redifinise bilo koju varijablu koja se javlja u .
  • Cvor ubija izraz ako može redefinisati neke od varijabli koje se javljaju u i zatim ne reizračunava vrednost .

Budući da nove definicije uzimaju u obzir koje sve izraze čvor generiše (iskljucujuči one koji su generisani samo da bi odmah potom bili ubijeni), mi možemo propagirati informacije dostupnosti kroz čvor tako što ćemo ukolniti ubijene izraze pre dodavanja generisanih, bas kao i u LVA (eng. Live variable analysis).

Iz ove nove jednačine za mošemo izvesti finalnu data-flow jednačinu:

Koristićemo niz da čuvamo dostupne izraze za svaki čvor programa. Inicijalizujemo tako da svaki čvor ima sve izraze dostupne. Ponovo primenjujemo data-flow jednačinu na svakom čvoru dok ne prestane da se menja.

Pretpostavimo da grafička reprepentacija programa ima samo jedan ulazni čvor ( prvi čvor u nizu ). Onda možemo inicijalizovati na prazan skup, i neće biti potrebe da ponovo izračunavamo dostupnost na prvom čvoru tokom svake iteracije.

Ovaj algoritam će se garantovano prekinuti budući da je efekat jednog ponavljanja monoton (samo uklanja izraze iz skupa dostupnih izraza) i prazan skup dostupnih izraza ne moze biti manje kardinalnosti. Svako rešenje data-flow jednačine je bezbedno, ali ovaj algoritam garantovano daje najveće (i stoga najpreciznije) rešenje.

Napomena o implementaciji:

  • Ako uredimo naš program tako da se svaki zadatak dodeljuje posebnoj varijabli, možemo izbrojati ove privremene varijable i izraze čije su vrednosti njima dodeljene. Ako program ima takvih izraza, možemo implementirati svaki element niza kao -bitnu vrednost, gde -ti bit predstavlja dostupnost izraza broja m.
  • Opet, možemo da čuvamo dostupnost jednom po osnovnom bloku (eng. basic block) i reizračunati unutar bloka kada je potrebno. Ako je dato da svaki osnovni blok sadrži instrukcije

  • Dostupnost izraza je data-flow svojstvo
  • Analiza dostupnih izraza(AVAIL) je napredna data-flow analiza za određivanje dostupnosti izraza
  • AVAIL se može izraziti kao par komplementarnih data-flow jendnačina, koje se mogu kombinovati
  • Jednostavan itertivan algoritam može se koristiti za pronalaženje najvećeg skupa resenja za AVAIL data-flow jednačinu