Ремонт принтеров, сканнеров, факсов и остальной офисной техники


назад Оглавление вперед




[161]

already-moved

(assign new (op vector-ref) (reg the-cdrs) (reg old)) (goto (reg relocate-continue))

В самом конце процесса сборки мусора мы меняем ролями старую и новую память, обменивая указатели: cars меняется с new-cars, а cdrs с new-cdrs. Теперь мы готовы запустить следующую сборку, когда память опять кончится.

gc-flip

(assign temp (reg the-cdrs)) (assign the-cdrs (reg new-cdrs)) (assign new-cdrs (reg temp)) (assign temp (reg the-cars)) (assign the-cars (reg new-cars)) (assign new-cars (reg temp))

5.4 Вычислитель с явным управлением

В разделе 5.1 мы видели, как простые программы на Scheme можно преобразовывать в описания регистровых машин. Теперь мы проделаем такое преобразование с более сложной программой - метациклическим интерпретатором из разделов 4.1.1-4.1.4, который показал нам, как поведение процедур Scheme можно описать через процедуры eval и apply. Вычислитель с явным управлением (explicit-control evaluator), который мы разработаем в этом разделе, демонстрирует, как механизмы вызова процедур и передачи параметров, используемые в процессе вычисления, могут быть описаны в терминах действий, производимых над регистрами и стеками. В дополнение к этому вычислитель с явным управлением может служить реализацией интерпретатора Scheme, написанной на языке, весьма близком к машинному языку обыкновенных компьютеров. Этот вычислитель можно выполнить на имитаторе регистровых машин из раздела 5.2. С другой стороны, его можно использовать как основу для построения вычислителя Scheme, написанного на машинном языке, или даже специализированной машины для вычисления выражений на Scheme. На рисунке 5.16 показана такая аппаратная реализация: кремниевый чип, который работает как вычислитель Scheme. Проектировщики чипа начали с описания путей данных и контроллера, подобного вычислителю из этого раздела, а затем с помощью программ автоматизированного проектирования построили разводку интегральной микросхемы.14

Регистры и операции

При проектировании вычислителя с явным управлением требуется указать операции, которые будут использоваться в нашей регистровой машине. Мета-циклический интерпретатор мы описали, используя абстрактный синтаксис, с процедурами вроде quoted? и make-procedure. При реализации регистровой машины мы могли бы развернуть эти процедуры в последовательности элементарных операций с памятью, работающих со списковой структурой, и уже эти операции реализовать в нашей регистровой машине. Однако при этом

19Информацию о микросхеме и методе ее проектирования можно найти в Batali et al. 1982.


вычислитель получился бы слишком длинным, а его структура была бы загромождена мелкими деталями. Для большей ясности представления мы будем считать элементарными операциями регистровой машины синтаксические процедуры из раздела 4.1.2, а также процедуры для представления окружений и прочих данных интерпретатора из разделов 4.1.3 и 4.1.4. Для того, чтобы полностью описать вычислитель, который можно было бы запрограммировать на машинном языке низкого уровня или реализовать аппаратно, пришлось бы заменить эти операции более примитивными на основе реализации списковой структуры, которую мы описали в разделе 5.3.

Наша регистровая машина-вычислитель Scheme имеет стек и семь регистров: exp, env, val, continue, proc, argl и unev. В регистре exp хранится выражение, подлежащее вычислению, а в регистре env окружение, в котором нужно это вычисление произвести. В конце вычисления val содержит значение, полученное при вычислении выражения в указанном окружении. Регистр continue используется для реализации рекурсии, как описано в разделе 5.1.4. (Вычислитель вызывает сам себя рекурсивно, поскольку вычисление выражения требует вычисления его подвыражений.) Регистры proc, argl и unev используются при работе с комбинациями.

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

5.4.1 Ядро вычислителя с явным управлением

Центральным элементом вычислителя является последовательность команд, расположенная по метке eval-dispatch. Она соответствует процедуре eval метациклического интерпретатора из раздела 4.1.1. Начиная с eval-dis-patch, контроллер вычисляет выражение, хранящееся в exp, в окружении, которое содержится в env. Когда вычисление заканчивается, контроллер пе-


реходит на точку входа, которая хранится в continue, а значение выражения при этом находится в val. Как и в метациклическом eval, структура eval-dispatch представляет собой анализ случаев по синтаксическому типу

20

выполняемого выражения.20

eval-dispatch

(test (op self-evaluating?) (reg exp))

(branch (label ev-self-eval))

(test (op variable?) (reg exp))

(branch (label ev-variable))

(test (op quoted?) (reg exp))

(branch (label ev-quoted))

(test (op assignment?) (reg exp))

