przegląd
Transkrypt
przegląd
Wykład 11, str. 1 Organizacja pamięci PRZEKŁAD int n; tttttttttttttttttttttttttttttttttttt ttttttttt t tttt t t double r; t t t tttt tt t t t t ttt n = n+1; ttttttttt tt t 200 ttttt t r = 0.0; 201 ttt n r 202 203 204 205 206 207 208 209 210 211 pobierz do rej.arytm. zaw. bajtów 200–203 dodaj 1 do rej.arytm. zapisz stan rej.arytm. w bajtach 200–203 wyzeruj bajty 204–211 Wykład 11, str. 2 Organizacja pamięci W czasie kompilacji: • na każdą zadeklarowaną zmienną rezerwuje się blok pamięci wielkości zależnej od typu tej zmiennej (np. na całkowitą zawsze 4 bajty, na rzeczywistą zawsze 8 bajtów, itp.); • instrukcje jęz. źródłowego dotyczące tej zmiennej są tłumaczone na instrukcje jęz. wewnętrznego dotyczące tego bloku; to znaczy odnoszą się do adresów zawartych w tym bloku; • tablice zajmują spójne obszary pamięci o kolejnych adresach. Wykład 11, str. 3 Organizacja pamięci Przykład: M amy deklarację: int tab [10][20]; Rezerwujemy dla niej blok długości 800 bajtów zaczynający się od adresu 1000. Jak zostanie przetłumaczona komenda tab[2][1] = 0; ? 0 1 2 18 19 · · · 0 1000 1004 1008 1072 1076 1 1080 1084 1088 · · · 1152 1156 2 1160 1164 1168 · · · 1232 1236 ··· ··· ··· ··· ··· ··· 8 1640 1644 1648 · · · 1712 1716 9 1720 1724 1728 · · · 1792 1796 Odpowiedź: Każdy wiersz tablicy zawiera 20 liczb. Element tab[2][1] jest poprzedzony 2 całymi wierszami tablicy po 20 liczb oraz 1 liczbą własnego wiersza; a więc jest poprzedzony 2 · 20 + 1 liczbami tablicy; a więc jest odsunięty od początku obszaru poświęconego na tablicę o (2 · 20 + 1) · 4 bajtów; wobec tego zajmuje bajty od 1000 + (2 · 20 + 1) · 4 do 1003 + (2 · 20 + 1) · 4 czyli 1164–1167. A więc tłumaczenie komendy: wyzerować bajty 1164–1167 . Wykład 11, str. 4 Organizacja pamięci Przykład: M amy deklarację: T tab[n][m][p]; przy czym pojedynczy element typu T zajmuje b bajtów; a początek tablicy jest w bajcie a. Które adresy należą do elementu tab[i][j][k] ? Odpowiedź: Element tab[i][j][k] na tablicę o (i · m + j) · p + k · b jest odsunięty od początku obszaru poświęconego bajtów; wobec tego zaczyna się w bajcie (i · m + j) · p + k · b + a Uwaga: Podobne obliczenie dla języków, w których tablice mogą się zaczynać od indeksów różnych od zera, jest trochę bardziej skomplikowane. Wykład 11, str. 5 Organizacja pamięci w czasie działania #define n 1000 #define k 26 typedef struct os { char nazw[k]; int zar; } Osoba; Osoba kart[n]; int p; int main () { p = 500; kart[p].zar = kart[p+1].zar + 200; p = 720; kart[p].nazw[5] = ’a’; ttttttttttttttt return 0; } . . . 25 26 27 28 ... nazw zar osoba 0 1 2 3 4 zmienna x.nazw x.nazw[i] x.zar kart[0] kart[j] kart[j].nazw[i] 29 adres w pamięci (adres x) (adres x) + i (adres x) + 26 (adres kart) (adres kart) + j·30 (adres kart) + j·30 + i pobierz zaw. 4 bajtów od (adres p) pomnóż przez 30 dodaj 5 dodaj (adres kart) pod wyliczony adr. włóż kod ASCII znaku ’a’ Wykład 11, str. 6 Organizacja pamięci • Każdemu wywołaniu funkcji odpowiada obszar danych zawierający miejsce na lokalne zmienne oraz parametry tej funkcji. • Adres początku tego obszaru ustala się w czasie wykonania programu. Jego wielkość i rozmieszczenie (przesunięcie) poszczególnych zmiennych w stosunku do jego początku ustala się w czasie tłumaczenia programu. Przykład: M void sil(int n, int* w) { int w1; if (n==0) *w = 1; else { sil(n-1,&w1); *w = n*w1; } } W czasie tłumaczenia ustala się kształt obszaru danych: 0 1 2 3 4 5 6 7 8 9 10 11 n w w1 Potem w czasie wykonania przy każdym wywołaniu procedury rezerwuje się jedną taką „paczkę” zmiennych. Wykład 11, str. 7 Organizacja pamięci Przykład: M void sil(int n, int* w) { int w1; if (n==0) *w = 1; else { sil(n-1,&w1); *w = n*w1; } } s sil(3,&s); n ❑ w w1 3 n w ✕ w1 2 n w ✕ w1 1 n w ✕ w1 0 Wykład 11, str. 8 Tłumaczenie wyrażeń Po analizie składniowej wyrażenia są w postaci drzew; np. = z = (x − y) + (x − 2) ∗ 5; + z ∗ − x y x przekład stałej s przekład zmiennej o adr. z − przekład wyrażenia T1 T2 = przekład przypisania z T 5 − 2 na stos liczbę s na stos liczbę spod adr. z przekład T1 ; przekład T2 ; odejmij od przedostatniego na stosie ostatni na stosie na stos adres z; przekład T ; pod adres przedostatni na stosie włóż wartość ostatnią na stosie Wykład 11, str. 9 Tłumaczenie wyrażeń = przekład st. s przekład zm. o adr. z + z − przekład wyr. ∗ − x y T1 5 − = przekład przyp. x 2 PROGRAM: na stos adres 52; na stos liczbę spod adr. 50; na stos liczbę spod adr. 51; odejmowanie; na stos liczbę spod adr. 50; na stos liczbę 2; odejmowanie; na stos liczbę 5; mnożenie; dodawanie; przypisanie T2 z T na stos liczbę s na stos liczbę spod adr. z przekład T1 ; przekład T2 ; odejmij od przedost. na stosie ost. na stosie na stos adres z; przekład T ; pod adres przedost. na stosie włóż wartość ost. na stosie PAMIĘĆ: ··· STOS: 50 51 52 15 x 3 y −4 z ◆ 52 12 15 52 12 13 5 ···