비로컬 변수

Non-local variable

프로그래밍 언어 이론에서 비 로컬 변수는 로컬 범위에 정의되지 않은 변수다.용어는 글로벌 변수를 지칭할 수 있지만, 일부 변수가 로컬 또는 글로벌 범위 내에 있을 수 없는 내포익명 함수의 맥락에서 주로 사용된다.

루아에서 그것들은 함수의 업값이라고 불린다.[1]

내포함수

다음에 나오는 Python 3 예에는 중첩된 함수가 있다.inner다른 함수의 범위에서 정의됨outer. 변수x에 현지적이다.outer, 그러나 에 로컬이 아닌.inner(전지구적도 아님):

반항하다 바깥의():     x = 1     반항하다 내면의():         국외의 x         x += 1         인쇄하다(x)     돌아오다 내면의 

Javascript에서 변수의 위치성은 가장 가까운 위치에 의해 결정된다.var이 변수에 대한 문장.다음 예에서는x에 현지적이다.outerA을 포함하고 있는 바와 같이 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등급 기능을 지원하기 어려운 주요 이유다.

내포된 함수나 함수가 (상호적으로) 재귀적경우, 프레임 포인터는 내포된 함수 자체의 로컬 변수만을 가리키고 그 사이에 스택에 임의의 수의 활성화 레코드가 있을 수 있기 때문에 컴파일러호출 스택에서 비 로컬 변수가 할당된 위치를 정확히 알기가 어려워진다.이것은 일반적으로 액세스 링크디스플레이 레지스터를 사용하여 해결된다.

내포된 함수가 고차 함수에 대한 인수로 전달되는 경우 비 로컬 변수를 찾기 위해 폐쇄를 구축해야 한다.내포된 함수가 외부 함수의 결과로 반환되는 경우(또는 변수에 저장됨) 로컬이 아닌 변수는 스택에서 더 이상 사용할 수 없게 된다.대신 힙을 할당해야 하며, 해당 힙의 수명은 이들을 선언하고 할당했던 외부 함수의 수명을 초과한다.이것은 일반적으로 쓰레기 수거를 요구한다.

메모들

참조