sicp.io
5.5.4 · 레지스터 생존성

다음 명령열이 아직 필요로 하는 레지스터만 저장한다.

명령열의 need와 modify 집합을 사용하면 합성 코드가 이전 값을 save/restore로 보호해야 하는 시점을 판단할 수 있습니다.

생각해 볼 질문

두 명령열 사이에서 컴파일러는 언제 레지스터를 보존해야 할까요?

  • 레지스터 needs와 modifies를 명령열 계약으로 읽기
  • 앞선 명령열이 덮어쓴 뒤에도 필요한 값 감지하기
  • 해당 충돌 주변에만 save와 restore 삽입하기
  • 보존 후 합성된 명령열 계약 갱신하기

두 번째 명령열이 레지스터의 들어오는 값을 필요로 하고 첫 번째 명령열이 그 레지스터를 수정할 때 충돌이 일어납니다. preserving은 첫 번째 statements를 save와 restore로 감싸 두 번째 명령열이 원래 값을 볼 수 있게 합니다.

감싸진 첫 번째 명령열은 이제 레지스터를 저장하기 위해 그 레지스터를 필요로 하며, restore 이후에는 해당 레지스터가 수정되었다고 더 이상 드러내지 않습니다. 충돌의 어느 한쪽 조건이라도 없으면 합성은 스택 명령을 전혀 내보내지 않습니다.

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

    첫 번째 프로그램은 (env)를 필요로 하고 (val)을 수정하며 첫 번째 statements를 (save env)와 (restore env)로 둘러싼 명령열을 반환합니다. 두 번째 프로그램은 (#t #f)를 반환합니다.

    실행 추적에서 볼 점

    명령열이 감싸지기 전에 두 포함 여부 검사를 모두 따라가세요. 그런 다음 내보낸 statement 리스트에 save와 restore가 추가되는 동안 difference가 드러난 수정 집합에서 env를 어떻게 제거하는지 살펴보세요.

    직접 해보기

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

    두 번째 명령열이 val만 필요로 하도록 바꾸세요. 합성된 need와 modify 집합 및 save나 restore가 남아 있는지 예측하세요.

    힌트 보기

    두 번째 need 집합에 env가 없으면 preserving은 일반적인 append-sequences 분기를 따릅니다.

    이 수업 완료하기

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