sicp.io
5.1.1 · 레지스터 기계를 기술하는 언어

컨트롤러 텍스트는 데이터 경로와 연산과 제어 이동을 이름 붙인다.

레이블을 조립하고 하나의 명시적인 레지스터 파일과 스택과 연산 표와 flag와 pc 위에서 assign, test, branch, goto, save, restore, perform, halt를 실행합니다.

생각해 볼 질문

서로 다른 기계의 컨트롤러를 한 시뮬레이터가 실행하게 하는 공통 규약은 무엇일까요?

  • 컨트롤러 레이블과 실행 명령을 별도로 표현하기
  • 상수·레지스터·레이블·연산 소스 평가하기
  • assign, test, branch, goto, save, restore, perform, halt 실행하기
  • 레지스터와 스택과 flag와 pc와 연산 표와 명령 수를 명시하기
  • 컨트롤러를 바꾸지 않고 실행 단계에 한도 두기

조립 단계는 명령 리스트만 세고 각 레이블을 다음 명령의 위치에 연결합니다. 기계는 레이블을 뺀 명령열과 레이블 표, 가변 레지스터 셀, 스택, 연산 표, pc, flag, halt 상태, 가져온 명령 수를 모두 데이터로 저장합니다.

evaluate-source는 const와 reg와 label과 op에 하나씩 의미를 줍니다. execute-one!은 조립된 명령 하나를 가져와 태그에 맞는 규칙을 적용합니다. 유클리드 컨트롤러는 대입과 검사와 분기와 레이블 이동과 perform을 사용하고, 서브루틴 컨트롤러는 continuation을 저장·복원한 뒤 레지스터에 든 주소로 돌아갑니다. 수업용 레지스터 기계 시뮬레이터는 지정된 명령어 집합을 명시적인 기계 상태 위에서 실행합니다.

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

    유클리드 기계는 (complete 2 0 33 ((40 6) (6 4) (4 2) (2 0)))을 반환합니다. continuation 기계는 (complete 10 #t 10)을 반환합니다.

    실행 추적에서 볼 점

    실행 전에 레이블이 수치 위치가 되는 과정을 따라가세요. 유클리드 실행에서는 test와 branch를 일곱 명령짜리 축소 주기와 구분하고, 서브루틴 실행에서는 바깥 continuation 저장, 임시 복귀 주소, restore, 두 번의 레지스터 goto를 찾으세요.

    직접 해보기

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

    매 fetch 직전에 pc를 기록하는 계측을 추가하고 1071과 462로 유클리드 컨트롤러를 실행하세요. 반복되는 loop 구간과 마지막 레지스터 값을 먼저 예상하세요.

    힌트 보기

    계측은 각 컨트롤러 명령에 넣지 않고 시뮬레이터 루프에 둘 수 있습니다. 컨트롤러 자체는 바꾸지 않아도 됩니다.

    이 수업 완료하기

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