비로컬 변수
Non-local variable프로그래밍 언어 이론에서 비 로컬 변수는 로컬 범위에 정의되지 않은 변수다.용어는 글로벌 변수를 지칭할 수 있지만, 일부 변수가 로컬 또는 글로벌 범위 내에 있을 수 없는 내포 및 익명 함수의 맥락에서 주로 사용된다.
예
내포함수
다음에 나오는 Python 3 예에는 중첩된 함수가 있다.inner
다른 함수의 범위에서 정의됨outer
. 변수x
에 현지적이다.outer
, 그러나 에 로컬이 아닌.inner
(전지구적도 아님):
반항하다 바깥의(): x = 1 반항하다 내면의(): 국외의 x x += 1 인쇄하다(x) 돌아오다 내면의
Javascript에서 변수의 위치성은 가장 가까운 위치에 의해 결정된다.var
이 변수에 대한 문장.다음 예에서는x
에 현지적이다.outer
A을 포함하고 있는 바와 같이 var x
한편, 진술inner
하지 않는다.따라서 x는 다음에 로컬이 아닌inner
:
기능을 하다 바깥의() { 시합을 하다 x = 1; 기능을 하다 내면의() { x += 1; 위로하다.통나무를 하다(x); } 돌아오다 내면의; }
익명 함수
변수를 따르는 Haskell 예제c
익명 함수의 로컬이 아님\x -> x + c
:
바깥의 = 하게 하다 c = 1 에 지도를 그리다 (\x -> x + c) [1, 2, 3, 4, 5]
구현 문제
비 로컬 변수는 프로그래밍 언어에서 중첩, 익명, 고차 및 그에 따른 1등급 기능을 지원하기 어려운 주요 이유다.
내포된 함수나 함수가 (상호적으로) 재귀적인 경우, 프레임 포인터는 내포된 함수 자체의 로컬 변수만을 가리키고 그 사이에 스택에 임의의 수의 활성화 레코드가 있을 수 있기 때문에 컴파일러가 호출 스택에서 비 로컬 변수가 할당된 위치를 정확히 알기가 어려워진다.이것은 일반적으로 액세스 링크나 디스플레이 레지스터를 사용하여 해결된다.
내포된 함수가 고차 함수에 대한 인수로 전달되는 경우 비 로컬 변수를 찾기 위해 폐쇄를 구축해야 한다.내포된 함수가 외부 함수의 결과로 반환되는 경우(또는 변수에 저장됨) 로컬이 아닌 변수는 스택에서 더 이상 사용할 수 없게 된다.대신 힙을 할당해야 하며, 해당 힙의 수명은 이들을 선언하고 할당했던 외부 함수의 수명을 초과한다.이것은 일반적으로 쓰레기 수거를 요구한다.
메모들
참조
- 아호, 람, 세티, 울만."7.3 스택의 비로컬 데이터에 대한 액세스".컴파일러: 원칙, 기술 및 도구.제2판.