0

통역사에서 구현되는 값 전달 방식은 쉽습니다 (예 : 일상적인 명령형 언어). 각 범위에 대해 식별자를 해당 값에 매핑하는 환경을 유지 관리합니다. 함수 호출을 처리하는 것은 새로운 환경을 생성하고 인수의 복사본을 채우는 것을 포함합니다.인터프리터에서 참조로 전달되는 인수의 의미 구현

참조로 전달 된 인수를 허용하는 경우에는 작동하지 않습니다. 이 사건은 일반적으로 어떻게 처리됩니까?

+1

함수 호출의 새 환경을 참조 사본으로 채 웁니다. 너는 어떻게 할거야? –

+0

"int"(예 : C++에서) 참조를 전달하면 복사 할 수있는 참조가 없습니다. – abeln

답변

1

먼저 통역사는 인수가 참조로 전달 될 수있는 것이지 (인수가 할당 문의 왼쪽에서 합법적인지 확인해야 함) 확인해야합니다. 예를 들어, f에 단일 참조 별 매개 변수가있는 경우 f(x)은 괜찮습니다 (x := y이 적합하므로). f(1+1)은 (1+1 := y은 의미가 없습니다). 일반적인 한정 인수는 배열 색인과 같은 변수 및 유사 구조입니다. 이 5이 합법적 색인 인 배열 인 경우 f(a[5])이 적합합니다 (a[5] = y이 적합 함).

인수가 해당 검사를 통과하면 정확한 메모리 위치가 참조되는 함수 호출을 처리하는 동안 인터프리터가이를 판별 할 수 있습니다. 새 환경을 구성 할 때 해당 메모리 위치에 대한 참조를 참조 전달 매개 변수의 값으로 지정합니다. 그 참조가 구체적으로 보이는 것은 인터프리터의 디자인, 특히 변수를 나타내는 방법에 달려 있습니다. 구현 언어가 포인터를 지원하면 간단하게 포인터를 사용할 수 있지만 디자인에서 호출 할 경우 포인터가 더 복잡 할 수 있습니다 (중요한 것은 참조는 참조되는 메모리 위치에 포함 된 값을 검색하고 수정할 수 있어야한다는 것입니다.

해석자가 함수의 본문을 해석하는 동안 환경에 적절한 참조가 포함되어 있지 않으므로 참조별로 매개 변수를 특별히 처리해야 할 수 있습니다. 통역사가 이것을 알아야하고 참조 번호가 가리키는 것을 찾아야합니다. 예를 들어, x이 로컬 변수이고 y이 참조 전달 매개 변수 인 경우 x+1y+1 (사용자의 인터프리터 세부 사항에 따라 다름)이 다르게 작동 할 수 있습니다. 전자에서는 x의 값을 조회하고, 그런 다음 하나를 추가하십시오. 후자의 경우에는 y이 환경에서 바인딩되는 참조를 찾아보고 참조의 맨 끝에있는 변수에 어떤 값이 저장되어 있는지 살펴보고 그 중 하나를 추가해야합니다. 비슷하게 x = 1y = 1은 다르게 작동합니다. 전자는 x의 값을 수정하려고합니다. 후자는 참조가 어디에서 어떤 변수 또는 변수와 유사한 것 (예 : 배열 요소)을 가리키는 지 먼저 확인해야합니다. 거기서 찾는다.

환경의 모든 변수를 값 대신 참조로 바인딩하면이 작업을 단순화 할 수 있습니다. 변수 값을 조회하는 것은 참조 전달 매개 변수의 값을 조회하는 것과 동일한 프로세스입니다. 그러나 이것은 다른 문제를 만들어 내며, 인터프리터 디자인과 언어의 세부 사항에 따라 혼전의 가치가 있는지 여부에 달려 있습니다.

관련 문제