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.