sicp.io
5.2.4 · 조립기 레이블

레이블 표는 이름을 명령 위치로 바꾼다.

조립기는 컨트롤러 텍스트를 훑고 실행 명령만 세어 기호 분기 대상을 조립된 명령 위치로 바꿀 수 있습니다.

생각해 볼 질문

기계가 숫자 위치를 필요로 하기 전까지 컨트롤러가 읽기 쉬운 레이블을 쓰려면 어떻게 해야 할까요?

  • 레이블 기호와 명령 리스트 구분하기
  • 레이블을 세지 않고 명령 위치만 세기
  • 각 레이블에서 다음 명령으로 이어지는 표 만들기
  • 레이블을 제거하면서 branch와 goto 대상 해결하기

extract-labels는 다음 명령의 위치를 전달합니다. 기호를 만나면 위치를 늘리지 않고 해당 위치를 기록하며, 명령을 만나면 위치를 증가시킵니다. 따라서 start는 0을, loop는 1을, done은 5를 가리킵니다.

assemble은 레이블 기호를 건너뛰고 resolve에 요청해 branch와 goto 대상만 바꿉니다. 일반 명령은 바뀌지 않고 유지됩니다. 반환된 수열은 숫자 대상을 갖는 조립된 컨트롤러 데이터이며, 다음 컨트롤러 실행 단계의 입력으로 전달됩니다.

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

    첫 번째 프로그램은 ((start . 0) (loop . 1) (done . 5))를 반환합니다. 두 번째 프로그램은 ((assign n 3) (test zero?) (branch 5) (assign n sub1) (goto 1) (halt))를 반환합니다.

    실행 추적에서 볼 점

    명령 리스트에서만 position이 증가하는지 지켜보고, branch와 goto가 5와 1을 받기 전에 done과 loop에 대한 assoc 조회를 찾으세요. 결과 리스트는 숫자 분기 대상을 갖춘 조립된 컨트롤러 데이터입니다.

    직접 해보기

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

    (test zero?) 바로 앞에 check라는 이름의 레이블을 삽입하세요. 해당 표 항목과 기존 명령 위치가 바뀌는지 여부를 예측하세요.

    힌트 보기

    레이블은 다음 명령을 가리키지만 명령 위치를 차지하지는 않습니다.

    이 수업 완료하기

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