sicp.io
5.1.5 · 명시적 제어 평가기

평가기의 제어가 레지스터와 레이블과 스택 규약이 된다.

레지스터 기계 컨트롤러는 eval과 apply를 직접 구현할 수 있습니다. exp와 env와 val과 proc과 argl과 continue와 unev 레지스터는 평가기 상태를 드러내고, 레이블과 스택은 문법 디스패치와 적용과 수열과 조건식과 대입과 정의 사이의 미완료 작업을 보존합니다.

생각해 볼 질문

평가기가 호스트 언어 재귀로 표현되지 않고 모든 continuation을 직접 보존해야 할 때 무엇이 달라질까요?

  • 명시적인 eval-dispatch 컨트롤러로 guest 문법 디스패치하기
  • exp, env, val, proc, argl, continue, unev에 평가기 데이터 전달하기
  • 연산자와 피연산자의 미완료 작업을 기계 스택에 저장하고 복원하기
  • 원시 프로시저와 표현된 복합 프로시저를 별도 컨트롤러 경로로 적용하기
  • 수열의 마지막 식을 평가하기 전에 continue 복원하기
  • 길이가 다른 두 꼬리 재귀 실행에서 같은 최대 스택 깊이 관찰하기
  • if와 set!과 define을 명시적인 컨트롤러 레이블로 처리하기
  • 완전한 guest 프로그램을 실행하고 빈 평가기 스택으로 halt하기

컨트롤러는 전역 환경과 마지막 continuation을 불러온 뒤 exp에 들어 있는 식의 종류를 반복해서 디스패치합니다. 단순한 값은 결과를 val에 넣고 continue를 따라갑니다. 적용은 호출자의 continuation과 환경을 저장하고 연산자와 피연산자를 평가해 argl을 만든 뒤 apply-dispatch로 들어갑니다. 원시 프로시저는 호스트 구현을 호출하고 복합 프로시저는 새 환경을 설치한 뒤 본문을 ev-sequence로 보냅니다.

수열 평가는 ev-sequence-last-exp가 마지막 식을 eval-dispatch로 보내기 전에 호출자의 continuation을 복원하므로 꼬리 재귀입니다. 따라서 두 sum-iter 실행은 재귀 호출 수가 달라도 측정한 평가기 최대 스택 깊이가 같습니다. 별도의 컨트롤러 경로는 if와 set!과 define 주변의 식과 환경과 continuation을 저장하고 복원합니다. 마지막 guest 프로그램은 재귀와 어휘 클로저 상태와 변경을 함께 실행하고 빈 스택으로 멈춥니다. 이 관찰은 유한 시뮬레이터와 선택한 컨트롤러의 정확한 상태 변화를 기록합니다.

SICP 코드UTF-8 22,000 / 1,048,576바이트
예제
결과
출력
진단
실행 추적0 / 0 개 이벤트
    실행은 브라우저 안에서 이루어지며 프로그램 결과와 실행 추적을 보여줍니다.
    예상 결과

    프로그램은 ((core 42 #t #t) (tail 15 210 #t #t #t) (state 9 9 #t) (run (120 41 42) #t #t))을 반환합니다. tail의 #t는 n = 5와 n = 20에서 측정한 평가기 최대 스택 깊이가 같다는 관찰을 기록합니다.

    실행 추적에서 볼 점

    eval-dispatch에서 문법별 레이블로 이동한 뒤 연산자와 피연산자 평가 주변의 save와 restore를 찾으세요. tail 실행에서는 재귀 적용이 시작되기 전에 ev-sequence-last-exp가 continue를 복원하는지 확인하세요. state 실행에서는 전역 바인딩이 바뀌기 전에 정의와 대입 값이 평가되는 경로를 따라가세요. 마지막 실행에서는 재귀 factorial 스택과 counter 클로저가 캡처한 바인딩의 변경을 구분하고 저장된 평가기 값 없이 기계가 halt하는지 확인하세요.

    직접 해보기

    프로그램을 수정하고 결과를 비교해 보세요.

    꼬리 재귀 product-iter를 추가하고 서로 다른 두 입력 크기로 실행하세요. 최대 스택 깊이와 최종 값과 빈 스택 상태를 제공된 sum-iter 관찰과 비교하세요.

    힌트 보기

    재귀 호출을 프로시저 본문의 마지막 식으로 유지하세요. 호출 뒤에 다른 연산이 기다리면 컨트롤러는 미완료 작업을 더 보존해야 합니다.

    이 수업 완료하기

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