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