sicp.io
5.5.1 · 컴파일러의 구조

문법으로 디스패치하고 target과 linkage를 지키며 명령열 계약을 합성한다.

전용 컴파일 프로시저들이 needs와 modifies와 statements와 target과 continuation 동작이 명시된 명령열 레코드를 만드는 하나의 컴파일러 디스패처를 구성합니다.

생각해 볼 질문

어떤 컴파일러 결정은 소스 문법에 달리고 어떤 결정은 요청한 target 레지스터와 linkage에 달릴까요?

  • 컴파일 전에 지원하는 모든 소스 형식 분류하기
  • 전용 컴파일러에 target 레지스터와 linkage 전달하기
  • needs, modifies, statements로 명령열 표현하기
  • 보수적인 레지스터 계약을 유지하며 수열 합성하기
  • 조건 제어용 레이블 만들기
  • lambda 본문을 원시 소스로 남기지 않고 저장할 코드로 컴파일하기

compile은 문법 디스패치만 맡습니다. 전용 컴파일러는 자기 값과 변수와 인용과 조건식과 lambda와 수열과 적용이 target에 도달하는 방법을 정합니다. end-with-linkage는 제어 이동 없음, continue를 통한 return, 직접 label goto 가운데 하나를 덧붙입니다.

명령열은 statements와 함께 보수적인 needs·modifies 집합을 가집니다. append-sequences는 순서를 유지하며 이 계약을 합칩니다. 조건식 예제는 재귀적으로 컴파일한 술어와 두 갈래 주위에 레이블과 linkage를 놓습니다. lambda 컴파일러는 본문을 재귀 컴파일해 그 명령 데이터를 표현된 compiled procedure에 저장합니다.

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

    디스패치 프로그램은 (self variable quote if lambda begin application)을 반환합니다. 조건식 컴파일러는 ((env continue) (val proc argl continue) 15 (assign test branch assign assign assign assign assign assign assign goto label assign label goto) 2)를 반환합니다.

    실행 추적에서 볼 점

    두 번째 프로그램에서 술어 컴파일과 생성된 test·branch를 구분하세요. 이어 연산자가 proc으로, 피연산자가 val과 argl로 가는 과정과 alternative·after-if 레이블, 마지막 continue return을 따라가세요. needs와 modifies는 보수적인 레지스터 이동 계약을 제공합니다.

    직접 해보기

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

    begin과 if를 담은 lambda를 proc target과 이름 붙은 linkage로 컴파일하세요. 바깥 클로저 생성 수열과 저장된 본문 명령을 따로 살펴보세요.

    힌트 보기

    lambda 본문은 항상 val target과 return linkage로 컴파일됩니다. 바깥 target과 linkage는 compiled procedure를 만드는 식을 설명합니다.

    이 수업 완료하기

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