506
Глава 5. Вычисления на регистровых машинах
Применение процедур
Точка входа apply-dispatch соответствует процедуре apply метациклического
интерпретатора. К тому времени, когда м ы попадаем в apply-dispatch, в регистре
proc содержится подлежащая применению процедура, а в регистре argl список вычис-
ленных аргументов, к которым ее требуется применить. Сохраненное значение continue
(исходно оно передается подпрограмме eval-dispatch, а затем сохраняется внутри
ev-application), которое определяет, куда нам надо вернуться с результатом при-
менения процедуры, находится на стеке. Когда вызов вычислен, контроллер передает
управление в точку входа, указанную в сохраненном continue, а результат при этом
хранится в val. Подобно метациклическому apply, нужно рассмотреть два случая.
Либо применяемая процедура является примитивом, либо это составная процедура.
apply-dispatch
(test (op primitive-procedure?) (reg proc))
(branch (label primitive-apply))
(test (op compound-procedure?) (reg proc))
(branch (label compound-apply))
(goto (label unknown-procedure-type))
Мы предполагаем, что все примитивы реализованы так, что они ожидают аргументы в
регистре argl, а результат возвращают в val. Чтобы описать, как машина обрабаты-
вает примитивы, нам пришлось бы дать последовательность команд, которая ре ализует
каждый примитив, и заставить primitive-apply переходить к этим командам в за-
висимости от содержимого proc. Поскольку нас интересуют не детали примитивов, а
структура процесса вычисления, мы вместо этого будем просто использовать операцию
apply-primitive-procedure, которая применяет процедуру, содержащуюся в proc,
к аргументам, содержащимся в argl. Чтобы смодел ировать вычислитель имитатором
из раздела 5.2, мы испол ьзуем процедуру apply-primitiveprocedure, которая ис-
полняет процедуру с помощью ни жележащей Scheme-системы, как мы это делали и в
метациклическом интерпретаторе из раздела 4.1.4. После того, как элементарная про-
цедура вычислена, мы восстанавливаем регистр continue и переходим на указанную
точку входа.
primitive-apply
(assign val (op apply-primitive-procedure)
(reg proc)
(reg argl))
(restore continue)
(goto (reg continue))
Чтобы при менить составную процедуру, мы действуем так же, как и в метацикли-
ческом интерпретаторе. Мы строим кадр, который связывает параметры процедуры с ее
аргументами, расширяем этим кадром окружение, хранимое в процедуре , и в этом рас-
ширенном окружении вычисляем последовательность выражений, которая представл яет
собой тело процедуры. Подпрограмма ev-sequence, описанная ниже в разделе 5.4.2,
проводит вычисление последовательности.
compound-apply
(assign unev (op procedure-parameters) (reg proc))