sicp.io
5.1.2 · Абстракция при проектировании машин

Стабильный контроллер над сменными операциями

Контроллер опирается на именованные контракты операций вместо одного арифметического метода, а цикл управления на протокол регистрового банка.

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

Какие границы позволяют изменять конструкцию машины локально, не переписывая ее контроллер?

  • Отделение структуры контроллера от вызываемого им пакета операций
  • Запуск одного контроллера с евклидовым пакетом редукции и пакетом редукции через вычитание
  • Сравнение затрат процесса без изменения текста контроллера
  • Сокрытие хранилища регистров за сообщениями read и write
  • Сравнение одной границы абстракции на двух измеренных реализациях

Контроллер редукции знает только имена done?, next-a, next-b и answer. Евклидов пакет связывает эти имена с редукцией через остаток от деления, а пакет вычитания связывает их с редукцией через повторяющуюся разность. Обе машины используют одинаковую последовательность ассемблированных инструкций и возвращают один и тот же наибольший общий делитель, но число инструкций выявляет различия процессов.

Вторая программа предоставляет одному и тому же контроллеру счетчика два банка регистров. Один банк хранит изменяемые ассоциативные записи, а другой банк хранит значения в векторе за таблицей соответствия имен индексам. Контроллер отправляет только сообщения read и write. Одинаковые результаты наблюдений показывают, что конечный контракт клиента сохраняется при изменении способа хранения.

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

    Программа с пакетами операций возвращает ((euclid complete 2 32) (subtraction complete 2 95) #t). Программа с банками регистров возвращает ((4 10) (4 10) #t).

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

    В первом запуске убедитесь, что обе машины выбирают одинаковые теги инструкций, тогда как поиск операций выбирает различные процедуры. Сравните четыре евклидовых цикла редукции с тринадцатью циклами вычитания. Во втором запуске проследите, как одна и та же последовательность вызовов read и write переходит в различные скрытые операции хранилища.

    Попробуйте сами

    Измените программу и сравните результат.

    Добавьте пакет операций для бинарного алгоритма НОД или третье представление банка регистров. Сохраните текст контроллера без изменений и укажите, каким контрактам операций или хранилища должна удовлетворять новая замена.

    Показать подсказку

    Корректный пакет операций должен обеспечивать продвижение каждого незавершенного перехода к собственному предикату done?. Корректный банк должен сохранять наблюдения чтения после записи, используемые контроллером.

    Завершить этот урок

    В этой главе пройдено 0 из 23 урока0%