«« ( Date ) »» // «« ( Thread ) »» // ri4pp - 2006

Re: aktivacioni zapisi

by Dragan Radenkovic
četvrtak, 06. jul 2006 - 16:39.



Jovan Popovic <jovan@etf.bg.ac.yu> wrote:
>
>
> Ivana Jeremic wrote: Imam par pitanja, pa bih
> zamolila da mi odgovorite ili to da ucini asistent:
>
> 1. Kada imamo dinamicko okruzenje sa plitkim pristupom da li se menja
> njihova vrednost u statickoj mem (ako nesto radimo sa njima u f-ji gde
> je to nelokalna prom)? (nadam se ste razumeli pitanje :)
> Sa predavanja: Kod plitkog pristupa ideja je da za svaku promenljivu
> odvojimo polje u aktivacionom zapisu u kome je ona deklarisana (kao i u
> prethodnim sluèajevima). Dodatno odvajamo po jednu memorijsku lokaciju u
> statièkoj memoriji koja èuva vrednost promenljive, za svaku promenljivu.
> Kod plitkog pristupa, svaki pristup odgovarajuæoj promenljivoj
> iskljuèivo ide u tu statièku memoriju.
>
> Tvoje pitanje bi verovatno trebalo da glasi: da li se originalna
> vrednost nelokalne promenljive menja, kada joj se pristupa iz neke od
> ugnjezdenih procedura (a da ime te nelokalne promenjive nije
> preklopljeno nekom lokalnom promenljivom).
> Odgovor: Nisam 100% siguran, al mislim da se vrednost originalne
> promenljive menja kada joj se dodeljuje vrednost u nekoj od ugnjezdenih
> procedura.
>

Kod plitkog pristupa se u statickoj memoriji nalaze lokacije u kojima se
cuvaju trenutne vrednosti lokalnih promenljivih funkcija.
Kada se funkcija pozove sacuvaju se stare vrednosti lokalnih promenljivih
iz staticke memorije a trenutne lokacije u statickoj memoriji se koriste
za lokalne promenljive aktivne procedure. U aktivacionom zapisu se samo
nalaze stare vrednosti tih promenljivih (slicno kao u displejima). Kada se
koriste/menjaju vrednosti promenljivih u funkciji njihove vrednosti se
citaju/upisuju u te lokacije. Kada se zavrsi procedura trenutne vrednosti
lokalnih promenljivih procedure u statickoj memoriji nisu potrebne tako da
se umesto njih upisuju stare vrednosti koje su sacuvane u aktivacionom
zapisu.

Mislim da ovo pitanje najbolje razresava primer sa predavanja:
Predavanja:
"(1) program dynamic (input,output);
(2) var r: real:

(3) procedure show;
(4) begin write (r: 5:3) end;

(5) procedure small;
(6) var r: real; //ova procedura "preklapa" ime promenljive r iz okruzujuce procedure
(7) begin r := 0.125; show end;

(8) begin
(9) r := 0.25;
(10) show; small; writeln;
(11) show; small; writeln;
(12) end.

Prilikom poziva funkcije small (koja ima svoje lokalno r), staru vrednost r (iz stati&#269;ke memorije) stavljamo na stek, a kada se vra&#263;amo iz ove procedure mi vrednost promenljive r, u stati&#269;koj memoriji, restauriramo sa steka. "

Koliko ja kapiram, cim "preklopimo" (ne mogu da se setim tacnog programerskog termina za ovo) ime neke promenljive, nekom novom definicijom te promenljive, stara vrednost promenljive ide na stek, a nova promenljiva ide u staticku memoriju.
Ako prilikom poziva funkcije, u pozvanoj funkciji nemamo "preklapanje" (odnosno redefinisanje) imena promenljivih, onda nista ne stavljamo na stek.
U gornjem primeru, kad u funkciji show pristupamo promenljivoj r, mi u stvari pristupamo lokaciji u statickoj memoriji cija je vrednost definisana u funkciji small. (vrednost od r, iz glavnog programa je negde na steku, i bice restaurirana u staticku memoriju kada se vratimo iz funkcije small).

Mislim da je cela poenta u tome da se jedna memorijska lokacija koristi za vise promenljivih koje su definisane na razlicitim nivoima ugnjezdavanja, ali se sve te promenljive isto nazivaju (kao r u gornjem primeru).





---------------------------------
Do you Yahoo!?
Get on board. You're invited to try the new Yahoo! Mail Beta.