sicp.io
5.5.6 · 컴파일된 변수 접근

어휘 주소는 이름 검색을 두 인덱스로 바꾼다.

컴파일러가 변수를 프레임 깊이와 바인딩 오프셋으로 바꾸면 기계는 런타임 환경에서 값을 직접 가져올 수 있습니다.

생각해 볼 질문

컴파일할 때 환경에 관해 어떤 지식을 런타임 조회 밖으로 옮길 수 있을까요?

  • 어휘 주소를 프레임 깊이와 바인딩 오프셋으로 나타내기
  • 변수 이름을 검사하지 않고 런타임 프레임 선택하기
  • 해당 프레임 안에서 값 슬롯 하나 선택하기
  • 컴파일 시점 이름 검색을 런타임 직접 조회와 연결하기

주소 (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입니다.

    이 수업 완료하기

    이 장의 총 23개 수업 중 0개 완료0%