Нелокальная переменная - Non-local variable
В теория языков программирования, а нелокальная переменная - это переменная, не определенная в локальной области видимости. Хотя этот термин может относиться к глобальным переменным, он в основном используется в контексте вложенный и анонимные функции где некоторые переменные не могут быть ни в местный ни глобальный масштаб.
В Lua их называют повышение стоимости функции.[1]
Примеры
Вложенные функции
В следующем примере Python 3 есть вложенная функция внутренний
определяется в рамках другой функции внешний
. Переменная Икс
является местным для внешний
, но не локальный для внутренний
(и не глобально):
def внешний(): Икс = 1 def внутренний(): нелокальный Икс Икс += 1 Распечатать(Икс) возвращаться внутренний
В Javascript местоположение переменной определяется ближайшим вар
оператор для этой переменной. В следующем примере Икс
является местным для внешний
поскольку он содержит var x
заявление, в то время как внутренний
нет. Следовательно, x нелокален для внутренний
:
функция внешний() { вар Икс = 1; функция внутренний() { Икс += 1; консоль.бревно(Икс); } возвращаться внутренний;}
Анонимные функции
В примере Haskell, который следует за переменной c
не является локальным в анонимной функции х -> х + с
:
внешний = позволять c = 1 в карта (\Икс -> Икс + c) [1, 2, 3, 4, 5]
Проблемы реализации
Нелокальные переменные - основная причина, по которой трудно поддерживать вложенные, анонимные, более высокого порядка и таким образом первоклассные функции на языке программирования.
Если вложенная функция или функции (взаимно) рекурсивный, становится трудно для компилятор чтобы точно знать, где на стек вызовов нелокальная переменная была выделена, поскольку указатель кадра указывает только на локальную переменную самой вложенной функции, и может быть произвольное количество записи активации в стеке между ними. Обычно это решается с помощью ссылки доступа или же регистры дисплея.
Если вложенная функция передается в качестве аргумента функции более высокого порядка, a закрытие необходимо построить, чтобы найти нелокальные переменные. Если вложенная функция возвращается в результате своей внешней функции (или сохраняется в переменной), нелокальные переменные больше не будут доступны в стеке. Вместо этого они должны быть размещены в куче, а их время жизни превышает время жизни внешней функции, которая их объявила и распределила. Обычно для этого требуется сборка мусора.
Примечания
Рекомендации
- Ахо, Лам, Сетхи и Ульман. «7.3 Доступ к нелокальным данным в стеке». Компиляторы: принципы, методы и инструменты. Второе издание.