Organizacja pamięci w czasie wykonywania programu 1 Poznanie

Transkrypt

Organizacja pamięci w czasie wykonywania programu 1 Poznanie
Organizacja pami ci w czasie wykonywania programu
ORGANIZACJA PAMI
CI W CZASIE WYKONANIA PROGRAMU
Poznanie metod organizacji i wykorzystanie pami ci w czasie wykonania programów
ma istotne znaczenie przy projektowaniu zarówno kodu po redniego programu jak i struktury
tablic symboli.
Typowy przydział pami ci dla programu obejmuje:
Kod programu
Dane statyczne
Stos
Sterta
Rys. 1
Strategie rezerwacji pami ci
1. Statyczna rezerwacja pami ci jest stosowana dla wszystkich obiektów danych ,
których rozmiar jest znany w czasie kompilacji.
2. Rezerwacja stosowa zarz dza pami ci stosu w czasie działania programu, w
szczególno ci podczas wywoła procedur i funkcji na stosie s umieszczane i
zdejmowane rekordy aktywacji procedur (segmenty danych procedury)
3. Rezerwacja na stercie zarz dza pami ci w czasie rezerwacji i zwalniania pami ci dla
obiektów dynamicznych.
Typowy rekord aktywacji procedury lub funkcji zawiera:
Warto zwracana
Parametry aktualne
Adres powrotu
Wi zanie sterowaniaŁ cznik dynamiczny
Wi zanie dost puŁ cznik statyczny
1
Organizacja pami ci w czasie wykonywania programu
2
Stan procesora,
wybranych rejestrów
Dane lokalne
Dane robocze
Rys. 2
Przeznaczenie poszczególnych pól w rekordzie aktywacji:
1. W polu danych tymczasowych s przechowywane warto ci tymczasowe,
pojawiaj ce si w trakcie oblicze .
2. W polu danych lokalnych przechowuje si dane lokalne dla tego wykonania
procedury.
3. W polu do zapami tania stanu procesora przechowuje si informacje o nim
bezpo rednio sprzed wywołania procedury. To pole zawiera warto
licznika
rozkazów, rejestrów procesora, które powinny by przywrócone po powrocie z
procedury.
4. Wi zanie dost pu jest u ywane do odwołania si do danych nielokalnych
przetrzymywanych w innych rekordach aktywacji. – jest wykorzystywane w
Pascalu.
5. Wi zanie sterowania wskazuje rekord aktywacji procedury wywołuj cej
6. Pole z parametrami aktualnymi jest u ywane przez procedur wywołuj c do
przekazania parametrów do wywoływanej procedury( cz sto parametry takie s
przekazywane do rejestrów procesora)
7. Pole dla warto ci zwracanej jest wykorzystywane przez procedur wywoływan
do przekazania rezultatu do procedury wywołuj cej . W praktyce warto
ta jest
zwracana w rejestrze, w celu uzyskania wi kszej wydajno ci.
Rozmiary wszystkich pól mo na wyznaczy
w czasie wywołania procedury lub
funkcji. Wyj tek stanowi przypadek gdy procedura ma tablice lokalne, których wielko
jest wyznaczona przez warto ci parametrów aktualnych, dost pnych dopiero wtedy, gdy
procedura jest wywoływana w czasie działania programu.
Organizacja pami ci w czasie wykonywania programu
Wywoływania procedur s
3
implementowane przez wygenerowanie tzw.
sekwencji wywołuj cych. Sekwencja wywołuj ca rezerwuje na stosie miejsce na rekord
aktywacji i wprowadza informacje do jego pól. Wyj cie z procedury implementowane jest
natomiast przez sekwencj powrotu, która przywraca stan maszyny tak, aby procedura
wywołuj ca mogła działa dalej.
Sekwencje wywołuj ce i rekordy aktywacji ró ni si nawet w implementacjach tego
samego j zyka. Kod w sekwencji wywołuj cej jest cz sto dzielony mi dzy procedur
wywołuj c a procedur wywoływan .
Projektuj c sekwencje wywołuj ce i rekordy aktywacji nale y przestrzega zasady,
aby pola, których rozmiary s ju ustalone, były umieszczane w rodku, np. pola z
wi zaniem sterowania, dost pu i stanem procesora s umieszczone w rodku rekordu
aktywacji. Natomiast pole dla zmiennych roboczych, chocia ma ustalon długo
wygenerowaniu kodu po redniego, ale mo e mie
zmienion
po
długo , np. po
optymalizacji, dlatego znajduje si w rekordzie aktywacji na ko cu, polu dla zmiennych
lokalnych.
Poniewa ka de wywołanie ma własne parametry aktualne, procedura wywołuj ca
zwykle oblicza je i przekazuje do rekordu aktywacji procedury wywoływanej.
Rekord aktywacji procedury wywoływanej jest bezpo rednio pod rekordem procedury
wywołuj cej. Umieszczenie pól dla parametrów i ewentualnych warto ci wyniku
bezpo rednio przy rekordzie przy rekordzie procedury wywołuj cej na t zalet , e
procedura wywołuj ca mo e mie dost p do tych pól, u ywaj c przesuni cia wzgl dem
ko ca swojego własnego rekordu aktywacji.
Sekwencja wywołania, któr podamy poni ej zakłada, e rejestr Top_sp wskazuje
koniec pola stanu procesora w rekordzie aktywacji. Ta pozycja jest znana procedurze
wywołuj cej, wi c mo e by odpowiedzialna za ustawienie Top_sp przed przekazaniem
sterowania do procedury wywoływanej. Kod procedury wywoływanej mo e mie dost p
do danych lokalnych i zmiennych roboczych przy wykorzystaniu przesuni .
Organizacja pami ci w czasie wykonywania programu
4
........
Parametry i warto
zwracana
Wi zanie sterowania
Wi zania i stan zapami tany
Zmienne tymczasowe
Rekord
aktywacji
procedury
wywołuj cej
i dane lokalne
Parametry i warto
zwracana
Wi zanie sterowania
Top_s
Wi zania i stan zapami tany
Zmienne tymczasowe
Rekord
aktywacji
procedury
wywoływanej
i dane lokalne
Rys. 3 Podział zada mi dzy procedur wywołuj c i wywoływan .
Sekwencja wywołuj ca:
1. Procedura wywołuj ca oblicza parametry aktualne
2. Procedura wywołuj ca zapisuje adres powrotu i star warto
Top_sp w rekordzie
aktywacji wywoływanej, a nast pnie zwi ksza Top_sp do pozycji przedstawionej
na rys.3, czyli za swoje dane lokalne i zmienne tymczasowe oraz za parametry i
pole stanu procedury wywoływanej.
3. Procedura wywoływana zapami tuje warto ci rejestrów i inne informacje o stanie
4. Procedura wywoływana inicjuje swoje dane lokalne i rozpoczyna wykonanie.
Sekwencja powrotu:
1. Procedura wywoływana umieszcza warto ci wyników obok rekordu aktywacji
wywołuj cej.
2. Po u yciu informacji z pola stanu, procedura wywołana przywraca Top_sp i inne
rejestry, po czym powraca do kodu wywołuj cej.
Organizacja pami ci w czasie wykonywania programu
3. Chocia
5
Top_sp został zmniejszony, wywołuj ca mo e skopiowa
zwrócone do swojego własnego rekordu aktywacji i u y
warto ci
go do obliczenia
wyra enia.
DANE O ZMIENNEJ DŁUGO
CI
Przy posługiwaniu si danych o zmiennej długo ci przez procedur stosowana jest
zasada,
e pami
przeznaczona dla nich nie stanowi cz ci jej rekordu aktywacji.
W rekordzie aktywacji znajduj si jedynie wska niki do pocz tków tych danych.
Poni ej przedstawiony jest przykład, w którym procedura p ma trzy lokalne tablice o
zmiennej długo ci. Procedura ta wywołuje procedur q, a ta zawiera swoje tablice.
Parametry i warto
zwracana
Wi zanie sterowania
Wi zania i stan zapami tany
Zmienne tymczasowe i lokalne
Wska nik do tab. A
Rekord
aktywacji
procedury p
Wska nik do tab. B
Wska nik do tab. C
Tablica A
Tablica B
Tablica C
Top_s
Top
Wi zanie sterowania
Rekord
aktywacji
procedury q
Tablice q
Rekord aktywacji dla q zaczyna si po tablicach procedury p, a zmiennej długo ci tablice dla
q zaczynaj si za tym rekordem. Dost p do danych na stosie jest wykonywany przy u yciu
dwóch wska ników: Top i Top_sp. Pierwszy z tych znaczników oznacza rzeczywisty
Organizacja pami ci w czasie wykonywania programu
wierzchołek stosu i wskazuje pozycj , od której b dzie zaczyna
6
si nast pny
rekord
aktywacji. Drugi jest u ywany do znalezienia danych lokalnych.
DOST
P DO NAZW NIELOKALNYCH
Sposób traktowania odwoła
do zmiennych nielokalnych wyznaczaj tzw. reguły
widzialno ci j zyka. Zwykła reguła, zwana reguł widzialno ci leksykalnej lub statycznej,
wyznacza opis zmiennej jedynie przez badanie kodu tekstu programu i jest stosowana przez
j zyki takie jak Pascal, C i Ada. Alternatywna reguła, zwana reguł
widzialno ci
dynamicznej, wyznacza opis zmiennej w czasie działania, przez rozwa anie aktualnych
aktywacji. J zyki, które stosuj t reguł to Lisp i Snobol.
W j zyku C oprócz reguły widzialno ci leksykalnej jest dodatkowo stosowana reguła
najbli szego zagnie d ania bloków:
1. Deklaracja z bloku B jest widzialna w bloku B.
2. Je li nazwa x nie została zadeklarowana w bloku B, to wyst pienie x w bloku B
znajduje si w zakresie widzialno ci x w bloku B’ zawieraj cym blok B, takim e
(a) B’ zawiera deklaracj x,
(b) B’ wzgl dem zagnie d ania jest najbli ej bloku B
Struktura blokowa mo e by zaimplementowana przy u yciu rezerwacji stosowej pami ci,
pami
dla zmiennych bloku jest rezerwowana przy wej ciu do bloku i zwalniana przy
wychodzeniu sterowania z bloku. To podej cie traktuje blok jak bezparametrow procedur ,
wywoływan jedynie z miejsca bezpo rednio przed blokiem i powracaj c tylko do miejsca
bezpo rednio po bloku.
Alternatywna implementacja polega na jednorazowej rezerwacji pami ci dla całej
tre ci procedury. Je li wewn trz procedury znajduj si bloki, wykonywany jest przydział
pami ci na bloki potrzebne dla deklaracji wewn trz tych bloków. Przy czym maksymalna
Organizacja pami ci w czasie wykonywania programu
ilo
7
pami ci potrzebnej w trakcie wykonywania procedury mo e by wyznaczona w czasie
kompilacji.
Przykład.
main()
{
int a=0; int b=0;
{
int
b=1;
{
int a=2;
printf(„%d %d \n”, a, b);
B2
}
B0
B1
{
B3
int b=3;
printf(„%d %d\n”, a, b);
}
printf(„%d %d\n”, a, b);
}
printf(„%d %d\n”, a, b);
}
Pami
dla nazw zadeklarowanych w powy szym programie.
a0
b0
b1
a2, b3
Zauwa my, e a2 i b3 mog mie przypisany ten sam obszar pami ci, poniewa znajduj si
w blokach, które nie istniej jednocze nie.
W j zyku C definicje procedur nie mog by zagnie d one, dlatego pami
dla wszystkich
zmiennych zadeklarowanych na zewn trz procedur mo e zosta zarezerwowana statycznie.
Pozycje w tej pami ci s znane w czasie kompilacji, wi c je li nazwa jest nielokalna w
pewnej funkcji, u ywamy wprost adresu wyznaczonego statycznie. Ka da inna zmienna musi
Organizacja pami ci w czasie wykonywania programu
by lokalna i pochodzi z aktywacji na wierzchołku stosu. Zmienna taka jest dost pna przy
u yciu wska nika Top_sp.
WIDZIALNO
LEKSYKALNA Z ZAGNIE D ONYMI PROCEDURAMI
Nielokalne wyst pienie nazwy ‘a’ w procedurze w Pascalu znajduje si w zakresie najbli szej
– pod wzgl dem zagnie d enia – deklaracji ‘a’ w statycznym tek cie programu.
Przykładowo zagnie d enie procedur w poni szym programie
(1)
(2)
(3)
program sortuj;
var a: array[1..10] of integer;
x: integer;
(4)
(5)
(6)
procedure czytajtab;
var i: integer;
begin ... a ... end {czytajtab}
(7) procedure zamien(i, j: integer);
(8)
begin
(9)
x:=a[i]; a[i]:=a[j]; a[j]:=x;
(10)
end;
(11) procedure quicksort(n,m:integer);
(12)
var k,v: integer;
(13)
(14)
(15)
(16)
(17)
(18)
function podzial(y,z: integer):integer;
var i, j: integer;
begin … a …
… v …
… zamien(i,j); …
end {podzial}
(19)
begin …
end {quicksort}
(20) begin … end; {sortuj}
jest przedstawione za pomoc wci
(1) sortuj
(2)
czytajtab
(2)
zamien
(2)
quicksort
(3)
podział
nast puj co:
8
Organizacja pami ci w czasie wykonywania programu
9
Dodajmy, e reguł najbli szego zagnie d enia stosuje si zarówno dla zmiennych jak i
dla nazw procedur. Procedura zamie , wywoływana w wierszu (17) przez podział, jest
nielokalna dla podział. Stosuj c t
reguł , sprawdza si
najpierw, czy zamie
jest
zdefiniowana wewn trz quicksort; poniewa tak nie jest, szukamy jej w głównym programie
sortuj.
Z nazwami procedur b dziemy wi za
gł boko
zagnie d enia, przyjmuj c,
e nazwa
programu głównego znajduje si na gł boko ci zagnie d enia 1. Do gł boko ci zagnie d enia
dodaje si 1, je li przechodzi si do jednej procedury do procedury bezpo rednio w niej
zawartej.
Ka de wyst pienie zmiennej jest wi zane z gł boko ci zagnie d enia procedury, w której
została ona zadeklarowana.
Implementacj
widzialno ci leksykalnej dla zagnie d onych procedur realizuje si
dzi ki wi zaniu dost pu, który wyst puje w rekordach aktywacji. Je li procedura ‘p’ jest
zagnie d ona bezpo rednio wewn trz ‘q’ w kodzie
ródłowym, to wi zanie dost pu w
rekordzie aktywacji dla ‘p’ wskazuje wi zanie dost pu w rekordzie dla ostatniej aktywacji
‘q’.
Sytuacje na stosie sterowania podczas wykonania programu s przedstawione na poni szym
rysunku.
(a)
(b)
(c)
(d)
sortuj
wi zanie dost pu= nil
a, x
quicksort(1,10)
sortuj
sortuj
sortuj
nil
nil
nil
a, x
quicksort(1,10)
a, x
quicksort(1,10)
a, x
quicksort(1,10)
wi zanie dost pu
wi zanie dost pu
wi zanie dost pu
wi zanie dost pu
k, v
k, v
quicksort(1,3)
k, v
quicksort(1,3)
k, v
quicksort(1,3)
wi zanie dost pu
wi zanie dost pu
wi zanie dost pu
k, v
k, v
podzial(1,3)
k, v
podzial(1,3)
wi zanie dost pu
wi zanie dost pu
i, j
i, j
zamien(1,3)
wi zanie dost pu
Rys. 4 Wi zania dost pu podczas wykonywania programu
Organizacja pami ci w czasie wykonywania programu
10
Zauwa my - rys. 4 (c), e wi zanie dost pu w rekordzie aktywacji dla podzial(1,3) wskazuje
wi zanie dost pu w rekordzie ostatniej aktywacji quicksort, czyli quicksort(1,3).
Je li procedura ‘p’ na gł boko ci zagnie d enia np odwołuje si do nielokalnej zmiennej
‘a’ z gł boko ci na to pami
dla ‘a’ mo na znale
przechodz c po np-na wi zaniach dost pu
z rekordu z wierzchołka stosu. Po przej ciu - osi gamy rekord aktywacji dla procedury, dla
której ‘a’ jest lokalne. St d, adres nielokalnej zmiennej ‘a’ w procedurze ‘p’ jest zdefiniowany
przez par obliczon w trakcie kompilacji i zapisana w tablicy symboli:
(np-na , przesuni cie wewn trz rekordu aktywacji zawieraj cego ‘a’).
Kod ustawiaj cy wi zania dost pu w wywoływanej procedurze jest cz ci
sekwencji
wywołania i zale y od tego, czy wywoływana procedura jest zagnie d ona w wywołuj cej.
Załó my, e procedura ‘p’ znajduj ca si na gł boko ci np wywołuje procedur ‘q’ z
gł boko ci nq.
1. Przypadek: np < nq
Skoro wywoływana procedura ‘q’ jest gł biej zagnie d ona ni ‘p’, musi by
zadeklarowana wewn trz ‘p’, w innym przypadku nie b dzie dost pna z ‘p’. Taki przypadek
mamy gdy procedura sortuj wywołuje procedur quicksort lub gdy z quicksort wywoływane
jest podział. Wtedy wi zanie dost pu w wywoływanej procedurze musi wskazywa wi zanie
dost pu w rekordzie aktywacji procedury wywołuj cej bezpo rednio powy ej na stosie.
2. Przypadek: np ≥ nq
Według reguł widzialno ci procedury na gł boko ciach zagnie d enia 1, 2, ..., nq-1,
zawieraj ce wywoływane i wywołuj ce procedury musz by takie same jak wtedy, gdy
quiksort wywołuje siebie - rys. 4 (b) i gdy podzial wywołuje zamien rys.4 (d).
Wtedy przechodz c po np-nq+1 wi zaniach dost pu od wywołuj cego dochodzimy do
ostatniego rekordu aktywacji dla procedury, która statycznie zawiera obie procedury
wywołuj c i wywoływan . Osi gni te wi zanie dost pu jest jedynym, do którego musi
wskazywa wi zanie dost pu w procedurze wywoływanej.
Organizacja pami ci w czasie wykonywania programu
11
Reguły widzialno ci leksykalnej s stosowane nawet wtedy gdy zagnie d ona procedura jest
przekazywana jako parametr.
Przykład.
(1) Program param;
(2)
Procedure b(function h(n: integer):integer);
(3)
begin writeln(h(2)) end {b}
(4)
(5)
procedure c;
var m: integer;
(6)
(7)
function f(n: integer): integer;
begin f:= m + n end {f} ;
(8)
begin
(9)
(10)
(11)
begin
c
end.
m:=1; b(f) end {c};
Funkcja f w wierszu (7) ma nielokaln zmienn
‘m’, w wierszu (8) procedura ‘c’
przypisuje
m:= 1 i nast pnie przekazuje ‘f’ jako parametr do ‘b’. Zauwa my,
e
widzialno
deklaracji ‘m’ z wiersza (5) nie obejmuje tre ci procedury tre ci procedury
w wierszach (2-3).
Instrukcja writeln(h(2)) w tre ci ‘b’ aktywuje ‘f’, poniewa parametr formalny ‘h’
odnosi si do ‘f’. Czyli, zostanie wypisany rezultat f(3).
W jaki sposób jest ustalane wi zanie dost pu dla aktywacji ‘f’ ?
Otó , gdy procedura zagnie d ona jest przekazywana jako parametr wówczas musi
mie jednocze nie przypisane wi zanie dost pu. To znaczy gdy procedura ‘c’ przekazuje
‘f’, musi wyznaczy równie wi zanie dost pu dla ‘f’, w ten sposób jakby wywoływała
‘f’. To wi zanie jest przekazywane razem z ‘f’ do ‘b’ . Nast pnie, gdy ‘f’ jest aktywowane
z wewn trz ‘b’, wi zanie jest u ywane do ustalenia wi zania dost pu w rekordzie
aktywacji ‘f’.
Organizacja pami ci w czasie wykonywania programu
12
param
nil
c
Wi zanie dost pu
m
b
Wi zanie dost pu
<f, w>
Rys. 5 Parametr aktualny jest przekazywany razem z wi zaniem dost pu
TABLICE DISPLAY
Dost p do zmiennych nielokalnych, szybszy ni za pomoc wi za dost pu, mo na
uzyska stosuj c tablic d wska ników do rekordów aktywacji, zwan display. Dzi ki tej
tablicy pami
dla zmiennych nielokalnych na gł boko ci zagnie d enia ‘i’ mo e by
znaleziona w rekordzie aktywacji wskazanym przez element d[i].
Załó my, e sterowanie znajduje si w aktywacji dla procedury ‘p’, b d cej na
gł boko ci zagnie d enia ‘j’. W takim przypadku, pierwsze j-1 elementów tablicy display
wskazuje ostatnie aktywacje procedur zawieraj cych leksykalnie procedur ‘p’, a d[j] –
wskazuje aktywacje ‘p’. U ycie tej tablicy jest zwykle szybsze ni
wi zaniach dost pu.
Przykład.
(a)
d[1]
d[2]
sortuj
nil
a, x
quicksort(1,10)
Zapami tane d[2]
k, v
przechodzenie po
Organizacja pami ci w czasie wykonywania programu
(b)
d[1]
d[2]
sortuj
nil
a, x
quicksort(1,10)
Zapami tane d[2]
k, v
quicksort(1,3)
Zapami tane d[2]
k, v
(c)
d[1]
sortuj
d[2]
nil
d[3]
a, x
quicksort(1,10)
Zapami tane d[2]
k, v
quicksort(1,3)
Zapami tane d[2]
k, v
podzial(1,3)
Zapami tane d[3]
i, j
(d)
d[1]
sortuj
d[2]
nil
d[3]
a, x
quicksort(1,10)
Zapami tane d[2]
k, v
quicksort(1,3)
Zapami tane d[2]
k, v
podzial(1,3)
Zapami tane d[3]
i, j
zamien(1,3)
Zapami tane d[2]
13
Organizacja pami ci w czasie wykonywania programu
14
Na rys. (a) wida sytuacje bezpo rednio przed rozpocz ciem aktywacji quicksort(1,3),
skoro quicksort znajduje na głeboko ci zagnie d enia 2, element tablicy d[2] jest zmieniany,
gdy rozpoczyna si nowa aktywacja quicksort.
Efekt aktywacji quicksort(1,3) przedstawia rys. (b), gdzie d[2] wskazuje teraz nowy
rekord aktywacji. Stara warto
zapisana warto
d[2] jest zapisywana w rekordzie aktywacji quicksort(1,3),
b dzie pó niej potrzebna do przywrócenia tablicy display do swojego stanu
z rys. (a), gdy sterowanie powróci do aktywacji quicksort(1,10).
Dla uproszczenia, dla quicksort(1,10) zawarto
d[2] równie została zapami tania,
chocia nie b dzie wykorzystywana.
Ogólnie, tablica display zmienia si , gdy wyst puje nowa aktywacja i nale y j
przywróci , gdy sterowanie powraca z tej aktywacji.
Rozwa ymy jedynie prosty przypadek, w którym nie ma przekazywania procedur jako
parametrów
Gdy nowy rekord aktywacji jest tworzony dla procedury na gł boko ci zagnie d enia ‘i’,
nale y:
1) zapami ta warto
d[i] w nowym rekordzie aktywacji oraz
2) warto ci d[i] przypisa wska nik nowego rekordu aktywacji.
Bezpo rednio przed zako czeniem aktywacji, d[i] jest przywracana zapami tana warto .
Post powanie to mo na wytłumaczy nast puj co, załó my, e procedura na gł boko ci
zagnie d enia ‘j’ wywołuje procedur z gł boko ci ‘i’. S dwa przypadki, w zale no ci czy
procedura wywoływana jest zagnie d ona wewn trz procedury wywołuj cej, czy nie.
1. Przypadek: j < i . Wtedy i=j+1 i wywoływana procedura jest zagnie d ona wewn trz
wywołuj cej. Pierwszych j elementów tablicy display nie trzeba wi c zmienia i
wska nik nowego rekordu aktywacji wystarczy przypisa do d[i], np. gdy sortuj
wywołuje quicksort lub gdy quicksort wywołuje podzial. (rys. a i c).
2. Przypadek: j >=i. Ponownie, procedury na gł boko ciach 1,2, …, i-1, zawieraj
procedury wywołuj c
i wywoływan . W tym przypadku w nowym rekordzie
aktywacji jest zapisywana tylko stara warto
d[i], a d[i] jest przypisywany wska nik
nowego rekordu aktywacji. Przykładem dla przypadku 2 jest wywołanie rekurencyjne
quicksort (rys. b) oraz bardziej interesuj cy przypadek, gdy aktywacja podzial(1,3) z
Organizacja pami ci w czasie wykonywania programu
15
gł boko ci 3 wywołuje zamien(1,3) z gl boko ci 2, a procedur zawieraj c je obie
jest sortuj z gł boko ci 1 (rys. d).
Istnieje kilka miejsc, w których mo na umie ci display, jej maksymaln długo
mo e
wyznaczy kompilator. Je li istnieje dostatecznie du o rejestrów, to display traktowane jako
zwykła tablica, mo e by zbiorem rejestrów. W przeciwnym razie display mo e znajdowa
si w pami ci zarezerwowanej statycznie. Inn mo liwo ci jest przechowywanie tablicy
display na stosie sterowania i tworzenie nowej kopii przy ka dym wywołaniu procedury.
PRZEKAZYWANIE PARAMETRÓW.
W ród metod przekazywania parametrów wymienia si takie jak: przekazywanie przez
warto , przez referencj , skopiowanie–przywrócenie, przekazywanie przez nazw
i
rozwini cie makroinstrukcji.
Ró nice miedzy nimi wynikaj głównie z tego, e parametr aktualny reprezentuje rwarto , l-warto
lub napis b d cy nazw parametru aktualnego. Przy czym przedrostki l- i
r- pochodzi od słów left i right i oznaczaj ‘lew ’ oraz ‘praw ’ stron przypisania.
W przypisaniu a[i]:=a[j], wyra enie a[j] reprezentuje warto , podczas gdy a[i]
reprezentuje lokacj w pami ci, w której umieszczana jest warto
a[j].
Przekazywanie przez warto .
Parametry s obliczane i ich r-warto ci s przekazywane do wywoływanej procedury.
Implementacja tego przekazywania jest nast puj ca:
1.
Parametr formalny jest traktowany tak jak zmienna lokalna, wi c pami
parametrów formalnych znajduje si
w rekordzie aktywacji
dla
procedury
wywoływanej.
2.
Procedura wywołuj ca oblicza parametry aktualne i ich r-waro ci umieszcza w
pami ci dla parametrów formalnych.
Takie przekazywanie nie ma adnego wpływu na rekord aktywacji wywołuj cego.
Organizacja pami ci w czasie wykonywania programu
16
Przekazywanie przez referencj .
W tym przypadku procedura wywołuj ca przekazuje wska nik miejsca pami ci dla
ka dego parametru aktualnego. To znaczy:
1. Je li parametr aktualny jest zmienn , wyra eniem maj cego l-warto , to
przekazywana jest ta l-warto .
2. Je li parametr aktualny jest wyra eniem, jak a+b lub 2, które nie ma l-warto ci, to
warto
ta jest obliczana w nowej lokacji i jej adres jest przekazywany.
Metoda skopiuj-przywró .
Jest to metoda po rednia miedzy poprzednimi metodami.
1. Przed przej ciem sterowania do procedury wywołuj cej s
obliczane parametry
aktualne oraz ich r-warto ci s dostarczane do procedury wywoływanej tak jak w
metodzie przez warto . Dodatkowo jednak, l-warto ci parametrów(je li je maj ) s
obliczane przed wywołaniem procedury.
2. Gdy sterowanie powraca z procedury, aktualne r-warto ci parametrów formalnych s
kopiowane z powrotem do l-warto ci parametrów aktualnych, przy u yciu l-warto ci
obliczonych przed wywołaniem. (Oczywi cie s
kopiowane jedynie parametry
aktualne maj ce l-warto ci).
Przekazywanie przez nazw jest interesuj ce głównie teoretyczne i było wykorzystywane w
Algolu. Procedura jest traktowana jakby była makrem, czyli jej tre
jest podstawiana za
wywołanie u wywołuj cego, z parametrami aktualnymi wstawianymi dosłownie w miejsce
formalnych. Takie dosłowne podstawienie jest nazywane rozwijaniem makroinstrukcji.
Organizacja pami ci w czasie wykonywania programu
ORGANIZACJA PAMI
CI NA PRZYKŁADZIE MASZYNY STOSOWEJ.
W celu uproszczenia opisu problemów zwi zanych z organizacj pami ci w czasie
wykonywania programu zało ymy,
e kompilator generuje kod programu w pewnej
wirtualnej maszynie stosowej, w której pami
dla danych programu jest zorganizowana na
stosie.1
W maszynie tej interpretacja ka dego rozkazu, realizuj cego dwuargumentowe
operacje arytmetyczne, polega na zast pieniu dwóch elementów na wierzchołku stosu
wynikiem operacji.
Lista rozkazów maszyny PL/0 jest nast puj ca:
1.
– ładuje stał na stos
2.
– ładuje zmienn na stos (p-poziom zadeklarowania zmiennej, a-adres
wzgl dny)
3.
– wykonaj operacje dwuargumentow (a∈{+,-,*,/, <, >, itp.}
4.
– wykonaj operacje jednoargumentow (a∈{sqrt, sin, cos, not, itp. }
5.
– pami taj zawarto
stosu w zmiennej (p,a)
6.
– skocz bezwarunkowo do '
a'
7.
– skocz warunkowo do '
a'
8.
– wywołaj procedur '
a'na poziomie '
p'
9.
– powró do procedury wywołuj cej
10.
– przydziel '
a'komórek na stosie.
1
N. Wirth, Algorytmy + struktury danych = programy, Wydawnictwa Naukowo-TechniczneWarszawa 2000
17
Organizacja pami ci w czasie wykonywania programu
18
Przykład programu:
Tablica kodu
const m= 7, n= 85;
0. JUMP 30
1. JUMP 2
2. GET 0, 5
3. LOAD 1, 4
x
4. STORE 0, 4 a
5. LOAD 1, 5
y
6. STORE 0, 5 b
7. STA 0, 0
0
8. STORE 1, 6 z
9. LOAD 0, 5
b
10. STA 0, 0
0
11. OPR2 0, ’>’
12. JFALSE 0, 29
13. LOAD 0, 5 b
14. OPR1 0, odd test nieparzysto ci
15. JFALSE 0, 20
16. LOAD 1, 6 z
17. LOAD 0, 4 a
18. OPR2 0, ’+’
19. STORE 1, 6 z
20. STA 0, 2
2
21. LOAD 0, 4 a
22. OPR2 0,’*’
23. STORE 0, 4 a
24. LOAD 0, 5 b
25. STA 0,2
2
26. OPR2 0,’/’
27. STORE 0, 5 b
28. JUMP 0,9
29. RET 0,0
powrót
30. GET 0,8
31. STA 0, m
32. STORE 0, 4 x
33. STA 0, n
34. STORE 0, 5 y
35. CALL 1, 2 ‘mnoz’
36. RET 0, 0
koniec
var x, y, z, q, r;
procedure mnoz;
var a, b;
begin
a:=x; b:=y; z:=0;
while b>0 do
begin
if odd b then z:=z+a;
a:=2*a; b:=b/2;
end
end;
begin
x := m; y:=n;
call mnoz;
end;
Tablica symboli dla tego przykładu ma posta :
"
$
!
!
!
!
!
#
!
%
&
'!
(
)
"
$
&
!
!
"
Organizacja pami ci w czasie wykonywania programu
19
W czasie wykonywania programu maszyna stosowa wykorzystuje stos zarówno dla
rezerwacji pami ci dla segmentów danych wywoływanych procedur lub funkcji (mog by
wywoływane rekurencyjnie), jak równie dla zapami tywania wyników po rednich podczas
oblicze wyra e .
W danym momencie wykonywania programu, na stosie b d znajdowa si segmenty
danych tych procedur lub funkcji, których wykonanie si nie zako czyło.
Zako czenie realizacji danego wywołania procedury jest zwi zane ze zwolnieniem
przydzielonego miejsca dla jej segmentu danych i powrotem do miejsca, z którego była
wywoływana dana procedura.
Jak ju wspomniano wła ciw kontynuacj wykonania programu po zako czeniu
działania procedury zapewniaj dwa adresy, nale ce do segmentu danych procedury: adres
powrotu (AP) i ł cznik dynamiczny (ŁD).
Poniewa przydzielenie pami ci odbywa si dynamicznie, to w wygenerowanym
kodzie odwołania do
zmiennych nie mog by adresami absolutnymi, lecz s adresami
wzgl dnymi. W czasie wykonania rozkazów nast puje wyznaczenie aktualnego adresu
zmiennej w nast puj cy sposób: do adresu bazowego segmentu danych, w którym
zdefiniowana została zmienna jest dodawany adres wzgl dny zmiennej w segmencie (offset).
Je li zmienna jest lokalna w procedurze aktualnie wykonywanej, to adres bazowy
segmentu danych znajduje si w bazowym rejestrze adresowym – B. W przeciwnym razie,
w celu wyznaczenia adresu bazowego segmentu, do którego nale y dana zmienna, nale y
przeszuka
list
adresów umieszczonych w ł cznikach statycznych (ŁS). Aby upro ci
algorytm wyznaczania ł cznika statycznego dla wywoływanej procedury, zało ymy
struktura segmentu danych dla procedur jest nast puj ca:
Adres SD do procedury wywołuj cej (ŁD)
Poziom zadeklarowania procedury
poziom
Adres do SD procedury nadrz dnej (ŁS)
Adres powrotu z procedury
Zmienne lokalne
Zmienne robocze procedury
e
Organizacja pami ci w czasie wykonywania programu
Poni ej przedstawimy organizacj stosu wykonawczego w czasie wykonania przez
maszyn stosow pewnego ci gu wywoła
procedur, zadeklarowanych jak w poni szych
przykładzie:
Program P1;
procedure A ( a, b : integer);
var
x, y : integer;
procedure B;
var
t : real;
procedure C (d: char);
var
n, m: integer;
begin
B ; {***}
end;
begin
C (...); //wywołanie C
end;
begin
B ; // wywołanie B
end;
Begin
A (...); // wywołanie procedury A
End .
Załó my, e w wykonanie programu znajduje w miejscu (***), tj. programie nast piło
wywołanie kolejno procedur:
*+ ,*+ *+ ,.
Podczas wywołania procedury '
A'
, na stosie wykonawczym zostanie zarezerwowany
segment danych procedury '
A'
, po kolejnych wywołaniach procedur '
B'i '
C'
, stos b dzie
zawierał kolejno segmenty procedur '
B'i '
C'
.
20
Organizacja pami ci w czasie wykonywania programu
21
W czasie gdy aktualnie wykonywan procedur jest ponownie procedura '
B'
, na stosie
wykonawczym pojawi si znowu segment danych procedury '
B'
.
Na rysunku przedstawiono zawarto
stosu, w momencie ponownego wywołania
procedury '
B'
. Pocz tek segmentu danych aktualnie wykonywanej procedury wskazuje
bazowy rejestr adresowy - Base , a adres elementu znajduj cego si na wierzchołku stosu
wskazuje rejestr Top.
Adres SD programu głównego (ŁD)
Poziom zadeklarowania proc. A 1
Adres SD programu głównego (ŁS)
Segment danych procedury A
Adres powrotu z procedury A
Zmienne robocze: a, b
Zmienne lokalne: x, y
Adres SD procedury A
(ŁD)
Poziom zadeklarowania proc. B 2
Adres SD procedury A
(ŁS)
Segment danych procedury B
Adres powrotu z procedury B
Zmienna lokalna: t
Adres SD procedury B
Base 0
(ŁD)
Poziom zadeklarowania proc. C 3
Adres SD procedury B
Segment danych procedury C
(ŁS)
Adres powrotu z procedury C
Zmienna robocza: d
Top 0 = Base (pocz tek segmentu danych
Zmienne lokalne: n, m
Adres SD procedury A
Poziom zadeklarowania proc. B 2
Adres SD procedury C
procedury aktualnie wykonywanej)
(ŁD)
Segment danych procedury B
(ŁS)
Adres powrotu z procedury B
Zmienna lokalna: t
Top
Organizacja pami ci w czasie wykonywania programu
22
W dalszym ci gu omówimy przebieg wykonania wybranych rozkazów .
1. Rozkaz: (
) – wywołuje procedur zdefiniowanej na poziomie '
p', której
adres kodu wynosi '
a'.
W tym momencie na stosie jest segment danych procedury wywołuj cej, którego
pocz tek wskazuje rejestr Base a jego koniec wskazuje rejestr Top.
Zatem wykonanie tego rozkazu spowoduje utworzenie nowego segmentu danych
procedury wywoływanej oraz :
Zapami tanie adresu do segmentu danych procedury wywołuj cej (ŁD).
Zapisanie poziomu procedury ‘p’
Wyszukanie i zapami tanie adresu do segmentu danych procedury nadrz dnej
(ŁS).
Zapami tanie adresu powrotu z procedury.
Aktualizacj rejestru bazowego Base (wskazuje pocz tek segmentu danych
aktualnie wykonywanej procedury).
Zmian licznika rozkazów LR na adres pierwszego rozkazu procedury.
Jego interpretacja ma posta :
,-./
'0' 1 23
4 , -5
6
67
89
! /
:;#
/
9
! # ;' &'9
-;<&# =#='7
<>
89
->
'0' 1 23
4 5
6
6!
/
?<>
- '!/
' ! ;-:
@&'= / &'9
-;<&#
'0' 1 23
4 /;A /:
BC5 6
67
89
! /
: #9
! # ;' &'9
-;<&# ;&!?; ->
'0' 1"23
4
, -3
4 '5
3
4 5
5
6
6 ;&- '=&'<B D @
/
9
! /
:&'!:!<C
6
6 :< @
/
! 9
> &->
- &<) !'=-.'
6
6 ;&? -.'&'!:!<< =/
'9
!8-:
6
6:
';< &'9
-;<&# EF
;5
Funkcja Find_Link(p) znajduje na stosie pocz tek segmentu danych procedury
nadrz dnej (zadeklarowanej na poziomie p-1 );
< 9/
' /;A /:B3/ -.-&C 3/ -.-&5
6
6!
>
;<>
-) !? -. - <; #9
G &'9
-;<&#
H&
) 3/ -.-&5
,-./
;&!?; ->
Organizacja pami ci w czasie wykonywania programu
23
)3
4 , -5
6
6, -* &->
- & ) !'=# '9
!8-: &'9
-;<&# =#='7
<>
89
->
3
4 '0
)1 2
5 6
6 '!/
' &'9
-;<&# =#='7
<>
89
->
=G/
@
- I+ B* C ;'
,-./
)3
4 '0
)2
5
3
4 '0
)1 2
5
;5
/;A /:
3
4)
;5
2. Rozkaz: (
) – rezerwuje na stosie pami
długo ci ‘a’ dla segmentu danych
procedury, jest to pierwszy rozkaz w kodzie procedury.
Jego interpretacja ma posta :
,-./
' 3
4 '1 5
;5
6
6< =/
-/
- '=-.'=/
-&!9
G'7
:
'<
3. Zako czenie wykonania procedury i powrót do procedury wywołuj cej nast puje
podczas wykonania rozkazu powrotu: (RET).
Przy czym nast puje wtedy:
(a) zmiana licznika rozkazów na adres powrotu,
(b) przywrócenie poprzednich (przed wywołaniem) warto ci rejestrów: Base0 i Top0.
Jego interpretacja ma posta :
,-./
'3
4 , -* 5
6
6< =/
-/
- '=-.'=/
-&!9
G'7
: '< ' = :!<>
6
6'
/
8:
' J&:
? -. - <; #9
G &'9
-;<&#
6
6=#='7
<>
89
->
, -3
4 '0' 1 2
6
6< =/
-/
- '=-.'&->
- &<) !'=-.'B
KC
3
4 '0' 1"2
5
6
6< =/
-/
-@
/
9
! /
: &'!:!J=
;&- '=&'<
;5
4. Rozkazy skoków.
(a) (
C – skoku bezwarunkowego, spowoduje zmian licznika rozkazów
LR
Interpretacja rozkazu:, ma posta :
,-./
3
4 5
;5
6
6< =/
-/
- '=-.'@
/
9
! /
: &'!:!<
Organizacja pami ci w czasie wykonywania programu
B
)C (
C – skoku warunkowego (przy ‘0’),
Interpretacja rozkazu: ma posta :
,-./
L
M '0' 24
,-./
3
4 5
-9
B' C5
;5
;5
5. Rozkaz: (
G6
6< =/
-/
- '=-.'@
/
9
!: &'!:!<
6
6<<= !- '< &.< - &'!:!< :':
<
) - ładowania zmiennej na stos.
Rozkaz ten zawiera obok kodu rozkazu argument postaci: (p, a) , gdzie:
'
p'– jest statyczn ró nic poziomów zmiennej i aktywnej procedury,
((0, a) – oznacza zmienn lokaln w aktualnie wykonywanej procedurze o adresie '
a'
)
(1, a) - oznacza zmienn została zadeklarowana w procedurze nadrz dnej)
'
a'– jest adresem wzgl dnym w segmencie danych procedury.
Wykonanie tego rozkazu – spowoduje wyznaczenie adresu bazowego segmentu
procedury, w której została zadeklarowana zmienna (segment znajduje si na stosie),
a nast pnie pobranie zmiennej z segmentu danych i załadowanie jej na wierzchołek
stosu.
Funkcja wyznaczaj ca adres bazowy segmentu danych le cego p poziomów ni ej ma
posta :
< 9/
' , ! B3/ -.-&C 3/ -.-&5
6
6!
>
;<>
-) !? -. - <@
-N
89
-.'EF '!/
' J= /
N
->
H&
) 3/ -.-&5
,-./
)3
4 , -1 5
6
6, -* &->
- & ) !'=# '9
!8-: :#= -> &'9
-;<&#
6
6, -1 D ! =/
-& 7
89
! /
: #9
! #
OG/
@
- + ;'
,-./
)3
4 '0
)1 2
5
-9
BC5
;5
,! 3
4)
;5
Tak wi c, wykonanie rozkazu (
programu:
) realizuje nast puj cy fragment
24
Organizacja pami ci w czasie wykonywania programu
,-./
L9
B' C5
'0' 23
4 '0
, ! BC 1 2
5
;5
$ Rozkaz: (
C – zapami tuje wierzchołek stosu w zmiennej (p,a).
Wykonanie tego rozkazu – spowoduje wyznaczenie adresu zmiennej na stosie,
a nast pnie zapami tanie warto ci z wierzchołka stosu w zmiennej:
,-./
'0
, ! BC 1 23
4 '0' 25
-9
B' C5
;5
7. Rozkaz: B
C gdzie ‘a’ jest operatorem dwuargumentowym, realizuje podan
operacj , usuwa oba argumenty ze stosu a wynik operacji wstawia na stos.
Jego interpretacja jest nast puj ca:
,-./
-9
B' C5
'0' 23
4 '0' 2 EF '0' 1 2
5
;5
8. Rozkaz: B
C gdzie ‘a’ jest operatorem jednoargumentowym realizuje
podan operacj , zamieniaj c na stosie argument, wynikiem danej operacji.
Jego interpretacja jest nast puj ca:
,-./
'0' 23
4 EF '0' 1 2
5
;5
25