Articulo de referencia

Variable no local

En la teoría de los lenguajes de programación , una variable no local es aquella que no está definida en el ámbito local . Si bien el término puede referirse a variables globale...

En la teoría de los lenguajes de programación , una variable no local es aquella que no está definida en el ámbito local . Si bien el término puede referirse a variables globales , se utiliza principalmente en el contexto de funciones anidadas y anónimas , donde algunas variables no pueden estar ni en el ámbito local ni en el global .

En Lua se les llama valores ascendentes de la función. [ 1 ]

Ejemplos

Funciones anidadas

En el siguiente ejemplo de Python 3 hay una función anidada innerdefinida en el ámbito de otra función outer. La variable xes local a outer, pero no local a inner(ni es global):

from typing import Callabledef outer () -> Callable [[], None ]: x : int = 1 def inner () -> None : nonlocal x x += 1 print ( x ) return inner

En JavaScript, la localidad de una variable se determina por la varinstrucción más cercana a dicha variable. En el siguiente ejemplo, xes local a outerya que contiene una var xinstrucción, mientras que innerno. Por lo tanto, x no es local a inner:

función exterior () { var x = 1 ; función interior () { x += 1 ; console . log ( x ); } return interior ; }

Funciones anónimas

En el siguiente ejemplo de Haskell, la variable cno es local en la función anónima \x -> x + c:

exterior = sea c = 1 en map ( \ x -> x + c ) [ 1 , 2 , 3 , 4 , 5 ]

Problemas de implementación

Las variables no locales son la razón principal por la que resulta difícil admitir funciones anidadas, anónimas, de orden superior y, por lo tanto, de primera clase en un lenguaje de programación.

Si la función o funciones anidadas son recursivas (mutuamente) , al compilador le resulta difícil saber con exactitud dónde se asignó la variable no local en la pila de llamadas , ya que el puntero de marco solo apunta a la variable local de la función anidada y puede haber un número arbitrario de registros de activación en la pila. Esto generalmente se resuelve utilizando enlaces de acceso o registros de visualización .

Si la función anidada se pasa como argumento a una función de orden superior, es necesario crear un cierre para localizar las variables no locales. Si la función anidada se devuelve como resultado de su función externa (o se almacena en una variable), las variables no locales ya no estarán disponibles en la pila. En su lugar, deben asignarse en el montón, y su ciclo de vida se extiende más allá del de la función externa que las declaró y asignó. Esto generalmente requiere la intervención del recolector de basura.

Notas

  1. Programación en Lua (primera edición) , " 27.3.3 – Valores ascendentes "

Referencias

  • Aho, Lam, Sethi y Ullman. "7.3 Acceso a datos no locales en la pila". Compiladores: Principios, técnicas y herramientas . Segunda edición.