Sunday, June 26, 2011

SW: Procedury a funkcie, blokova struktura a aktivacne zaznamy

Asi je jasne, ze rec bude o podprogramoch. Podporgram moze mat formu procedury, alebo funkcie. Procedura realizuje abstraktni prikaz, pricom funkcia vedie na abstraktnu operaciu, ktora vedie na hodnotu urciteho typu. To znamena, ze funkcia nam nieco vrati. Podprogramy mozu byt jednoduche alebo rekurzivne a otvorene alebo uzavrete. Otvorene su napriklad inline podprogramy v C++, ktorych volanie znamena kopirovanie kodu do volajcieho programu. Uzavrete programy maju svoj vlastny kodovy segment.

Kazdy podprogram ma referencne prostredie, ktore tvori mnozina mien, ktore sa v podprograme daju pouzit pre oznacenie datovych objektov a inych prvkov

  • lokalne 
  • nelokalne 
  • staticke 
  • dynamicke - v niektorych jazykoch sa meno najprv hlada lokalne, ak nie je najdene, tak sa pokracuje po call stacku vyssie. 
Programy maju aj svoju blokovu struktru, ktora sluzi k uvedeniu prikazov a deklaracii lokalnych datovych objektov. Blokova struktura moze byt tvorena
  • prikazom
  • telom podprogramu
A deli sa na deklaracnu a prikazovu cast. 

Bloky mozu byt do seba vnorovane ako prikazy alebo ako podprogramy. Vznika tak hierarchicka blokova struktura. Existuju pravidla vymedzujuce platnost deklaracii 
  • lokalne referencne prostredie, ktore je dane lokalnymi deklaraciami 
  • nelokalne referencne prostredie, ktore je odvodene od ref. prostr. do kotreho je blok vnoreny
Lokalna deklaracia mena zatieni nelokalnu deklaraciu mena. Blok, v ktorom je deklaracia lokalna sa nazyva deklaracnou oblastou a je mozne ju pouzit v jej rozsahu platnosti, cim moze byt cela deklaracna oblast, alebo len ta cast, ktora je vymedzena miestom deklaracie. Priamym menom je mozne deklaraciu oznacit v jej rozsahu priamej viditelnosti. 

Podprogramy maju svoje 
  • vstupne parametre 
  • vystupne parametre 
  • vstupno-vystupne parametre 
Parametre sa predavaju bud hodnotou, odkazom, alebo menom. Predavanie menom je uz dnes obsolete a predavanie odkazom je vlastne predavanie ukazatelom - ktory moze/nemusi byt skryty. Parametre predavane hodnotou oznacuju vlastne kopirovanie, kedy na vstupe paramter nahradime hodnotou a na vystupe vysledkom. 

Podprogramy mozme pretazovat a podprogramy mozu byt genericke - to znamena, ze mozme napisat kod pre vopred neurceny datovy typ, co je dobre pre usporu kodu a pre niektore standardne struktury. 

Ked sa podprogram prelozi, tak vznikne kodovy segment podprogramu. Z hlavneho programu volame vlastne zaciatok kodoveho segmentu podprogramu, ktory sa vykona. Navratova adresa do hlavneho programu a vsetky dolezite data (napr. hodnoty premennych) su ulozene na systemovy zasobnik. Otazka je, ze ako pridelit pamat - a to tak isto, ako sme sa ucili pri virtualnej pamati - staticky/dynamicky, teda pri preklade alebo run time. Lokalne datove objekty je mozne alokovat staticky a pri kazdom volani podprogramu sa do pamati dynamicky ulozia ich kopie. 

V pripade dynamickej alokacie pamate pouzivame aktivacne zaznamy. Kazdy aktivacny zaznam je urceny jednemu volaniu/aktivacii podprogramu. Je to usek pamate, ktory obsahuje skutocne parametre, navratovu adresu, lokalne premenne a konstanty a pripadne dalsie systemove informacie. Aktivacny zaznam sa vytvori na vrchole zasobnika na zaciatku aktivacie podprogramu a po jeho dokonceni sa zo zasobniku odstrani. Zasobnik obsahuje aktivacny zaznam vsetkych rozpracovanych podprogramov, ale priamo pristupny je len ten na vrchole. 

Zasobniky pouzite pri volani podprogramu mozu byt roznych typov
  • zasobnik s dynamickym spojom
    •  ma pridany pointer, ktory umoznuje jednoduchsiu adresaciu premennych a lokalnych parametrov. Takyto zasobnik je dolezity, pokial jazyk podporuje dynamicke typy, pretoze ich velkost nie je znama pri preklade. 
  • zasobnik so statickym spojom 
    • sa pouziva pre pristup k premennym, ktore su umiestnene v aktivacnych zaznamoch staticky nadradenych programov. Je realizovany pomocou spojoveho zoznamu.