Язык Форт и его реализации [Сергей Николаевич Баранов] (pdf) читать постранично, страница - 31

-  Язык Форт и его реализации  (и.с. ЭВМ в производстве) 3.51 Мб, 162с. скачать: (pdf) - (pdf+fbd)  читать: (полностью) - (постранично) - Сергей Николаевич Баранов - Николай Романович Ноздрунов

Книга в формате pdf! Изображения и текст могут не отображаться!


 [Настройки текста]  [Cбросить фильтры]

адресов компиляции этих ветвей в соответствии с их порядковыми
номерами строится вектор-переключатель, и нужная
98

ветвь выбирается по порядковому номеру. Определяющее слово SWITCH (переключатель) компилирует
такой вектор в поле параметров определяемого слова
и задает выбор альтернативы в исполняющей части:

Создающая часть строит новую словарную статью и
переключает текстовый интерпретатор в состояние компиляции. Таким образом, следующие слова будут компилироваться в поле параметров определяемого слова.
Слово SMUDGE выставляет разряд «Не готов» в байтесчетчике поля имени, делая данную статью «невидимой»
при поиске слов в словаре. Этот разряд будет сброшен
словом ; (точка с запятой), которое завершает компиляцию такого переключателя. Например:

Порядок использования переключателя ДЕНЬНЕДЕЛИ иллюстрирует следующий протокол работы:

Описанный механизм аналогичен определению вектора,
рассмотренному в п. 1.10. Его также можно задавать
по-разному в зависимости от конкретных требований.
В приведенной реализации неправильное значение выбирающего условия (выходящее за диапазон от 1 до 7)
приведет к непредсказуемому результату, поскольку
соответствующий контроль отсутствует. Чтобы ввести
его в реализацию, нужно каким-то образом подсчитать
число скомпилированных ссылок при завершении компиляции. Для этого можно применить способ, аналогичный компиляции переходов в шитом коде, введя
вместо точки с запятой специальное слово, отмечающее конец переключателя.
4*

99

Для реализации конструкции выбора через вложенные условные операторы создаются специальные слова,
которые обрамляют всю конструкцию и каждую ее
ветвь. В этом случае ветвь является обычной последовательностью форт-слов, аналогичной части «то» или
части «иначе» условного оператора. Как и в случае
условного оператора, конструкцию выбора можно использовать только внутри определений через двоеточие,
т. е. в состоянии компиляции текстового интерпретатора. При этом все ее специальные слова имеют признак
немедленного исполнения и компилируют необходимые
проверки и переходы.

Слова CASE (выбор) и ENDCASE (конец выбора)
ограничивают конструкцию и обеспечивают правильную компиляцию вложенных операторов. Слово CASE ,
проверив, что текстовый интерпретатор находится в состоянии компиляции, сменяет глобальную переменную
CSP (сокращение от CURRENT STACK POINTER —
текущий указатель стека), сохраняя на стеке ее прежнее значение (слово !CSP засылает в переменную CSP
адрес текущей вершины стека). Слова OF (из) и ENDOF (конец из) ограничивают отдельную ветвь. Во время работы скомпилированного определения перед началом исполнения каждой ветви на стеке лежат два
значения: число, представляющее условие выбора, и номер данной ветви. Слово OF компилирует текст OVER =
100

= IF DROP , который обеспечивает передачу управления на данную ветвь, если эти два значения совпали,
причем в этом случае они оба снимаются со стека. Если
же значения оказались разными, то управление передается на текст, следующий за словом ENDOF для
данной ветви, которое эквивалентно слову ELSE . Наконец, слово ENDCASE компилирует операцию DROP ,
чтобы снять со стека оставшееся там значение условия,
и разрешает все накопившиеся на стеке выходы из ветвей на текущую точку, исполняя для этих ветвей слово
THEN . Его последним действием является восстановление прежнего значения переменной CSP , которое
к этому моменту оказывается на вершине стека.
В приведенных определениях можно несколько
уменьшить объем кода, компилируемого для входа
в каждую ветвь, если ввести для этого специальное
слово, вслед за которым в шитый код компилируется
адрес перехода на следующую ветвь:

Исполнение слова (OF) аналогично ?BRANCH , в зависимости от условия оно переустанавливает указатель
интерпретации, либо обходя скомпилированную за ним
ссылку, либо устанавливая указатель по значению этой
ссылки. Аналогичным образом наряду со словами (OF)
и ОФ можно определить пары ( < O F ) и < O F , (> OF)
и > OF , ( < O F < ) и