Pobierz prezentację
Pobieranie prezentacji. Proszę czekać
OpublikowałGaweł Ciepły Został zmieniony 11 lat temu
1
Jednostki dynamiczne W trakcie obliczeń powstają (... i giną) jednostki dynamiczne: " rekordy aktywacji (procedur, funkcji, bloków,...) " obiekty (klas, współprogramów i wątków). Jednostka dynamiczna jest instancją modułu programu: " rekord aktywacji jest niezbędny do wykonania instrukcji procedury, " obiekt powstaje na wzór zapisany w deklaracji klasy. Cel: Musimy zrozumieć strukturę i scenariusz jednostki dynamicznej. Jednoostki dynamiczne w.8 10 kwietnia 2002
2
Procedury Deklaracja procedury składa się z nagłówka i treści procedury. Nagłówek zawiera nazwę procedury (identyfikator) oraz listę parametrów formalnych. Treść procedury to blok zawierający deklaracje wielkości lokalnych i instrukcje. Instrukcja procedury (= wywołanie procedury) powoduje wykonanie zmodyfikowanej odpowiednio treści procedury. Do zrozumienia instrukcji procedury stosuje się często tzw. Regułę kopii 2 Jednoostki dynamiczne w.8 10 kwietnia 2002 call P(parAkt) Mod parAkt Body P
3
Przykład program sort(input, output); var a: array[0..10] of integer; procedure czytajTab; var i: integer; begin for i := 1 to 9 do read(a[i]); end; (* czytajTab *) function podzial(y,z: integer): integer; var i, j, x, v: integer; begin... end (* podzial *); procedure quicksort(m, n: integer); var i: integer; begin if ( n > m ) then begin i := podzial(m,n); quicksort(m, i-1); quicksort(i+1,n); end end; (* quicksort *) begin a[0] := -9999; a[10] := 9999; czytajTab; quicksort(1, 9) end. 3 Jednoostki dynamiczne w.8 10 kwietnia 2002
4
Drzewa aktywacji Przyjmijmy, ż e: wykonywanie programu jest sekwencyjne, ka żde wykonanie instrukcji procedury polega na wykonaniu zmodyfikowanej (przez parametry aktyalne) treści procedury od jej początku do końca po czym sterowanie wraca do instrukcji następnej za instrukcją procedury. Czas istnienia aktywacji procedury p jest sekwencją kroków wykonywanych w zmodyfikowanej treści proceury p, włączając w to czas istnienia aktywacji procedur wywołanych z procedury p. FAKT Jeśli a i b są aktywacjami procedur to ich czasy istnienia albo są rozłączne albo jeden jest zawarty w drugim. 4 Jednoostki dynamiczne w.8 10 kwietnia 2002
5
Przykład c.d. Wstawmy do treści kazdej procedury dwie instrukcje write. Pierwsza drukuje napis wejście i nazwę procedury oraz parametry aktualne, druga napis opuszczenie i nazwę procedury. Oto co mo żemy przeczytać: Wykonanie rozpoczęte Wejście czytajTab opuszczenie czytajTab wejście quicksort(1,9) wejście podzial(1,9) opuszczenie podzial(1, 9) wejście quicksort(1, 3)... opuszczenie quicksort(1,3) wejście quicksort(5, 9)... opuszczenie quicksort(1, 9) wykonanie zakończone ) * przy zalo żeniu że podzial(1,9) zwraca 4 5 Jednoostki dynamiczne w.8 10 kwietnia 2002
6
Drzewa aktywacji c.d. Definicja Drzewem aktywacji dla pewnego wykonania programu P jest najmniejsze drzewo takie, że 1) korzeń reprezentuje aktywację programu głównego, 2) ka żdy węzeł reprezentuje aktywację procedury, 3) węzeł a jest ojcem dla węzła b wtedy i tylko wtedy gdy a zawiera instrukcję procedury aktywującą b, 4) węzeł a znajduje się po lewej stronie węzła b wtedy i tylko wtedy gdy aktywacja a poprzedza aktywację b. 6 Jednoostki dynamiczne w.8 10 kwietnia 2002
7
Przykład c.d. 7 Jednoostki dynamiczne w.8 10 kwietnia 2002 s c q(1,9) p(1,9) q(1,3)q(5,9) p(1,3) p(1,9) q(1,0)q(2,3) p(2,3) p(7,9) p(5,9) q(2,1)q(3,3) q(5,5)q(7,9) q(7,7) q(9,9)
8
Stosy sterowania W wielu językach (m.in. Pascalu, C,...) funkcja lub procedura nie kończy swej aktywacji zanim nie zakończą swych aktywacji funkcje przez nią wywołane. Mo żna więc powiedzieć, że wywołania procedur i funkcji zachowują się zgodnie z zasadą :ostatni przychodzący wychodzi pierwszy, po angielsku last-in first-out LIFO. Jeśli nazwy lokalne dla procedur są tworzone na wejściu do aktywacji procedury i niszczone przy jej opuszczaniu to możemy zastosować strukturę stosu. Uwaga. Jeśli język programowania dopuszcza i zagnieżdżanie funkcji i zapisywanie funkcji jako wartości zmiennych to trzeba użyć innych mechanizmów niż struktura stosu. 8 Jednoostki dynamiczne w.8 10 kwietnia 2002
9
Przykład c.d. 9 Jednoostki dynamiczne w.8 10 kwietnia 2002 s c q(1,9) p(1,9) q(1,3) p(1,3) p(1,9) q(1,0)q(2,3) p(2,3) q(2,1)q(3,3) Na rysunku widzimy węzły aktywacji, jakie zostały osiągnięte gdy sterowanie weszło do węzła q(3,3). Linie przerywane prowadzą do węzłów ju ż opuszczonych, wykonanych do końca. Linie ciągłe stanowią ścieżkę od korzenia s do q(3,3). Łatwo dostrzec, że w trakcie obliczeń węzły osiągnięte i nie opuszczone (linia ciągła) wchodzą i opuszczają stos.
10
Przykład c.d. 10 Jednoostki dynamiczne w.8 10 kwietnia 2002 s
11
Przykład c.d. 11 Jednoostki dynamiczne w.8 10 kwietnia 2002 s c
12
Przykład c.d. 12 Jednoostki dynamiczne w.8 10 kwietnia 2002 s c q(1,9)
13
Przykład c.d. 13 Jednoostki dynamiczne w.8 10 kwietnia 2002 s c q(1,9) p(1,9)
14
Przykład c.d. 14 Jednoostki dynamiczne w.8 10 kwietnia 2002 s c q(1,9) p(1,9) q(1,3) p(1,9)
15
Przykład c.d. 15 Jednoostki dynamiczne w.8 10 kwietnia 2002 s c q(1,9) p(1,9) q(1,3) p(1,3) p(1,9)
16
Przykład c.d. 16 Jednoostki dynamiczne w.8 10 kwietnia 2002 s c q(1,9) p(1,9) q(1,3) p(1,3) p(1,9) q(1,0)
17
Przykład c.d. 17 Jednoostki dynamiczne w.8 10 kwietnia 2002 s c q(1,9) p(1,9) q(1,3) p(1,3) p(1,9) q(1,0)q(2,3)
18
Przykład c.d. 18 Jednoostki dynamiczne w.8 10 kwietnia 2002 s c q(1,9) p(1,9) q(1,3) p(1,3) p(1,9) q(1,0)q(2,3) p(2,3)
19
Przykład c.d. 19 Jednoostki dynamiczne w.8 10 kwietnia 2002 s c q(1,9) p(1,9) q(1,3) p(1,3) p(1,9) q(1,0)q(2,3) p(2,3) q(2,1)
20
Przykład c.d. 20 Jednoostki dynamiczne w.8 10 kwietnia 2002 s c q(1,9) p(1,9) q(1,3) p(1,3) p(1,9) q(1,0)q(2,3) p(2,3) q(2,1)q(3,3)
21
Ramki = jednostki dynamiczne System czasu wykonania, czyli wirtualna maszyna potrzebna do wykonywania programów w naszym języku programowania musi zawierać narzędzia umo żliwiające wkładanie na stos rekordów aktywacji procedur by móc zrealizować instrukcje procedury. Kończeniu obliczeń procedury towarzyszy zdjęcie rekordu aktywacji ze stosu. W literaturze angielskojęzycznej używana jest nazwa frame, a więc ramka. Zobaczymy za chwilę jak sensowna jest ta nazwa. Ze względu na tradycję kompilatorów stos rekordów aktywacji rośnie w dół. 21 Jednoostki dynamiczne w.8 10 kwietnia 2002
22
Przykład c.d. 22Jednostki dynamiczne w.8 10 kwietnia 2002 s a: array of integer czytajTab: procedure podzial: function quicksort: procedure
23
Przykład c.d. 23Jednostki dynamiczne w.8 10 kwietnia 2002 s c a: array of integer czytajTab: procedure podzial: function quicksort: procedure i: integer
24
Przykład c.d. 24 s c q(1,9) a: array of integer czytajTab: procedure podzial: function quicksort: procedure m: integer 1 n: integer 9 i: integer Jednostki dynamiczne w.8 10 kwietnia 2002
25
Przykład c.d. 25 s c q(1,9) p(1,9) a: array of integer czytajTab: procedure podzial: function quicksort: procedure m: integer 1 n: integer 9 i: integer result: integer y,z: integer formalparam 1,9 i,j,x,v: integer Jednostki dynamiczne w.8 10 kwietnia 2002
26
Przykład c.d. 26 s c q(1,9) p(1,9) q(1,3) p(1,9) a: array of integer czytajTab: procedure podzial: function quicksort: procedure m: integer 1 n: integer 9 i: integer m: integer 1 n: integer 3 i: integer Jednostki dynamiczne w.8 10 kwietnia 2002
27
Przykład c.d. 27 s c q(1,9) p(1,9) q(1,3) p(1,3) p(1,9) a: array of integer czytajTab: procedure podzial: function quicksort: procedure m: integer 1 n: integer 9 i: integer m: integer 1 n: integer 3 i: integer result: integer y,z: integer formalparam 1, 3 i,j,x,v: integer Jednostki dynamiczne w.8 10 kwietnia 2002
28
Przykład c.d. 28 s c q(1,9) p(1,9) q(1,3) p(1,3) p(1,9) q(1,0) a: array of integer czytajTab: procedure podzial: function quicksort: procedure m: integer 1 n: integer 9 i: integer m: integer 1 n: integer 3 i: integer m: integer 1 n: integer 0 i: integer Jednostki dynamiczne w.8 10 kwietnia 2002
29
Przykład c.d. 29 s c q(1,9) p(1,9) q(1,3) p(1,3) p(1,9) q(1,0)q(2,3) a: array of integer czytajTab: procedure podzial: function quicksort: procedure m: integer 1 n: integer 9 i: integer m: integer 1 n: integer 3 i: integer m: integer 2 n: integer 3 i: integer Jednostki dynamiczne w.8 10 kwietnia 2002
30
Przykład c.d. 30 s c q(1,9) p(1,9) q(1,3) p(1,3) p(1,9) q(1,0)q(2,3) p(2,3) a: array of integer czytajTab: procedure podzial: function quicksort: procedure m: integer 1 n: integer 9 i: integer m: integer 1 n: integer 3 i: integer m: integer 2 n: integer 3 i: integer result: integer y,z: integer formalparam 2, 3 i,j,x,v: integer Jednostki dynamiczne w.8 10 kwietnia 2002
31
Przykład c.d. 31 s c q(1,9) p(1,9) q(1,3) p(1,3) p(1,9) q(1,0)q(2,3) p(2,3) q(2,1) a: array of integer czytajTab: procedure podzial: function quicksort: procedure m: integer 1 n: integer 9 i: integer m: integer 1 n: integer 3 i: integer m: integer 2 n: integer 3 i: integer m: integer 2 n: integer 1 i: integer Jednostki dynamiczne w.8 10 kwietnia 2002
32
Przykład c.d. 32 s c q(1,9) p(1,9) q(1,3) p(1,3) p(1,9) q(1,0)q(2,3) p(2,3) q(2,1)q(3,3) a: array of integer czytajTab: procedure podzial: function quicksort: procedure m: integer 1 n: integer 9 i: integer m: integer 1 n: integer 3 i: integer m: integer 2 n: integer 3 i: integer m: integer 3 n: integer 3 i: integer Jednostki dynamiczne w.8 10 kwietnia 2002
33
Pytania 1 W tym momencie rozpoczęte są cztery aktywacje procedury q. Czy potrzebne są cztery rekordy aktywacji tej samej przecież procedury q? 2 Czy każdy rekord aktywacji ma inny kod instrukcji, czy też rekordy te posługują się tym samym kodem? 3 Czy procedury mogą się odwoływać do nazw nielokalnych? Pomyśl jak to by było w przypadku funkcji zadeklarowanej wewnątrz procedury q. 4 W jaki sposób przekazywać parametry? 5 Czy procedury mogą być parametrami? wynikami obliczeń? 6 Czy można tworzyć obiekty klas? 7 Czy można usuwać obiekty? 33 Jednoostki dynamiczne w.8 10 kwietnia 2002
34
Stos czy sterta rekordów aktywacji? Do tej pory rozważaliśmy stos rekordów aktywacji procedur, funkcji i bloków. Dla wielu języków programowania nie da się utrzymać założenia, że stos wystarczy. Rozważmy język programowania w którym funkcje mogą być zagnieżdżane (jak w Pascalu) i mogą być wartościami zwracanymi przez funkcje (jak w C). Ta kombinacja powoduje, że nie możemy niszczyć rekordów aktywacji w momencie powrotu z funkcji. 34 Jednoostki dynamiczne w.8 10 kwietnia 2002
35
Przykład W języku ML fun f(x)= let fun g(y)= x+y in g end val h=f(3) val j=f(4) val z=h(5) val w=j(7) 35 Jednoostki dynamiczne w.8 10 kwietnia 2002 W pseudo-C int (*)() f(int x) { int g(int y) {return x+y} return g } int (*h)() =f(3); int (*j)() =f(4); int z = h(5); int w = h(7); W języku C nie można zagnieżdżać funkcji.
36
Przykład c.d. Gdy obliczamy wartość wyrażenia f(3), nowa zmienna lokalna x jest tworzona dla aktywacji funkcji f. Potem funkcja g jest zwracana jako wynik f(x). Zauważmy, że funkcja g nie była jeszcze wywołana, a więc zmienna y nie była jeszcze utworzona. W tym momencie funkcja f zwraca wynik i kończy obliczenie, ale jest zbyt wcześnie by zniszczyć lokalną zmienną x, ponieważ gdy obliczane będzie wyrażenie h(5) będziemy potrzebować wartości x=3. Tymczasem obliczana jest wartość wyrażenia f(4) tworząc inną instancję zmiennej x i zwraca ona inną instancję procedury g dla której x=4. Dla tego przykładu konieczne jest by zachować rekord aktywacji funkcji f po powrocie z obliczenia f (3) a także rekord aktywacji funkcji f po powrocie z obliczenia f(4). 36 Jednoostki dynamiczne w.8 10 kwietnia 2002
37
Pytanie otwarte Czy programowanie obiektowe zawiera w sobie programowanie funkcyjne? Hipoteza: dla każdego programu w języku ML (Haskel,...) istnieje program w języku Java (Loglan'82...) o tych samych własnościach. Dokładniej, istnieje jednolity algorytm tłumaczący programy w ML na rownoważne im programy w Javie. Nie znam dziś ( 2002-04-08 ) odpowiedzi na to pytanie. Ucieszy mnie albo dowód, że tak jest albo kontrprzykład wykazujący, że pewnego programu w ML nie da się zastąpić programem w Javie. 37 Jednoostki dynamiczne w.8 10 kwietnia 2002
38
Ramki na stosie W każdym systemie wykonawczym (wolę go nazywać maszyną virtualną) rekordy aktywacji kładzione są na stosie ramek. Na ogół długość ramki może być zmienna w czasie jej trwania. Różne są tego powody: w Algolu 60 do ramki dopisywaliśmy tablice utworzone w danej procedurze lub bloku, w prawie każdym języku programowania na wierzchołku stosu zapisywane są wielkości pomocnicze, tymczasowe potrzebne do obliczenia wartości wyrażeń, w każdym języku na stosie kładziemy argumenty wywoływanych funkcji i procedur. Poniżej przedstawimy protokół wywoływania funkcji i procedur, trzeba jednak zastrzec, że dzisiejsze kompilatory mogą ten protokół przyśpieszyć wykorzystując rejestry komputera. 38 Jednoostki dynamiczne w.8 10 kwietnia 2002
39
Stos systemu wykonawczego 1 39 Jednoostki dynamiczne w.8 10 kwietnia 2002 bie żący rekord aktyw. top
40
Stos systemu wykonawczego 2 40 Jednoostki dynamiczne w.8 10 kwietnia 2002 bie żący rekord aktyw. top argument n... argument 2 argument 1 static link
41
Stos systemu wykonawczego 3 41 Jednoostki dynamiczne w.8 10 kwietnia 2002 bie żący rekord aktyw. top argument n... argument 2 argument 1 bie żący rekord aktywacji powiększony o parametry aktualne
42
Stos systemu wykonawczego 4 42 Jednoostki dynamiczne w.8 10 kwietnia 2002 bie żący rekord aktyw. top argument n... argument 2 argument 1 static link bie żący rekord aktywacji powiększony o parametry aktualne i o static link = adres rekordu aktywacji z deklaracją wzywanej procedury
43
Stos systemu wykonawczego 5 43 Jednoostki dynamiczne w.8 10 kwietnia 2002 bie żący rekord aktyw. top argument n... argument 2 argument 1 static link poprzedni rekord aktywacji powiększony o parametry aktualne i o static link local variables return addr temporaries saved regs. frame ptr bie żący rekord aktywacji
44
Organizacja pamięci w czasie wykonywania Dla wykonania skompilowanego programu niezbędne są: - wygenerowany kod wynikowy, - stos rekordów aktywacji, - dane statyczne, - sterta (ang. heap) obiektów klas. 44 Jednoostki dynamiczne w.8 10 kwietnia 2002 Kod Dane statyczne Stos Sterta
45
Pytania " Jak to będzie dla programu z wątkami? " Czy obraz zmieni się gdy założymy, ze wszytkie wątki są wykonywane na tym samym procesorze (Java?) " Jak wygląda organizacja pamięci gdy wątki tego samego programu mogą być wykonywane na różnych komputerach w sieci (procesy w Loglanie)? " Jak wygląda organizacja pamięci gdy wątki są współprogramami (ang. coroutines)? tzn. gdy wiadomo że tylko jeden współprogram jest aktywny? 45 Jednoostki dynamiczne w.8 10 kwietnia 2002
46
Rekordy aktywacji Dla języków programowania takich jak Pascal lub C struktura rekordu aktywacji wygląda na ogół tak: 46 Jednoostki dynamiczne w.8 10 kwietnia 2002 Wartość zwracana Parametry aktualne Dowiązanie dostępu SL Dowiązanie sterowania DL Dane lokalne Zapamiętany stan procesora(rejestry) Dane tymczasowe
47
Rekordy aktywacji c.d. Przeznaczenie zaznaczonych części rekordu aktywacji: " pole dla wartości zwracanej, w tym polu funkcja wywoływana zapisuje wynik. W praktyce, wartość ta jest zwracana w rejetrze, by przyśpieszyć obliczenia. " Procedura wywołująca wpisuje tu argumenty. W praktyce, parametry zapisywane są w rejestrach procesora. " SL wskazanie na rekord aktywacji z którego wzięto deklarację wywoływanej procedury. Pozwala na realizację odwoływania się do danych nielokalnych, znajdujących się w innych rekordach aktywacji. Czasami stosuje się tez mechanizm display vector np. w Pascalu. " DL wskazanie na rekord aktywacji procedury wywołującej, " Informacje o wielkościach zadeklarowanych lokalnie. " Miejsce na przechowanie stanu rejestrów procesora sprzed wywołania procedury – pozwala odtworzyć stan procesora przy powrocie z procedury. " miejsce na wyniki tymczasowe, zmienne robocze. Część w rejestrach. 47 Jednoostki dynamiczne w.8 10 kwietnia 2002
48
Dane lokalne Każda nazwa lokalna otrzymuje swoje stałe przesunięcie względem początku rekordu aktywacji: - zmienne lokalne wymagają pól, być może różnych długości - nazwom modułów np. procedur, klas, odpowiadają pola zawierające... adres kodu procedury, adres konstruktora klasy i... - nazwom metod virtualnych ( w Smalltalku i Jawie każda metoda jest wirtualna, w Loglanie i w C++ na to by metoda była wirtualna trzeba napisać virtual ) - pola parametrów formalnych różnią się od zmiennych lokalnych tym, że znajdują się po drugiej stronie adresu początku rekordu aktywacji, 48 Jednoostki dynamiczne w.8 10 kwietnia 2002
49
Adresowanie wielkości lokalnych w kodzie W większości przypadków adres bieżącego rekordu aktywacji jest zapisany w pewnym rejestrze r. Pozwala to zaprogramować instrukcję a := b + c; gdzie wielkości a, b, c są lokalne jako LOAD r, offset a ADD r, offset b STORE r, offset c Liczby offset a, offset b, offset c są znane i równe przesunięciu odpowiedniego pola zmiennej a, b, c względem adresu początku rekordu aktywacji. W ten sposób różne aktywacje tej samej rekurencyjnej procedury mogą mieć ten sam kod! 49 Jednoostki dynamiczne w.8 10 kwietnia 2002
50
Sekwencje wywołujące S 50 Jednoostki dynamiczne w.8 10 kwietnia 2002
51
Dane o zmiennej długości S 51 Jednoostki dynamiczne w.8 10 kwietnia 2002
52
Wiszące referencje S 52 Jednoostki dynamiczne w.8 10 kwietnia 2002
53
Sterta obiektów S 53 Jednoostki dynamiczne w.8 10 kwietnia 2002
54
Nazwy nielokalne S 54 Jednoostki dynamiczne w.8 10 kwietnia 2002
55
Adresowanie wielkości nielokalnych S 55 Jednoostki dynamiczne w.8 10 kwietnia 2002
56
Przekazywanie parametrów S 56 Jednoostki dynamiczne w.8 10 kwietnia 2002
57
R S 57 Jednoostki dynamiczne w.8 10 kwietnia 2002
Podobne prezentacje
© 2024 SlidePlayer.pl Inc.
All rights reserved.