sicp.io
5.1.2 · 기계 설계의 추상화

컨트롤러는 유지하고 연산과 저장 표현만 바꾼다.

한 컨트롤러가 특정 산술 방법 대신 이름 붙은 연산 계약에 의존하고, 한 제어 루프가 특정 저장 배치 대신 레지스터 bank 규약에 의존하도록 만듭니다.

생각해 볼 질문

기계 설계를 전체 재작성하지 않고 부분적으로 바꾸게 하는 경계는 무엇일까요?

  • 컨트롤러 구조와 컨트롤러가 부르는 연산 패키지 분리하기
  • 같은 컨트롤러를 유클리드식·뺄셈식 축소 패키지로 실행하기
  • 컨트롤러를 바꾸지 않고 프로세스 비용 비교하기
  • 레지스터 저장을 read와 write 메시지 뒤에 숨기기
  • 하나의 추상화 경계를 측정된 두 구현에서 비교하기

축소 컨트롤러는 done?, next-a, next-b, answer만 압니다. 유클리드 패키지는 이 이름을 나머지 축소에 연결하고, 뺄셈 패키지는 반복 차이 축소에 연결합니다. 두 기계는 같은 조립 명령열로 같은 최대공약수를 반환하지만 명령 수는 서로 다른 프로세스를 드러냅니다.

두 번째 프로그램은 같은 카운터 컨트롤러에 레지스터 bank 두 개를 줍니다. 한 bank는 가변 연관 레코드를 쓰고 다른 bank는 이름-인덱스 표 뒤의 벡터를 씁니다. 컨트롤러는 read와 write 메시지만 보냅니다. 같은 유한 관찰은 이 클라이언트 계약이 저장 방식 변경을 견딘다는 사실을 보여 줍니다.

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

    연산 패키지 프로그램은 ((euclid complete 2 32) (subtraction complete 2 95) #t)를 반환합니다. 레지스터 bank 프로그램은 ((4 10) (4 10) #t)를 반환합니다.

    실행 추적에서 볼 점

    첫 실행에서는 두 기계가 같은 명령 태그를 가져오지만 연산 조회가 다른 프로시저를 고르는지 확인하세요. 유클리드 축소 네 번과 뺄셈 축소 열세 번을 비교하세요. 두 번째 실행에서는 같은 read/write 호출 수열이 서로 다른 숨은 저장 연산으로 들어가는 과정을 따라가세요.

    직접 해보기

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

    이진 GCD 연산 패키지나 세 번째 레지스터 bank 표현을 추가하세요. 컨트롤러는 그대로 두고 새 구현이 지켜야 할 연산 또는 저장 계약을 적으세요.

    힌트 보기

    연산 패키지는 끝나지 않은 각 전이를 자기 done? 조건 쪽으로 진행시켜야 합니다. bank는 컨트롤러가 사용하는 write 뒤 read 관찰을 보존해야 합니다.

    이 수업 완료하기

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