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