(branch (label ev-assignment))

(test (op definition?) (reg exp))

(branch (label ev-definition))

(test (op if?) (reg exp))

(branch (label ev-if))

(test (op lambda?) (reg exp))

(branch (label ev-lambda))

(test (op begin?) (reg exp))

(branch (label ev-begin))

(test (op application?) (reg exp))

(branch (label ev-application))

(goto (label unknown-expression-type))

Вычисление простых выражений

В числах и строках (значением которых являются они сами), переменных, закавыченных выражениях и выражениях lambda не содержится подлежащих вычислению подвыражений. В этих случаях вычислитель попросту помещает нужное значение в регистр val и продолжает работу с точки, указанной в регистре continue. Вычисление простых выражений производится следующим кодом контроллера:

ev-self-eval

(assign val (reg exp))

(goto (reg continue)) ev-variable

(assign val (op lookup-variable-value) (reg exp) (reg env)) (goto (reg continue)) ev-quoted

(assign val (op text-of-quotation) (reg exp)) (goto (reg continue)) ev-lambda

(assign unev (op lambda-parameters) (reg exp)) (assign exp (op lambda-body) (reg exp)) (assign val (op make-procedure)

20В нашем контроллере анализ случаев написан как последовательность команд test и branch. Можно было бы написать его и в стиле программирования, управляемого данными (в реальной системе так, скорее всего, и было бы сделано). При этом исчезла бы необходимость проводить последовательные проверки, и легче было бы определять новые типы выражений. Машина, рассчитанная на выполнение Лисп-программ, скорее всего, имела бы команду dispatch-on-type, которая бы эффективно выполняла выбор, управляемый данными.



[стр.Начало] [стр.1] [стр.2] [стр.3] [стр.4] [стр.5] [стр.6] [стр.7] [стр.8] [стр.9] [стр.10] [стр.11] [стр.12] [стр.13] [стр.14] [стр.15] [стр.16] [стр.17] [стр.18] [стр.19] [стр.20] [стр.21] [стр.22] [стр.23] [стр.24] [стр.25] [стр.26] [стр.27] [стр.28] [стр.29] [стр.30] [стр.31] [стр.32] [стр.33] [стр.34] [стр.35] [стр.36] [стр.37] [стр.38] [стр.39] [стр.40] [стр.41] [стр.42] [стр.43] [стр.44] [стр.45] [стр.46] [стр.47] [стр.48] [стр.49] [стр.50] [стр.51] [стр.52] [стр.53] [стр.54] [стр.55] [стр.56] [стр.57] [стр.58] [стр.59] [стр.60] [стр.61] [стр.62] [стр.63] [стр.64] [стр.65] [стр.66] [стр.67] [стр.68] [стр.69] [стр.70] [стр.71] [стр.72] [стр.73] [стр.74] [стр.75] [стр.76] [стр.77] [стр.78] [стр.79] [стр.80] [стр.81] [стр.82] [стр.83] [стр.84] [стр.85] [стр.86] [стр.87] [стр.88] [стр.89] [стр.90] [стр.91] [стр.92] [стр.93] [стр.94] [стр.95] [стр.96] [стр.97] [стр.98] [стр.99] [стр.100] [стр.101] [стр.102] [стр.103] [стр.104] [стр.105] [стр.106] [стр.107] [стр.108] [стр.109] [стр.110] [стр.111] [стр.112] [стр.113] [стр.114] [стр.115] [стр.116] [стр.117] [стр.118] [стр.119] [стр.120] [стр.121] [стр.122] [стр.123] [стр.124] [стр.125] [стр.126] [стр.127] [стр.128] [стр.129] [стр.130] [стр.131] [стр.132] [стр.133] [стр.134] [стр.135] [стр.136] [стр.137] [стр.138] [стр.139] [стр.140] [стр.141] [стр.142] [стр.143] [стр.144] [стр.145] [стр.146] [стр.147] [стр.148] [стр.149] [стр.150] [стр.151] [стр.152] [стр.153] [стр.154] [стр.155] [стр.156] [стр.157] [стр.158] [стр.159] [стр.160] [стр.161] [стр.162] [стр.163] [стр.164] [стр.165] [стр.166] [стр.167] [стр.168] [стр.169] [стр.170] [стр.171] [стр.172] [стр.173] [стр.174] [стр.175] [стр.176] [стр.177] [стр.178] [стр.179] [стр.180] [стр.181] [стр.182] [стр.183] [стр.184] [стр.185] [стр.186] [стр.187] [стр.188] [стр.189] [стр.190] [стр.191] [стр.192] [стр.193] [стр.194] [стр.195] [стр.196]