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
···