Nicht lokale Variable - Non-local variable

In der Programmiersprachtheorie ist eine nicht lokale Variable eine Variable, die im lokalen Bereich nicht definiert ist. Während sich der Begriff auf globale Variablen beziehen kann, wird er hauptsächlich im Zusammenhang mit verschachtelten und anonymen Funktionen verwendet, bei denen einige Variablen weder im lokalen noch im globalen Bereich liegen können .

In Lua werden sie die Aufwärtswerte der Funktion genannt.

Beispiele

Verschachtelte Funktionen

Im folgenden Python 3-Beispiel ist eine verschachtelte Funktion inner im Bereich einer anderen Funktion definiert outer . Die Variable x ist lokal für outer , aber nicht lokal für inner (noch ist sie global):

def outer():
    x = 1
    def inner():
        nonlocal x
        x += 1
        print(x)
    return inner

In Javascript wird die Lokalität einer Variablen durch die nächstgelegene var Anweisung für diese Variable bestimmt. Im folgenden Beispiel x ist es lokal für, outer da es eine var x Anweisung enthält , während inner dies nicht der Fall ist. Daher ist x nicht lokal für inner :

function outer() {
    var x = 1;
    function inner() {
        x += 1;
        console.log(x);
    }
    return inner;
}

Anonyme Funktionen

Im folgenden Haskell-Beispiel ist die Variable c in der anonymen Funktion nicht lokal \x -> x + c :

outer = let c = 1 in map (\x -> x + c) [1, 2, 3, 4, 5]

Umsetzungsfragen

Nicht-lokale Variablen sind der Hauptgrund dafür, dass es schwierig ist, verschachtelte, anonyme Funktionen höherer Ordnung und damit erstklassige Funktionen in einer Programmiersprache zu unterstützen.

Wenn die verschachtelte Funktion oder die verschachtelten Funktionen (gegenseitig) rekursiv sind , kann der Compiler nur schwer genau wissen, wo auf dem Aufrufstapel die nicht lokale Variable zugewiesen wurde, da der Frame-Zeiger nur auf die lokale Variable der verschachtelten Funktion selbst und verweist Dazwischen kann sich eine beliebige Anzahl von Aktivierungsdatensätzen auf dem Stapel befinden. Dies wird im Allgemeinen mithilfe von Zugriffslinks oder Anzeigeregistern gelöst .

Wenn die verschachtelte Funktion als Argument an eine Funktion höherer Ordnung übergeben wird, muss ein Abschluss erstellt werden, um die nicht lokalen Variablen zu lokalisieren. Wenn die verschachtelte Funktion als Ergebnis ihrer äußeren Funktion zurückgegeben (oder in einer Variablen gespeichert) wird, sind die nicht lokalen Variablen nicht mehr auf dem Stapel verfügbar. Stattdessen muss ihnen ein Heap zugewiesen werden, und ihre Lebensdauer erstreckt sich über die Lebensdauer der äußeren Funktion hinaus, die sie deklariert und zugewiesen hat. Dies erfordert im Allgemeinen eine Speicherbereinigung.

Anmerkungen

Verweise