Проведите одну идею от абстрактных данных к явному состоянию машины.
Одна программа создает данные выражений, интерпретирует их в окружении, компилирует, выполняет инструкции с видимыми счетчиком команд и стеком и сохраняет количество запусков конвейера.
Может ли каждый уровень изменять представление, не меняя значение, наблюдаемое учащимся?
- Создание данных выражений через процедуру-конструктор
- Чтение представления через селекторы
- Вычисление имен в явном окружении
- Компиляция выражения в инструкции для стека
- Запуск явных pc и stack с сохранением состояния замыкания
make-sum создает одно абстрактное выражение. evaluate следует его селекторам и ищет x и y в предоставленном окружении. compile использует тот же интерфейс, но формирует две инструкции load с последующей add.
run многократно применяет step к состоянию, содержащему pc и stack. make-pipeline сохраняет скомпилированный код и изменяемое количество запусков, поэтому второй вызов повторно использует код и сообщает следующее значение счетчика.
- Вывод
- —
- Значение
- —
- Диагностика
- —
Программа возвращает ((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.
Что подтверждает этот итоговый проект?
Ответ Он фиксирует точное соответствие между отображаемыми выражениями, окружениями, состояниями машины и двумя вызовами конвейера.