sicp.io
5.2.5 · 명령 실행 프로시저 만들기

조립 단계는 명령 디스패치를 실행 루프 밖으로 옮길 수 있다.

각 컨트롤러 명령을 피연산자와 제어 규칙을 포획한 클로저로 바꾸고, 조립된 프로시저 벡터를 여러 기계 인스턴스에서 재사용합니다.

생각해 볼 질문

기계 루프가 실행 프로시저를 가져와 호출하기만 하도록 조립기가 미리 할 수 있는 일은 무엇일까요?

  • 조립된 명령마다 실행 클로저 하나 만들기
  • 레지스터 이름과 소스 식과 분기 대상을 조립 시 포획하기
  • 가져온 명령 수는 실행 루프에서 세기
  • 매 주기마다 명령 태그를 다시 검사하지 않고 실행하기
  • 새 기계 상태에서 실행 프로시저 수열 하나 재사용하기

make-execution-procedure는 조립할 때 명령 태그를 분기합니다. 각 갈래는 목적 레지스터와 소스 식과 레이블 또는 스택 연산을 기억하는 클로저를 반환합니다. 실행 루프에는 더 이상 assign/test/branch/goto cond가 없고 pc 위치의 클로저를 골라 호출합니다.

첫 프로그램은 참 분기가 건너뛴 대입도 실행 프로시저를 가진다는 점을 보여 줍니다. 조립은 한 실행 경로가 아니라 컨트롤러 전체를 처리하기 때문입니다. factorial 프로그램은 클로저 여섯 개를 한 번 만들고 가변 레지스터와 계수기는 따로 가진 두 기계 인스턴스에 재사용합니다.

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

    조립 로그는 ((assign test branch assign assign goto save assign restore perform halt) 11 #t complete 10 (10) 10)을 반환합니다. 재사용한 factorial 수열은 (6 (complete 120 28) (complete 6 18))을 반환합니다.

    실행 추적에서 볼 점

    명령 데이터를 한 번 map하는 단계와 이후 fetch-and-call 루프를 분리하세요. -1 대입은 generation-log에는 있지만 실행 경로에서는 호출되지 않습니다. factorial에서는 두 기계가 프로시저 목록만 공유하고 가변 레지스터와 계수기는 공유하지 않는지 확인하세요.

    직접 해보기

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

    factorial 컨트롤러에 save와 restore를 넣거나 각 생성 클로저에 명령 태그 계측을 넣으세요. 조립 때 한 번 일어나는 일과 실행마다 반복되는 일을 예상하세요.

    힌트 보기

    컨트롤러 문법만으로 정할 수 있는 것은 생성된 클로저에 넣을 수 있습니다. 레지스터 값과 pc 의존 제어는 실행 입력으로 남습니다.

    이 수업 완료하기

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