• Keine Ergebnisse gefunden

Speicherzuweisung auf dem Stack

N/A
N/A
Protected

Academic year: 2022

Aktie "Speicherzuweisung auf dem Stack"

Copied!
21
0
0

Wird geladen.... (Jetzt Volltext ansehen)

Volltext

(1)

1 Speicherzuweisung auf dem Stack

2 Zugriff auf nichtlokale Daten auf dem Stack Static Links

Displays

(2)

Beispiel: Quicksort

inta[11];

voidr(void){/∗... read integers into a[1] to a[9] ...∗/

int i;

}

intp(intm,int n){ /∗choose pivot element p,

partition array into{ x|x<p},{ x|x>= p}

return position of p ...∗/

}

voidq(intm,intn){ int i;

if(n>m){

i = p(m, n); /∗partition array ∗/

q(m, i−1);/∗sort left part ∗/

q(i+1, n);/∗sort right part ∗/

} }

intmain(void){

r(); a[0] =−INT MIN; a[10] = INT MAX;

q(1,9);

}

(3)

Stack mit Activation Records

main

int a[11]

main

(4)

Stack mit Activation Records

main

r

int a[11]

main r int i

(5)

Stack mit Activation Records

main

r q(1,9)

int a[11]

main int m, n

q(1,9) int i

(6)

Stack mit Activation Records

main

r q(1,9)

p(1,9) q(1,3)

p(1,3) q(1,0)

int a[11]

main int m, n

q(1,9) int i int m, n

q(1,3) int i

(7)

1 Speicherzuweisung auf dem Stack

2 Zugriff auf nichtlokale Daten auf dem Stack Static Links

Displays

(8)

Skizze eines Programms mit geschachtelten Prozeduren

typedef int(∗function pointer)(intparameter);

voida(int x){

int b(function pointer f){

/∗... ∗/ intres = f(x);/∗ ...∗/

returnres;

}

voidc(inty){ int d(intz) {

/∗... ∗/int res = x∗y + z;/∗...∗/

returnres;

} /∗... ∗/

b(d);

/∗... ∗/

} c(1);

}

(9)

Prozedurparameter / Prozedurvariablen

Prozeduren als Parameter werden als Closure implementiert.

Definition Closure: Paar aus<Funktion, statischer Umgebung>;

erlaubt korrekten Zugriff auf nichtlokale Variablen.

Implementierung: Paar<Einsprungadresse, Link zur statischen Umgebug>

(10)

Activation Record Stack mit Zugriffslinks

a

c static link

b static link f :<d,>

a

c static link

b static link f :<d,>

d static link

(11)

Displays

Problem:bei Zugriffen auf ¨aussere Variablen aus tief

verschachtelten Prozeduren m¨ussen viele Zugriffslinks verfolgt werden.

Abhilfe:Displays (Dijkstra [1]). Displays sind ein Hilfsarray d. Dieses enth¨alt die Adressen der geschachtelten Activation Records.

1 Eintrag pro statische Tiefe:

di = adr(ARi)

ARi = Activation Record des letzten Aufrufs der statischen Tiefei

(12)

Displays

Implementierung:

Bei Aufruf einer Funktion der Tiefe i:

d[i] sichern; d[i] neu setzen aufadr(AR); Beim R¨ucksprung d[i] wiederherstellen.

Die Eintr¨age des Displays werden in Registerbank organisiert.

Der Rest mit static Link.

Bei n Registern:

d[0]

d[1]

...

d[n−1]









in Registern

d[n]

d[n+ 1]

...





static Links

(13)

Quicksort mit verschachtelten Prozeduren

intmain(void){

int a[11] ={INT MIN,6,5,3,4,2,5,19,9,9,INT MAX};

voidq(intl,intr){

voide(inte1,inte2){ /∗ exchange 2 elements∗/

intt = a[e1]; a[e1] = a[e2]; a[e2] = t;

}

voidp(intl,intr){

/∗choose pivot element and partition∗/

/∗... ∗/e(x, y); /∗ ...∗/

} if(l>r)

return;

int i = p(m, n);/∗ partition array∗/

q(l, i−1);

q(i+1, r);

(14)

Displays

d[0]

d[1]

d[2]

s q(1,9) saved d[2]

(15)

Displays

d[0]

d[1]

d[2]

s q(1,9) saved d[2]

q(1,3) saved d[2]

(16)

Displays

d[0]

d[1]

d[2]

s q(1,9) saved d[2]

q(1,3) saved d[2]

p(1,3) saved d[3]

(17)

Displays

d[0]

d[1]

d[2]

s q(1,9) savedd[2]

q(1,3) savedd[2]

p(1,3) savedd[3]

(18)

Prozedurparameter mit Displays

d[0]

d[1]

d[2]

a(...) x savedd[0]

c(...) y savedd[1]

(19)

Prozedurparameter mit Displays

d[0]

d[1]

d[2]

a(...) x savedd[0]

c(...) y savedd[1]

b(...) f:<d,·>

savedd[1]

(20)

Prozedurparameter mit Displays

d[0]

d[1]

d[2]

a(...) x savedd[0]

c(...) y savedd[1]

b(...) f:<d,·>

savedd[1]

f, savedd[0]

f, savedd[1]

d(...) savedd[2]

(21)

Literatur

[Dijkstra, 1960] E. W. Dijkstra.

Recursive Programming.

Numerische Mathemtik 2, 312–318, 1960.

Referenzen

ÄHNLICHE DOKUMENTE

❚ Variablen, die im Rumpf vorkommen, aber nicht gebunden sind, heißen frei (bzgl. eines Blockes).. Auswertestrategie

Aufruf einer anderen Prozedur Restaurieren von $t0. •

Aufruf einer anderen Prozedur Restaurieren von $t0. •

Wir m¨ ussen jetzt nur noch zeigen, dass dies auch die kleinste obere Schranke ist, dass also kein Γ &lt; α −1 obere Schranke von

verschiebe den Knoten mit der kleinsten Distanz von rest nach opti4. berechne die Distanzen für die Knoten in

Stacks intelligently show the most relevant items first or you can set the sort order to make sure the items you care about most always appear at the top of the stack.. To

 nicht ganz so tragisch, da Speicher zu Programmende durch Betriebssystem wieder freigegeben wird. •

Doppelt verkettete Listen bestehen aus Listenzellen mit zwei Zeigern. • Ein Zeiger prev auf die