Föreläsning 9: Implementering av underprogram
description
Transcript of Föreläsning 9: Implementering av underprogram
2002-11-29 F. Drewes, Inst. f. datavetenskap
1
Föreläsning 9:Implementering av underprogram
• Aktiveringsposter• Exekveringsstacken• Implementera dynamisk räckvidd med dynamiska länkar• Implementera statisk räckvidd med
statiska länkar displaymetoden
2002-11-29 F. Drewes, Inst. f. datavetenskap
2
Aktiveringsposter
Data som bruka finnas i aktiveringsposter är bl.a.• minnesutrymme till lokala variabler och parametrar• statiska och/eller dynamiska länkar till andra aktiverings-
poster• återhoppsadressen (på vilket ställe i programmet
fortsätter exekveringen när UP:s exekvering avslutats?)
Data som behövs för att sköta anrop av UP lagras i aktiveringsposter (eng. activation record [instance]).
=underprogram
2002-11-29 F. Drewes, Inst. f. datavetenskap
3
Exekveringsstacken
• När ett UP anropas placeras motsvarande aktiveringspost på stacken.
• När exekveringen avslutas tas aktiveringsposten bort igen.
• Den dynamiska länken pekar till föregående aktiverings-post (som tillhör det anropande UP:et)
• Den statiska länken pekar till närmaste aktiveringsposten som motsvarar den statiska föräldern
På exekveringsstacken lagras aktiveringsposter som representerar de nästade anropen av aktiva UP.
2002-11-29 F. Drewes, Inst. f. datavetenskap
4
Anrop och återhopp
AP subn
AP sub1
AP main
AP main
AP sub1
AP subn
subn+1 terminerar
parametrar
statisk länk
dynamisk länk
återhoppsadress
lokala variabler
AP main
AP sub1
AP subn
subn anropar subn+1
AP subn+1
2002-11-29 F. Drewes, Inst. f. datavetenskap
5
Dynamiska länkar
• Den dynamiska länken visar var den dynamiska förälderns (föregående) aktiveringspost ligger
• Den behövs bl.a. för att kunna ta bort den översta aktive-ringsposten vid återhopp (eftersom storleken kan variera)
• Kedjan som utgörs av alla dynamiska länkar och som representerar anropssekvensen kallas dynamisk kedja (eng. dynamic chain) eller anropskedja (eng. call chain)
2002-11-29 F. Drewes, Inst. f. datavetenskap
6
Implementera dynamisk räckvidd
• Djup access följ anropskedjan tills en aktiveringspost har hittats som
innehåller en variabel med rätt namn lätt att implementera, snabba anrop men ineffektiv access
• Grund access (två varianter)a) skapa en separat stack för varje variabelnamn (inga
variabler lagras på exekveringsstacken)b) skapa en separat tabell för variablerna ("globala" värden
av lokala variabler lagras i aktiveringsposten så länge ett UP är aktivt)
konstant accesstid men mindre effektiva anrop
Hur hittas en icke-lokal variabel vid dynamisk räckvidd?
2002-11-29 F. Drewes, Inst. f. datavetenskap
7
Statiska länkar
• Den statiska länken pekar på aktiveringsposten som motsvarar det senaste anropet av den statiska föräldern
• Statiska länkar behövs för att implementera statisk räckvidd
• Två möjligheter: använd den statiska kedjan på samma sätt på vilket den
dynamiska kedjan används vid dynamisk räckvidd spara de åtkomliga statiska länkarna i en separat tabell
("display"); länkarna som inte är åtkomliga sparas temporärt i aktiveringsposterna
2002-11-29 F. Drewes, Inst. f. datavetenskap
8
Att underhålla en statisk kedja
Antag att sub deklareras i subdecl och anropas i subanr.
Genom att börja med den översta aktiveringsposten och följa den statiska kedjan sd(subanr) – sd(subdecl) ("nesting
depth") steg hittas aktiveringsposten som den nya statiska länken måste peka på.
Icke-lokala variabler hittas på samma sätt.
snabb access om d inte blir stort
sd(id)=0 om id är huvudprogrammet sd(id)=sd(sub)+1 om id deklareras i UP sub
Det viktigaste värdet är det statiska djupet sd(id) av en identifierare id
2002-11-29 F. Drewes, Inst. f. datavetenskap
9
Att underhålla en display
Displaymetoden är ett alternativ till den statiska kedjan• displayen är ett fält bestående av statiska länkar disp[0],
…,disp[D] där D är det maximala statiska djupet• disp[d] är länken till aktiveringsposten som motsvarar det
senaste anropet av ett UP sub där sd(sub)=d• Aktiveringsposten som innehåller variabeln x nås mha
länken disp[sd(subdecl)] om x är deklarerad i subdecl
När sub anropas placeras länken till dess aktiveringspost i disp[sd(sub)]. Det gamla värdet sparas i aktiveringsposten
och återställs när sub terminerar. konstant accesstid men lite mindre effektiva anrop
2002-11-29 F. Drewes, Inst. f. datavetenskap
10
Exempel
program P;bool a,b;procedure A;
bool a;begin
a = true;if a b then B
end A;procedure B;begin
if a then Aend B;
begina = b = false;A
end P.
sd(P)=0
sd(A)=1
sd(B)=1
nesting depth = sd(A) – sd(A) = 0
nesting depth = sd(A) – sd(P) = 1
sd(P)=0
sd(A)=1
sd(B)=1