Vlastnosti jazykových konstrukcí pro statický a pro dynamický způsob přidělování paměti
Thursday, May 30, 2013
8:43 AM
Přímo podle Ježka:
Pro jazykovou konstrukci, která umožňuje jen statické přidělování, je možné řešit alokovanou paměť už během překladu. U těch dynamických není předem známo, kolik paměti je třeba vyhradit, je nutné to provádět až během vykonávání programu.
Jsou rekurze (nevíme předem, kolikrát se zanoříme)
Dynamické proměnné (new)
Dynamické typy (pole, jejichž velikost je daná výrazem)
Řeknu si, že chci udělat vlastní programovací jazyk a chci vědět, jak ho mám navrhnout - je třeba si uvědomit, co od něj budu potřebovat. Pokud potřebuju např. rekurzi, musím ho navrhnout tak, aby podporoval dynamické typy.
U statického přidělování paměti si mohu dovolit dělat statické proměnné, metody bez rekurze apod.
U dynamického pak vše ostatní jako rekurzi apod.
[link] !!!
Důležitá hlediska jazykových konstrukcí:
Dynamické typy
Dynamické proměnné
Rekurze
Konstrukce pro paralelní výpočty
Podstatný je rovněž způsob:
Omezování existence entit v programu
Předávání parametrů funkce (hodnotou, odkazem)
Určování přístupu k nelokálním entitám
na základě statického vnořování rozsahových jednotek,
na základě dynamického vnoření rozsahových jednotek.
Statické přidělování paměti:
Globální proměnné
Statické proměnné
Proměnné jazyka bez rekurze (i s blokovou strukturou) (možno staticky na zásobníku)
Dynamické přidělování paměti (na hromadě):
Dynamické typy a proměnné (překladač neví v době překladu kolik jich bude potřebovat)
Proměnné předávané odkazem
Pointery v C pro dynamicky alokované proměnné
Předávání parametrů podprogramům
hodnotou (C, C++, Java, C#) formální parametr podprogramu je lokální proměnnou (tohoto podprogramu) do níž se předá hodnota (proměnná je zkopírována do zásobníku podprogramu)
odkazem (C, C++ je-li parametrem pointer, objektové parametry Javy, C# parametry označené ref) předá informaci o umístění skutečného parametru (předána adresa na proměnnou) - u Javy se všechno předává prostřednictvím hodnoty (pass-by-value) tj. v případě instancí tříd (objektů) dochází k předávání adresy objektu ???
výsledkem - formální parametr je lokální proměnnou z níž se předá hodnota do skutečného parametru před návratem z podprogramu
Dynamické přidělování v zásobníku
Aktivační záznam obsahuje místo pro:
Lokální proměnné
Parametry
Návratovou adresu
Funkční hodnotu (je-li podpr. funkcí)
Pomocné proměnné (pro mezivýsledky)
Další informace potřebné k uspořádání aktivačních záznamů
Statická typová kontrola – referenční prostředí podprogramů je definováno staticky, tj. při překladu zdrojového programu. Pro každou deklaraci je staticky vymezen rozsah platnosti, tj. část zdrojového kódu, ve kterém lze deklarované jméno použít. V podprogramu pak kromě lokálních jmen lze použít ta nelokání jména, do jejichž rozsahu platnosti je definice podprogramu vnořena. Statické referenční prostředí je často založeno na blokové struktuře programu.
Statické referenční prostředí je při překladu reprezentováno tabulkou symbolů. Překlad deklarace znamená rozšíření tabulky symbolů o nový záznam, při dosažení místa konce platnosti deklarace se záznam odstraní nebo skryje. Při překladu těla podprogramu překladač na základě tabulky symbolů pro každé jméno rozhodne, zda je či není v daném místě použitelné a jaký datový objekt (nebo jiný programový prvek) označuje. Tím se dosáhne vyšší bezpečnosti programu (nepoužitelné jméno je odhaleno již při překladu) i vyšší efektivity cílového programu. 
Dynamická typová kontrola – např. Lisp, referenční prostředí podprogramů je definováno dynamicky. Dynamicky definované referenční prostředí se nevytváří ani nekontroluje při překladu, ale až při provádění programu. Při spuštění programu se vytvoří referenční prostředí tvořené vazbami jmen definovaných jazykem. Při každém vstupu do podprogramu se referenční prostředí rozšíří o vazby lokálních jmen podprogramu, při návratu z podprogramu se jeho lokální prostředí odstraní. Při provádění příkazů se pro každé jméno hledá jeho vazba.
Dyn. Definované ref. Prostředí snižuje bezpečnost programu i jeho efektivitu (význam jména se hledá při provádění programu). Jeho výhodou je jednoduchá sémantika – nenajde-li se jméno v lokálním prostředí podprogramu A, hledá se v lokálním prostředí podprogramu B, ze kterého byl podprogram A vyvolán, případně v lokálním prostředí podprogramu C, z čehož byl vyvolán podprogram B apod. 
From <[link]> 