Variable non locale - Non-local variable

Dans la théorie du langage de programmation , une variable non locale est une variable qui n'est pas définie dans la portée locale. Bien que le terme puisse faire référence à des variables globales, il est principalement utilisé dans le contexte de fonctions imbriquées et anonymes où certaines variables ne peuvent être ni dans la portée locale ni dans la portée globale .

En Lua, elles sont appelées les valeurs ascendantes de la fonction.

Exemples

Fonctions imbriquées

Dans l'exemple Python 3 qui suit, une fonction imbriquée est inner définie dans la portée d'une autre fonction outer . La variable x est locale à outer , mais non locale à inner (ni globale):

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

En Javascript, la localité d'une variable est déterminée par l' var instruction la plus proche de cette variable. Dans l'exemple suivant, x est local à outer car il contient une var x instruction, alors inner que non. Par conséquent, x n'est pas local pour inner :

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

Fonctions anonymes

Dans l'exemple Haskell qui suit, la variable c n'est pas locale dans la fonction anonyme \x -> x + c :

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

Problèmes de mise en œuvre

Les variables non locales sont la principale raison pour laquelle il est difficile de prendre en charge des fonctions imbriquées, anonymes, d'ordre supérieur et donc de première classe dans un langage de programmation.

Si la ou les fonctions imbriquées sont (mutuellement) récursives , il devient difficile pour le compilateur de savoir exactement où sur la pile d'appels la variable non locale a été allouée, car le pointeur de cadre pointe uniquement vers la variable locale de la fonction imbriquée elle-même et il peut y avoir un nombre arbitraire d' enregistrements d'activation sur la pile entre les deux. Ceci est généralement résolu en utilisant des liens d'accès ou des registres d'affichage .

Si la fonction imbriquée est passée comme argument à une fonction d'ordre supérieur, une fermeture doit être construite afin de localiser les variables non locales. Si la fonction imbriquée est renvoyée à la suite de sa fonction externe (ou stockée dans une variable), les variables non locales ne seront plus disponibles sur la pile. Ils doivent être alloués en tas à la place et leur durée de vie s'étend au-delà de la durée de vie de la fonction externe qui les a déclarés et alloués. Cela nécessite généralement un garbage collection.

Remarques

Les références