Struktura programu v době běhu Miroslav Beneš Dušan Kolář Struktura programu v době běhu Vztah mezi zdrojovým programem a činností přeloženého programu reprezentace dat správa paměti aktivace podprogramů parametry rekurze Struktura programu v době běhu 2 Systém řízení běhu programu Inicializace programu převzetí parametrů od systému alokace paměti pro data otevření standardních souborů (Pascal) Finalizace programu uzavření souborů uvolnění paměti předání stavového kódu Systém řízení běhu programu Zpracování chyb přerušení a výjimky (definované uživatelem, systémové a aplikační chyby,...) automatické kontroly (přetečení zásobníku, ukazatele, indexy, parametry,...) Dynamické přidělování paměti zásobník volná paměť Struktura programu v době běhu 3 Struktura programu v době běhu 4 1
Systém řízení běhu programu Komunikace s operačním systémem soubory, čas, Volací a návratové posloupnosti Podpora pro ladění programu Podprogramy Procedury jméno -> příkaz Funkce jméno -> výraz + parametrizace Struktura programu v době běhu 5 Struktura programu v době běhu 6 Příklad void main() { int fib(int n) { if( n < 2 ) return 1; return fib(n-2) + fib(n-1); } void print(int n) { for(int k = 1; k <= n; k++) printf( %d: %d, k, fib(k)); } int max; scanf( %d, &max); print(max); } Definice podprogramu Jméno Formální parametry (parametry) jméno typ způsob předávání Tělo Struktura programu v době běhu 7 Struktura programu v době běhu 8 2
Aktivace podprogramu Skutečné parametry (argumenty) Doba života aktivace od zavolání podprogramu po návrat zpět obvykle se nepřekrývají nebo jsou do sebe vnořeny (výjimka: vlákna, procesy) Rekurzivní podprogramy nová aktivace se může spustit před ukončením předcházející Příklad fib(4) fib(0) fib(1) fib(3) fib(1) fib(0) fib(1) Doba života aktivace Struktura programu v době běhu 9 Struktura programu v době běhu 10 Úroveň zanoření Příklad Statická úroveň zanoření je definována zdrojovým programem C, Java pouze jedna úroveň Dynamická úroveň zanoření je definována zanořováním aktivací kolik aktivací je současně rozpracováno fib(3) fib main 0 print 1 main print(5) fib(4) fib(5) 0 1 2 Statické zanoření Dynamické zanoření Úroveň zanoření je dána vzdáleností uzlu od kořene stomu fib(3) fib(0) fib(1) fib(1) 3 4 Struktura programu v době běhu 11 fib(0) fib(1) 5 Struktura programu v době běhu 12 3
Lokální data aktivace Aktivační záznam lokální proměnné (+dočasné proměnné) návratová adresa uschovaný obsah registrů Jazyky bez rekurzivních podprogramů aktivační záznamy mohou být alokovány staticky v době překladu (FORTRAN) Lokální data aktivace Jazyky s rekurzivními podprogramy zásobník aktivačních záznamů řídicí zásobník obsahuje všechny aktivační záznamy od kořene stromu aktivací až po aktivní uzel (podprogram) Struktura programu v době běhu 13 Struktura programu v době běhu 14 Příklad Struktura paměti fib(0) fib(4) print(5) Cílový program program, konstanty Statická data Řídicí zásobník aktivační záznamy (lokální proměnné) Volná paměť globální a statické proměnné dynamicky alokovaná paměť (hromada heap) main Struktura programu v době běhu 15 Struktura programu v době běhu 16 4
Schéma obsazení paměti Metody přidělování paměti heap řídicí zásobník statická neinicializovaná data inicializovaná Vytváří se během inicializace programu. Přiděleno pro běh programu Statické přidělování v době překladu Přidělování na zásobníku Přidělování z volné paměti (heap) cílový program Uloženo ve spustitelném souboru Struktura programu v době běhu 17 Struktura programu v době běhu 18 Přidělování paměti pro aktivační záznamy Statické přidělování paměti adresy všech proměnných jsou známy v době překladu lokální proměnné mohou přežít volání programu (viz static v C) počet a velikost prvků musíme znát v době překladu omezená možnost rekurze (sdílení proměnných) obsahy předchozích aktivačních záznamů můžeme odkládat na zásobník Přidělování paměti pro aktivační záznamy Přidělování na zásobníku vhodné pro jazyky s rekurzí paměť se přidělí v okamžiku volání uvolnění paměti proběhne při návratu relativní adresování proměnných offsety jsou známy v době překladu neznáme-li velikost parametrů -> deskriptor [adresa, délka] Příklad: řetězce, otevřená pole Struktura programu v době běhu 19 Struktura programu v době běhu 20 5
Přidělování paměti pro aktivační záznamy Přidělování z volné paměti lokální proměnné mohou přežít aktivaci podprogramu, resp. aktivace volaného podprogramu může přežít aktivaci volajícího podprogramu -> nelze použít zásobník alokace paměti při inicializaci aktivace, finalizace až ve chvíli, kdy není potřebná implementace paralelních jazyků Volací a návratové posloupnosti Definice adresy aktivačního záznamu Uložení stavu (registry, příznaky, návratová adresa) Inicializace lokálních dat Uložení výsledku Obnovení předchozího stavu Obnovení adresy aktivačního záznamu volajícího Návrat za místo volání Struktura programu v době běhu 21 Struktura programu v době běhu 22 Přístup k nelokálním datům Schéma - Příklad Lokální data uložena v aktivačních záznamech Globální data uložena staticky Lokální data staticky nadřazeného podprogramu přístupové ukazatele display dynamická vazba fib(4) print(5) table statická vazba fib(4) print(5) table 2 1 0 display Struktura programu v době běhu 23 přístupové ukazatele struktura display Struktura programu v době běhu 24 6
Předávání parametrů Hodnotou, výsledkem, hodnotou a výsledkem parametr je lokální proměnnou v těle podprogramu hodnota se kopíruje z (do) argumentu během volání (návratu) void p(int x) { { volání p(a) x = x+1 nezmění prom. a } {a=10} p(a) {a=10} Předávání parametrů Odkazem parametr se předá jako ukazatel na argument změna parametru se projeví ihned změnou argumentu ekvivalentní předávání adresy hodnotou jako v C/C++ void p(int& x); {a=10} p(a) {a=11} Jaký je rozdíl mezi předáváním odkazem a hodnotou/výsledkem? Struktura programu v době běhu 25 Struktura programu v době běhu 26 Předávání parametrů Jménem parametr se vyhodnocuje při každé referenci podobné jako makrodefinice procedure p(name x:integer) begin j:=1; x:=x+1 end; Algol 60 p(a[j]) j:=1 a[j]:=a[j]+1 Podprogramy jako parametry procedure A; var m:real; procedure B(procedure P); begin P end; m je viditelné procedure C; var x:real; procedure D; begin end; procedure E; begin B(D) end; begin E end; D může použít m, x begin C end; Struktura programu v době běhu 27 Struktura programu v době běhu 28 7
Podprogramy jako parametry Kromě adresy parametru se předává ukazatel na aktivační záznam volajícího deskriptor podprogramu = adresa + okolí Podobné předávání parametru jménem předává se adresa podprogramu, který vyhodnotí parametr Proměnné typu funkce/procedura problémy s platností deskriptoru Reprezentace datových typů Primitivní datové typy: char, int, double výčet, interval stejně jako int Pole A[0] A[1] A[2] Záznamy, struktury Struktura programu v době běhu 29 zarovnání Struktura programu v době běhu 30 Reprezentace datových typů Soubory Struktura (objekt) s těmito údaji: adresa a velikost vyrovnávací paměti současná pozice pro čtení/zápis vazba na OS - file handle příznaky - eoln, eof, Množina posloupnost bitů Reprezentace datových typů Ukazatel adresa reference Procedura/Funkce deskriptor [adresa, okolí] = closure Struktura programu v době běhu 31 Struktura programu v době běhu 32 8