Icke-lokal variabel
I programmeringsspråksteori är en icke-lokal variabel en variabel som inte är definierad i det lokala omfånget . Även om termen kan hänvisa till globala variabler , används den främst i samband med kapslade och anonyma funktioner där vissa variabler varken kan vara i det lokala eller globala omfånget .
I Lua kallas de för funktionens uppvärden .
Exempel
Kapslade funktioner
I Python 3-exemplet som följer finns en kapslad funktion inre
definierad inom ramen för en annan funktion yttre
. Variabeln x
är lokal till yttre
, men icke-lokal till inre
(inte heller global):
def yttre (): x = 1 def inre (): icke-lokal x x += 1 utskrift ( x ) retur inre
I Javascript bestäms lokaliteten för en variabel av den närmaste var
-satsen för denna variabel. I följande exempel x
lokal till yttre
eftersom den innehåller en var x
-sats, medan inre
inte gör det. Därför är x icke-lokal till inre
:
function yttre () { var x = 1 ; funktion inre () { x += 1 ; konsol . log ( x ); } returnera inre ; }
Anonyma funktioner
I Haskell-exemplet som följer är variabeln c
icke-lokal i den anonyma funktionen \x -> x + c
:
yttre = låt c = 1 i kartan ( \ x -> x + c ) [ 1 , 2 , 3 , 4 , 5 ]
Implementeringsfrågor
Icke-lokala variabler är den främsta anledningen till att det är svårt att stödja kapslade, anonyma, högre ordningens och därmed förstklassiga funktioner i ett programmeringsspråk.
Om den kapslade funktionen eller funktionerna är (ömsesidigt) rekursiva , blir det svårt för kompilatorn att veta exakt var på anropsstacken den icke-lokala variabeln allokerades, eftersom rampekaren endast pekar på den lokala variabeln för själva den kapslade funktionen och det kan finnas ett godtyckligt antal aktiveringsposter på stacken däremellan. Detta löses vanligtvis med hjälp av åtkomstlänkar eller visningsregister .
Om den kapslade funktionen skickas som ett argument till en högre ordningsfunktion måste en stängning byggas för att lokalisera de icke-lokala variablerna. Om den kapslade funktionen returneras som ett resultat av dess yttre funktion (eller lagras i en variabel) kommer de icke-lokala variablerna inte längre att vara tillgängliga i stacken. De måste tilldelas högar istället, och deras livstid sträcker sig längre än livslängden för den yttre funktion som deklarerade och tilldelade dem. Detta kräver i allmänhet sophämtning.
Anteckningar
- Aho, Lam, Sethi och Ullman. "7.3 Tillgång till icke-lokal data på stacken". Kompilatorer: principer, tekniker och verktyg . Andra upplagan.