486
Глава 5. Вычисления на регистровых машинах
Есть несколько разумных вариантов значения restore:
а. (restore y) переносит в y последнее значение, сохраненное на стеке, независимо от то-
го, откуда это значение взялось. Так работает наш имитатор. Покажите, как с помощью такого
поведения убрать одну команду из машины Фибоначчи (раздел 5.1.4, рисунок 5.12).
б. (restore y) переносит в y последнее значение, сохраненное на с теке, но только в том
случае, когда это значение происходит из рег истра y; иначе возникает сообщение об ошибке.
Модифицируйте имитатор и заставьте его вести себя таким образом. Придется изменить save
так, чтобы он сохранял имя регистра вместе со значением.
в. (restore y) переносит в y последнее значение, сохраненное из y, независимо от того,
какие другие регистры были сохранены и не восстановлены после y. Модифицируйте имитатор
так, чтобы он вел себя таким образом. С каждым регистром придется связать свой собственный
стек. Операция initialize-stack должна инициализировать стеки всех регистров.
Упражнение 5.12.
При помощи имитатора можно определять пути данных, которые требуются для ре ализации маши-
ны с данным контр оллером. Расширьте ассемблер и заставьте его хранить следующую информацию
о модели машины:
• список всех команд, с удаленными дубликатами, отсортированный по типу команды
(assign, goto и так далее).
• список (без дубликатов) регистров, в которых хранятся точки входа (это те регистры, кото-
рые упоминаются в командах goto).
• Список (без дубликатов) регистров, к которым применяются команды save или restore.
• Для каждого регистра, список (без дубликатов) источников, из ко торых ему присваивается
значение (например, для регистра val в факториальной машине на рисунке 5.11 источниками
являются (const 1) и ((op *) (reg n) (reg val))).
Расширьте интерфейс сообщений машины и включите в него доступ к новой информации. Что-
бы проверить свой анализатор, примените его к машине Фибоначчи с рисунка 5.12 и рассмотрите
получившиеся списки.
Упражнение 5.13.
Модифицируйте имитатор так, чтобы он определял, какие регистры присутствуют в машине, из
последовательности команд контроллера, а не принимал список регистров в качестве аргумента
make-machine. Вместо того, чтобы выделять регистры в make-machine заранее, их можно
создавать по одному, когда они встречаются в первый раз при ассемблировании команд.
5.2.4. Отслеживание производительности машины
Имитационное моде лирование может служить не только для проверки правильности
проекта машины, но и для измерения ее производительности. К примеру, можно устано-
вить в нашу машин у «счетчик», измеряющий количество операций со стеком, задейство-
ванных при вычислении. Для этого мы изменяем моделируемый стек и следим, сколько
раз регистры сохраняются на стеке, регистрируем максимальную глубину, которой он
достигает, а также добавляем к интерфейсу стека сообщение, которое распечатывает
статисти ку, как показано ниже. Кроме того, мы до бавляем к базовой машине операцию
для распечатки статисти ки, устанавливая значение the-ops в make-new-machine в