어휘 주소는 이름 검색을 두 인덱스로 바꾼다.
컴파일러가 변수를 프레임 깊이와 바인딩 오프셋으로 바꾸면 기계는 런타임 환경에서 값을 직접 가져올 수 있습니다.
생각해 볼 질문
컴파일할 때 환경에 관해 어떤 지식을 런타임 조회 밖으로 옮길 수 있을까요?
- 어휘 주소를 프레임 깊이와 바인딩 오프셋으로 나타내기
- 변수 이름을 검사하지 않고 런타임 프레임 선택하기
- 해당 프레임 안에서 값 슬롯 하나 선택하기
- 컴파일 시점 이름 검색을 런타임 직접 조회와 연결하기
주소 (depth offset)은 환경 프레임을 바깥쪽으로 센 뒤 한 프레임 안쪽을 가로질러 셉니다. lexical-ref는 오직 이 두 숫자만 따릅니다. 런타임 프레임은 이름·값 쌍 대신 값을 담고 있으므로 가져오는 동안 assoc이나 기호 비교가 일어나지 않습니다.
find-address는 변수 이름을 담고 있는 컴파일러 환경 프레임을 대상으로 이름 검색을 수행합니다. x에 대해 (1 0)을 만들고 나면 런타임은 그 주소를 써서 일치하는 값 프레임에서 42를 가져올 수 있습니다. 이 예제는 컴파일러와 기계가 프레임 배치 하나에 합의하게 만듭니다.
SICP 코드UTF-8 438 / 1,048,576바이트
예제
결과—
- 출력
- —
- 값
- —
- 진단
- —
실행 추적0 / 0 개 이벤트
첫 번째 프로그램은 (20 30 50)을 반환합니다. 두 번째 프로그램은 x를 주소 (1 0)으로 해결한 뒤 ((1 0) 42)를 반환합니다.
첫 번째 실행에서는 depth 재귀를 list-ref 오프셋 선택과 분리해 따라가며 어떤 변수 기호도 검색되지 않음을 확인하세요. 두 번째 실행에서는 compile-environment 이름 검색을 이후의 값 프레임 조회와 분리하세요.
프로그램을 수정하고 결과를 비교해 보세요.
가장 안쪽의 컴파일 시점 프레임에서 z 뒤에 w를 추가하고 일치하는 런타임 프레임에 11을 추가하세요. w의 주소와 값을 예측하세요.
힌트 보기
가장 안쪽 프레임은 depth가 0입니다. 두 번째 슬롯은 offset이 1입니다.