sicp.io
5.5.2 · 표현식 컴파일하기

실행이 시작되기 전에 소스 형식은 명령 태그가 된다.

값과 변수와 인용과 대입과 정의와 조건식과 lambda와 수열과 적용을 명령 언어로 컴파일한 뒤 컴파일 표현을 실행합니다.

생각해 볼 질문

컴파일 뒤 실행 루프에서 사라지는 소스 언어 결정은 무엇일까요?

  • 핵심 표현식 종류를 명시적인 명령 데이터로 컴파일하기
  • 호출에서 연산자와 피연산자의 왼쪽부터 순서 보존하기
  • 매개변수·코드·어휘 환경으로 compiled closure 표현하기
  • 명시적 환경 연산으로 정의와 대입 변경하기
  • 소스 문법을 다시 보지 않고 컴파일된 갈래 하나 선택하기
  • 별도 스택 기계로 컴파일 코드 실행하기

compile-expression이 모든 소스 분류를 수행합니다. 결과에는 literal, load, closure, define, set, discard, branch, call 명령만 남습니다. lambda는 이미 컴파일된 본문 코드와 매개변수를 저장하고 begin은 마지막이 아닌 형식 사이에 discard를 넣습니다.

compile-expression이 소스 형식을 분류한 뒤 run-code는 컴파일 명령 태그를 디스패치합니다. compiled procedure는 생성 때 포획한 어휘 환경을 새 호출 프레임으로 확장하고 빈 피연산자 스택에서 본문 코드를 실행합니다. 수업용 VM은 나열된 명령 집합으로 전역 정의와 포획한 지역 대입과 인용과 분기와 클로저와 원시 적용을 실행합니다.

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

    첫 프로그램은 ((18 large 15) (literal define discard closure define discard load literal call define discard load load literal call set discard load load literal call branch) 22)를 반환합니다. 상태 클로저는 ((12 15 5 ok) (literal define discard closure define discard load literal call define discard load load literal call load literal call load literal call) 21)을 반환합니다.

    실행 추적에서 볼 점

    먼저 코드 태그에서 소스 형식 태그가 사라졌는지 확인하세요. 실행에서는 make-adder와 make-counter 호출 전에 클로저가 만들어지는 시점, 각 compiled 적용의 새 프레임, counter 호출 사이에 바뀌는 포획 start 레코드, 선택된 branch 코드 하나를 따라가세요.

    직접 해보기

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

    재귀 compiled procedure나 두 번째 중첩 클로저를 추가하세요. 최상위 코드 태그를 예상한 뒤 각 load와 set이 어느 procedure 환경을 검색해야 하는지 밝히세요.

    힌트 보기

    정의는 클로저가 전역 frame 객체를 포획한 뒤 그 같은 frame에 이름을 설치하므로 나중 재귀 조회가 설치된 이름을 찾을 수 있습니다.

    이 수업 완료하기

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