Модифицируем вычислитель
В этом разделе рассказывалось, как модифицировать вычислитель с явным управлением и позволить интерпретируемому коду вызывать скомпилированные процедуры. Покажите, как можно изменить компилятор и позволить скомпилированным процедурам вызывать не только элементарные и скомпилированные процедуры, но и интерпретируемые. При этом придется изменить
compile-procedure-call
так, чтобы обрабатывался случай составных (интерпретируемых) процедур. Проследите, чтобы обрабатывались все те же сочетания
target
и
linkage
, что и в
compile-proc-appl
. Для того, чтобы произвести собственно применение процедуры, код должен переходить на точку входа
compound-apply
вычислителя. На эту метку нельзя напрямую ссылаться из объектного кода (потому что ассемблер требует, чтобы все метки, на которые явно ссылается объектный код, в нем и определялись), так что придется добавить в машину-вычислитель специальный регистр
compapp
, в котором будет храниться эта точка входа, и команду для его инициализации:
(assign compapp (label compound-apply))
;; branches if flag is set:
(branch (label external-entry))
read-eval-print-loop …
Чтобы проверить свой код, для начала определите процедуру
f
, которая вызывает процедуру
g
. С помощью
compile-and-go
скомпилируйте определение
f
и запустите вычислитель. Теперь, вводя код для интерпретации, определите
g
и попробуйте вызвать
f
.
Комментарии отсутствуют.