100 likes | 251 Views
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. Aktiveringsposter. =underprogram. Data som bruka finnas i aktiveringsposter är bl.a.
E N D
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 F. Drewes, Inst. f. datavetenskap
Aktiveringsposter =underprogram 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]). F. Drewes, Inst. f. datavetenskap
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 avaktiva UP. F. Drewes, Inst. f. datavetenskap
lokala variabler parametrar AP subn+1 statisk länk dynamisk länk återhoppsadress AP subn AP subn AP sub1 AP sub1 AP main AP main subn anropar subn+1 subn+1 terminerar Anrop och återhopp F. Drewes, Inst. f. datavetenskap
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) F. Drewes, Inst. f. datavetenskap
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) • skapa en separat stack för varje variabelnamn (inga variabler lagras på exekveringsstacken) • 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? F. Drewes, Inst. f. datavetenskap
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 F. Drewes, Inst. f. datavetenskap
Att underhålla en statisk kedja • 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 djupetsd(id) av en identifierare id Antag att sub deklareras i subdecl och anropas i subanr. Genom att börja med den översta aktiveringsposten och följa den statiska kedjansd(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 omdinte blir stort F. Drewes, Inst. f. datavetenskap
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 F. Drewes, Inst. f. datavetenskap
sd(P)=0 sd(P)=0 sd(A)=1 sd(A)=1 nesting depth = sd(A) – sd(A) = 0 nesting depth = sd(A) – sd(P) = 1 sd(B)=1 sd(B)=1 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 A end B; begin a = b = false; A end P. F. Drewes, Inst. f. datavetenskap