F. Drewes, Inst. f. datavetenskap1 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. datavetenskap2 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
F. Drewes, Inst. f. datavetenskap3 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.
F. Drewes, Inst. f. datavetenskap4 Anrop och återhopp AP sub n AP sub 1 AP main AP sub 1 AP sub n sub n+1 terminerar parametrar statisk länk dynamisk länk återhoppsadress lokala variabler AP main AP sub 1 AP sub n sub n anropar sub n+1 AP sub n+1
F. Drewes, Inst. f. datavetenskap5 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. datavetenskap6 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?
F. Drewes, Inst. f. datavetenskap7 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. datavetenskap8 Att underhålla en statisk kedja Antag att sub deklareras i sub decl och anropas i sub anr. Genom att börja med den översta aktiveringsposten och följa den statiska kedjan sd(sub anr ) – sd(sub decl ) ("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)=0om id är huvudprogrammet sd(id)=sd(sub)+1om id deklareras i UP sub Det viktigaste värdet är det statiska djupet sd(id) av en identifierare id
F. Drewes, Inst. f. datavetenskap9 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(sub decl )] om x är deklarerad i sub decl 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. datavetenskap10 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. 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