sicp.io
Итоговый проект курса · Исполняемый конвейер

Проведите одну идею от абстрактных данных к явному состоянию машины.

Одна программа создает данные выражений, интерпретирует их в окружении, компилирует, выполняет инструкции с видимыми счетчиком команд и стеком и сохраняет количество запусков конвейера.

Вопрос для размышления

Может ли каждый уровень изменять представление, не меняя значение, наблюдаемое учащимся?

  • Создание данных выражений через процедуру-конструктор
  • Чтение представления через селекторы
  • Вычисление имен в явном окружении
  • Компиляция выражения в инструкции для стека
  • Запуск явных pc и stack с сохранением состояния замыкания

make-sum создает одно абстрактное выражение. evaluate следует его селекторам и ищет x и y в предоставленном окружении. compile использует тот же интерфейс, но формирует две инструкции load с последующей add.

run многократно применяет step к состоянию, содержащему pc и stack. make-pipeline сохраняет скомпилированный код и изменяемое количество запусков, поэтому второй вызов повторно использует код и сообщает следующее значение счетчика.

Код SICP1,719 из 1,048,576 байт UTF-8
Примеры
Результат
Вывод
Значение
Диагностика
Трасса выполнения0 / 0 событий
    Запуски происходят внутри браузера с отображением результата программы и трассы выполнения.
    Ожидаемый результат

    Программа возвращает ((9 (3 (9)) 1) (12 (3 (12)) 2)). В каждом результате значение прямого вычисления равно значению на финальном стеке машины, pc 3 отмечает завершение трех инструкций, а последнее поле подсчитывает вызовы конвейера.

    На что обратить внимание в трассе

    Найдите вызовы конструкторов и селекторов, поиск в окружении, compile перед каждым выполнением конвейера, изменения pc от 0 до 3, обновления stack и присваивание сохраненной переменной runs. Полная трасса выполнения содержит 630 событий для этой программы при фиксированных ограничениях среды выполнения.

    Повторение

    Пять проверок по всему конвейеру

    Где скрыто представление выражения?

    Ответ make-sum создает его, а evaluate и compile обращаются к left-operand и right-operand вместо прямой зависимости от позиций в списке.

    Почему различаются два значения прямого вычисления?

    Ответ Одно и то же выражение получает два окружения с различными связываниями для x и y.

    Почему каждое финальное состояние машины имеет pc 3?

    Ответ Компилятор формирует две инструкции load и одну инструкцию add, и run останавливается после выполнения всех трех.

    Какое состояние сохраняется между двумя вызовами конвейера?

    Ответ Замыкание сохраняет скомпилированный код и изменяемое связывание runs, наблюдаемые значения которого увеличиваются с 1 до 2.

    Что подтверждает этот итоговый проект?

    Ответ Он фиксирует точное соответствие между отображаемыми выражениями, окружениями, состояниями машины и двумя вызовами конвейера.