Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология
Образование Политология Производство Психология Стандартизация Технологии


IF A THEN или I F A ELSE В THEN



Оператор IF выполняет ветвление программы и производит
над стеком действие (f => ). Если снятый с вершины стека приз-
нак (флаг) является истинным, то после оператора IF выполняется
группа команд А, в противном случае начинает выполняться груп-
па команд В, стоящая за оператором ELSE (или следующий за IF
оператор, если ветвь ELSE отсутствует). После завершения выпол-
нения группы команд В управление передается оператору, стояще-
му за оператором THEN.

В конструкции цикла BEGIN-UNTIL (рис. 6.4c) значение
флага проверяется после каждого выполнения группы команд А.
Слово UNTIL, как и слово IF, снимает значение флага с вершины
стека и производит проверку его истинности. Если этим значением
является ложь, то группа команд А повторяется. Другими словами,
выполняются те же действия, что и в конструкции ELSE оператора
ветвления IF при ложном значении флага.

На рис. 6.4D представлена схема цикла WHILE. Повторное
выполнение группы команд, находящихся внутри него, также про-
исходит при значении флага ложь. Цикл BEGIN-WHILE начинает-
ся с выполнения группы команд А, следующих за оператором
BEGIN. Затем управление получает оператор WHILE, который
снимает значение флага со стека; если флаг истинен, то выполня-
ется группа команд В, которая завершается оператором REPEAT
(повторить). Этот оператор передает управление обратно в начало
цикла, т.е. оператору BEGIN. В терминах языка Форт эта конст-
рукция записывается следующим образом:























BEGIN A WHILE В REPEAT

129



Рис.6.3. Пример неструктурированной программы. Циклы образуют перекрывающиеся куски программы, т.е. каждый цикл расположен частично внутри, частично снаружи другого цикла


 


130


Рис. 6.4. Управляющие конструкции языка Форт: (A)IF-THEN; (B)IF – ELSE THEN; (О BEGIN - UNTIL; (D) BEGIN - WHILE; (E)D O - LOOP или DO - +LOOP


131


В управляющих конструкциях IF, UNTIL, WHILE условием
выполнения цикла является ложное значение флага. Поскольку
действия этих операторов похожи друг на друга, то в их машинной
реализации имеются общие подпрограммы периода выполнения.
Если управляющее слово встречается в определении через двоето-
чие (в период компиляции), то это приводит к компиляции фраг-
мента, реализующего передачу управления в объектный код, кото-
рый впоследствии будет выполняться при каждом обращении к
этому слову. Детали реализации управляющих слов будут рассмот-
рены позже при описании компилирующих слов.

В тех случаях, когда количество повторных шагов цикла изве-
стно еще до начала его выполнения, полезной может оказаться та-
кая конструкция, как цикл со счетчиком. В Бейсике такой опе-
ратор имеет вид FOR - NEXT, а в Форте к этому типу относятся
два оператора: DO - LOOP и DO - +LOOP. Их схемы приведены на
рис. 6.4Е. Слово DO берет со стека два аргумента. Затем командой

DO ( граничное_значение счетчик_цикла ==> )

счетчик цикла и граничное значение помещаются в стек возврат?
и удаляются из стека параметров. Счетчик цикла получает свое
начальное значение, а граничное значение становится на единицу
болы^е конечного значения счетчика цикла. В описании этого сло-
ва упоминается название еще одного стека языка Форт -' стека воз-
вратов. Он так называется потому, что используется в Форте в ос-
новном для запоминания того места в программе, куда нужно вер-
нуться после завершения встретившегося слова. Это действие вы-
полняется виртуальной Форт-машиной, которая будет рассмотрена
позже. Циклы типа DO также обращаются к этой машине, поско-
льку все конструкции цикла должны находиться в границах од-
ного (произвольного) слова Форта. DO-цикл использует стек воз-
вратов только до тех пор, пока он находится внутри последола-
тёльности команд, составляющих определение нового словя..е.
пока не встретится слово; ).

Слово DO передает значения двух счетчиков из стека пара-
метров в стек возвратов. Значением счетчика является начальная
величина, передаваемая счетчику цикла, а граничное значение
превосходит на единицу конечное значение. Это объясняется тем,
что в цикле LOOP увеличение счетчика предшествует его сравне-
нию с граничным значением. Если они оказываются равны, то вы-
полнение цикла завершается. На каждом шаге цикла типа LOOP
счетчик увеличивается на единицу.

Если требуется использовать шаг, отличный от единицы (при-
чем это могут быть и отрицательные числовые значения), то
следует обратиться к циклу иного типа, реализуемому словом
+LO0P. В отличие от цикла LOOP, .который не взаимодействует со
стеком параметров, +LOOP берет размер шага (т.е. величину, на
которую увеличивается параметр цикла при каждом очередном вы-

132


полнении тела цикла) из этого стека. Чтобы иметь доступ к значе-
нию счетчика в теле цикла, необходимо командой I предваритель-
но занести его в стек параметров.

С помощью управляющих слов, которые мы ввели, можно по-
строить примеры определения новых слов языка Форт. Так, для
вывода на печать чисел от 1 до п следует прибегнуть к помощи
цикла DO:

( п ==> )

: . #S 1+ 1 DO.I. LOOP;

Считается хорошим стилем программирования помещать пе-
ред определением слова его стековую нотацию. Это особенно умес-
тно, если исходные тексты Форт-программы должны быть сохране-
ны на дискете. Имя определяемого слова (в данном случае это #S)
располагается непосредственно за двоеточием через пробел. Затем
идет определение слова, состоящее из слов, с помощью которых
числа будут отпечатаны.

Так как мы предполагаем, что числа передаются через стек,
то слово +1 устанавливает граничное значение, превышающее пос-
леднее выводимое на принтер число на единицу (поскольку пос-
леднее число тоже должно быть отпечатано). Первым числом явля-
ется единица, поэтому начальное значение счетчика цикла пола-
гается равным единице. Это необходимо сделать до начала цикла
DO, после чего стек будет содержать оба значения счетчика, кото-
рые необходимы для выполнения цикла. Слово I, находящееся в
теле цикла, помещает значение счетчика на стек, а команда. (то-
чка) печатает его, одновременно удаляя со стека. Слово LOOP за-
вершает цикл. Если ваш хомпьютер оснащен Форт-системой, по-
пробуйте выполнить эту программу для п=10. При наборе команды

10. #S

вы получите в качестве ответа следующую последовательность:
123456789 10 ok

Тот же самый результат может быть получен с помощью дру-
гой управляющей конструкции, отличной от цикла DO. Так, в тер-
минах цикла BEGIN-UNTIL упомянутая программа будет выгля-
деть следующим образом:

( п ==> )

: . #S 1+ 1 BEGIN DU.P. 1+ 2DUP = UNTIL 2DROP;

Определение слова, более длинное по сравнению с предыду-
щим, свидетельствует о том, что в нашем случае лучше использо-
вать цикл DO. В теле цикла на стек" помещаются два числа. Ко-

133


манда 2DUP делает копии значения счетчика и граничного значе-
ния для выполнения команды =, которая их сравнивает, выраба-
тывает значение флага и передает его команде UNTIL. При выхо-
де из цикла эти значения все еще находятся на стеке, откуда их
удаляет слово 2DROP. Чтобы представить последовательность дей-
ствий, произведенных над стеком, следует аккуратно выписать его
состояния под каждым словом - так будет виден результат их вы-
полнения. Другие примеры использования управляющих слов мож-
но увидеть на экранах с 40 по 45 и с 60 по 65, приведенных в гл. 7
и 9 соответственно, а также в приложении А.

Нестандартной, но весьма популярной управляющей констру-
кцией является слово CASE, включающее в свою очередь слова
OF, ENDOF и ENDCASE. Это слово служит обобщением конструк-
ции IF-THEN, поскольку допускает неограниченное количество
ветвлений. Каждая ветвь заключается в символьные скобки OF и
ENDOF. Приведем пример конструкции CASE:

( п = = > )




























































































CASE

OF A E ND O F

2 OF В  END O F
3 OF С   ENDOF
DROP
ENDCASE

Слово CASE берет элемент с вершины стека (часто таким эле-
ментом является символьное значение) и сравнивает его с тем эле-
ментом, который был помещен на стек до обращения к слову OF.
В данном примере п сравнивается с единицей. Если они оказыва-
ются равными, то п удаляется из стека и выполняется последова-
тельность команд А. Затем слово ENDOF передает управление ко-
манде, размещенной за словом ENDCASE. При п, не равном еди-
нице, следующее слово OF сравнивает его с числом 2, и т.д. Если
не удовлетворено ни одно из этих условий, то выполняетется после-
довательность команд D, a n остается на стеке. Наконец, после
завершения группы команд D слово ENDCASE удаляет п со стека.
Особенность применения этого оператора состоит в том, что п час-
то включается в последовательность команд D. В таком случае
фрагмент D должен оставить на стеке какое-либо число, чтобы
слову ENDCASE было что удалить с него. Конструкция CASE ис-
пользуется в определении слова ЧТСП, исходный текст которого
приведен на экране 46 (см. гл. 7 и приложение А).






















СТЕК ВОЗВРАТОВ

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

В Форте имеются три слова, с помощью которых осуществля-
ется доступ к стеку возвратов из стека параметров (помимо коман-
ды I, обращающейся к счетчику цикла):

> R ( n => )

Снимает число с вершины стека
параметров и помещает его на
стек возвратов (произносится
" на R" ).

R> ( => n)

Снимает число с вершины стека
возвратов и помещает его на стек
параметров (произносится " cR" ).

R@ ( => n)

Помещает копию элемента, нахо-
дящегося на вершине стека воз-
вратов, на стек параметров (про-
износится " разыменовать R" ).

Над стеком возвратов выполняются те же действия, что и над
стеком параметров. Например, ввод последовательности слов

1 2 3 > R > R > R R@. R> . R> . R> ,

приведет к следующему результату: 1 1 2 3 ok

Число 3 первым было помещено на стек и последним снято с него.

При использовании указанных слов в циклах DO на них на-
кладываются ограничения. Поскольку слова LOOP и +LOOP обра-
щаются к стеку возвратов для выполнения действий со счетчиком
цикла, любое обращение к этим словам в пределах DO-цикла дол-
жно возвращать стек в его исходное состояние, т.е. в то, которое
он имел прежде, чем в программе встретилось слово начала цикла.
Иллюстрацией изложенного может служить такой пример:

... > R... DO... R> ...


 


134


135


Здесь некоторый элемент помещается на стек возвратов для
того, чтобы в последующем быть использованным в цикле DO. Од-
нако слово R> вместо этого извлекает значение счетчика цикла,
поскольку DO поместило на стек возвратов два элемента. Таким
образом, передача данных в цикл DO через стек возвратов оказы-
вается не всегда возможной. В подобных случаях требуемый резу-
льтат может быть получен путем выбора из стека возвратов треть-
его элемента, но лучше все-таки применять другие средства - бо-
лее простые и надежные.







































ОБРАБОТКА СТРОК

Одной из основных функций компьютера является обработка
текстовой информации. Компьютерные программы, написанные на
одном из языков программирования, представляют собой тексты.
Программы в исходном виде, обрабатываемые интерпретатором
или компилятором Форта, - по существу, тоже тексты. Текст сос-
тоит из символов (в Форте они кодируются с помощью кода
ASCII), которые обьединяготся в последовательности, называемые
символьными строками.

В Форте строки выполняют различные функции. Так, имена
слов из словаря имеют вид строк. Строка - это структурированный
тип данных, представляющий собой последовательность однобайто-
вых символов. В начале строки находится счетчик, занимающий
также один байт, в котором располагается число, указывающее ко-
личество символов в строке. Значение счетчика называется длиной
строки.
Например, строка " ABC" в памяти компьютера будет пре-
дставлена последовательностью чисел: 3 65 66 67, где числа с 65 по
67 - десятичные ASCII-коды букв А, В и С соответственно.

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

( а u => )

где а - адрес, а и - счетчик. Мы и в дальнейшем в стековой
нотации будем пользоваться этими обозначениями. Если
применяется указатель на строку, то перед ним ставится знак ".
Таким образом, с помощью " а обозначается указатель на байт сче-
тчика строки. Для перехода от строки со счетчиком к строке с явно
заданной длиной служит слово COUNT:

COUNT (" а —> а u )

Оно преобразует указатель строки в адрес ее первой литеры и
значение счетчика. Слово COUNT выбирает значение счетчика и

136


увеличивает на на единицу. Имея на стеке строку, ее можно
вывести на экран дисплея с помощью слова TYPE:

TYPE ( a n => )

которое передает строку на устройство вывода. Иногда может
понадобиться вывести на дисплей строку литералов. Например,
нам требуется получить на экране дисплея сообщение " ЦЕЛИ: ",
приведенное на экране 65 в слове TRACE. Применим слово." :

." ( => )

и оно выдаст на дисплей символы, расположенные между ним и
закрывающими кавычками (" ), в виде символьной строки. Поско-
льку." является словом Форта, то после него должен следовать
пробел. За пробелом начинается последовательность символов,
завершающаяся двойной кавычкой (" ). Кавычки означают конец
строки.

В некоторых реализациях Форта строки можно создавать с по-
мощью слова " . В таких случаях строка тоже располагается после
пробела и заканчивается двойной кавычкой. Слово " помещает
созданную строку во временную память, называемую PAD, и
заносит на стек указатель строки со счетчиком.

Ранее уже упоминались слова для задания комментариев -это
левая скобка, открывающая комментарий, и правая скобка, закры-
вающая его. Любой текст, расположенный между левой и правой
скобками, транслятором не обрабатывается. Слово \, не относяще-
еся к числу стандартных, обычно используется для переноса без
каких-либо изменений строки комментариев из исходного текста
программы на диск. Примеры применения слова \ можно найти в
исходных текстах многих программ, приведенных во второй части
книги.

Некоторые символы используются так часто, что получили
статус слов Форта. К их числу относится слово CR - возврат ка-
ретки и BL - пропуск, или пробел. Слово CR выполняет возврат
назад, а слово BL помещает на стек символ пробела. Слово SPACE
передает на устройства вывода пробел.



















































П ОТОКИ Т ЕКСТОВ

Выше мы предполагали, что текст выдается на экран дисплея
и вводится в компьютер с клавиатуры или дискеты. Форт-система
воспринимает входные и выходные тексты как потоки символов бе-
сконечной длины, называемые соответственно входным и выходным
потоками.
Как уже упоминалось ранее, ядро Форта составляют
слова для управления аппаратной частью компьютера. К этому же
уровню относятся и слова, управляющие устройствами ввода-выво-
да. Вывод символа в выходной поток осуществляется словом EMIT,








137


а чтение его из входного потока - словом KEY, причем слово KEY
считывает символ из входного потока независимо от того, поступа-
ет ли он с клавиатуры или с диска:



KEY ( => с)

Вводит символ из входного потока
к помещает его на стек.

Аналогично все символы из выходного потока можно вывести
словом EMIT:

EMIT ( с => )

Передает на выходное устройство
символы со стека.

Эти слова задаются определяющим словом DEFER, которое
нам пока не встречалось. Оно служит для определения слов, осу-
ществляющих векторные (косвенные) вычисления. Такое слово мо-
жет быть настроено на выполнение других слов Форта. Например,
если выходной поток выводится на экран дисплея, то слово EMIT
следует настроить на выполнение слова (EMIT) - драйвер дисп-
лея. Если же выходной поток направляется на устройство печати,
то EMIT- заставит выполняться слово, управляющее драйвером
принтера (PREMIT). Детали реализации слова DEFER мы обсудим
после описания  структуры слов Форта.


















СТРУКТУРА СЛОВ ФОРТА

До сих пор при описании Форта мы не рассматривали струк-
туру
представления скомпилированных слов в памяти компьютера.
Реализация Форта не стандартизована, поскольку се эффектив-
ность зависит от используемого процессора и типа вычислительной
системы. Однако многие реализации похожи друг на друга, и, в
частности, реализацию, описанную в книге, можно считать доста-
точно типичной. На рис. 6.5 приведена структура слов Форта.

Элемент словаря состоит из четырех полей. Их названия ра-
сположены в правой части рисунка. Базовые адреса каждого из
этих полей также имеют свои наименования, которые показаны на
рисунке слева. Первое поле называется полем связи. Оно распо-
лагается по адресу поля связи Ufa). Поле связи содержит ука-
затель на предшествующее слово в словаре. С помощью таких ука-
зателей слова из словаря увязываются в единую списковую струк-
туру. В первом слове словаря значением поля связи является ноль,
что означает конец списка.

Обратите внимание на то, что на рисунке слово СЛОВО2 свя-
зано в обратном направлении с другим полем предшествующего
ему слова СЛОВО 1. Это поле называется полем имени и распола-
гается по адресу поля имени (nfa). Поле имени по своей структуре
представляется наиболее сложным из полей. Его первый байт тоже

138


Рис. в. 5. Структура словаря и слов Форта






















1 39


разбит на поля. Старший бит поля всегда равен единице, что ука-
зывает на начало поля имени. Старший бит последнего символа в
поле имени также равен единице. Старшие биты остальных симво-
лов равны нулю. Эти биты служат признаком продолжения поля
имени. Следующий бит первого байта поля имени (бит 6) равен
единице, если слово - компилирующее. Более подробные объясне-
ния будут даны позднее. Младшие пять бит первого байта состав-
ляют поле счетчика. В нем указывается количество символов в
имени слова, т.е. он выполняет ту же функцию, что и счетчик для
строки. Таким образом, поле имени - это строка специального
вида.

За полем имени следует поле кода, расположенное по адресу поля
кода
(cfa). В нем содержится указатель на слово, которое будет
выполняться после завершения слова СЛОВО1. Данная процедура
периода выполнения действует как интерпретатор слова (детально
мы рассмотрим ее ниже). Наконец, последнее поле - поле
параметров,
или тело СЛОВА1. Оно находится по адресу пол к
параметров
(pfa). Тело содержит данные или программу, опреде-
ляющую это слово в виде, получившем название " шитого" кода;
более подробно шитый код объясняется при описании виртуальной
Форт-машины.

Поскольку каждое поле имеет собственное назначение, иногда
может потребоваться адрес одного из них. По умолчанию поле
кода принято считать определяющим для слова. Для получения cfa
служит слово '(одинарная кавычка). Например, команда

' СЛОВО1

вернет cfa СЛОВА 1 и поместит его на стек. Приведенные ниже
слова позволяют выбрать адрес любого поля. Их назначение пояс-
няет следующая стековая нотация:

> BODY ( cfa => pfa)
> NAME ( cfa => nfa)
BODY> ( pfa => cfa)
NAME> ( nfa —> cfa)
L> NAME ( lfa ==> nfa)

Слово.ID дает возможность выдать на дисплей в виде строки
поле имени:

.ID (nfa => )

Передает на устройство вывода
поле имени в символьном виде.

Компилятором Форта используется переменная LAST, где
хранится nfa последнего слова, введенного в словарь, т.е. в ней на-
ходится указатель на первый элемент списковой структуры сло-
варя.

140





































УПРАВЛЕНИЕ СЛОВАРЕМ

В Форте имеется несколько слов для управления самим слова-
рем. Для перечисления слов из словаря, начиная с последнего вве-
денного в него слова (указатель на которое находится в перемен-
ной LAST), предназначено слово WORDS (или VLIST в некоторых
версиях Форта). Это слово, не относящееся к стандартным, дает
возможность просмотреть порядок слов в словаре и узнать, сколько
слов определено компилятором.

В процессе разработки программ может возникнуть необходи-
мость в удалении некоторых слов из словаря. Заданное слово, а
также все слова, находящиеся в списке за ним, могут быть удале-
ны словом FORGET. Для исключения из словаря CJIOBA1 и слов,
определенных после него, следует выполнить команду:

FORGET СЛОВО1

Слово FORGET проверяет содержимое переменной FENCE, в
которой хранится некоторое граничное значение адреса. Слова, на-
ходящиеся за этим адресом, не могут быть уничтожены. Если же
такая попытка предпринимается, то выдается сообщение:

СЛОВО1 PROTECTED

Для снятия защиты служит команда FENCE OFF. В перемен-
ной FENCE обычно находится указатель на последнее защищенное
слово.

В некоторых Форт-системах имеется слово SAVE, которое поз-
воляет сохранить текущую версию словаря, а потом загрузить его с
диска. Оно может оказаться полезным при необходимости хране-
ния словарей, содержащих уже скомпилированные слова для раз-
личных прикладных задач. Наконец, в некоторых системах имеет-
ся так называемый декомпилятор SEE, который восстанавливает
определения слов по коду, находящемуся в их телах. Этот деком-
пилятор располагается за именем слова, определение которого тре-
буется восстановить.
























ВИРТУАЛЬНАЯ ФОРТ-МАШИНА

Ранее уже вскользь упоминалось, что слова Форта делятся на
исполняемые и скомпилированные в виде шитого кода. Теперь мы
более подробно объясним, что это означает. Поскольку Форт в
полном объеме не был описан, то многие особенности вычислитель-
ной модели, лежащей в его основе, остались для вас скрыты. Нап-
ример, вы знаете, что Форт имеет два стека. А какие еще есть у
него компоненты? Хотя Форт может компилировать программу в
чистый машинный код, так же как и трансляторы с других языков

141



Jump ( (W) )


Косвенный переход по адресу,
у казанному в W


NEXT: WO< -((IP))

IP < - (IP)+2


JUMP (W)

прямой пермод «о адресу.

указанному в W


программирования, он еще содержит в себе и встроенный компиля-
тор, который активизируется словом: и завершает работу по сим-
волу; в конце определения через двоеточие. Большинство Форт-
компиляторов генерируют шитый код. Для иллюстрации этого об-
ратимся к такому языку программирования, как Ассемблер. Опыт-
ные программисты, разрабатывающие свои программы на Ассем-
блере, обычно выделяют в программе несколько подпрограмм, ко-
торые выполняют некоторые элементарные функции и при необхо-
димости могут составить базис других программ. В результате
основная программа представляет собой совокупность подпро-
грамм и обращений к ним. Форт устроен аналогично, но роль эле-
ментарных подпрограмм выполняют слова из его ядра. При созда-
нии слов более высокого уровня (определяемых через двоеточие)
вместо компиляции обращений к словам ядра Форт фактически
компилирует их адреса. Таким образом, шитый код представляет
собой список адресов подпрограмм, подлежащих выполнению.

В подобном виде шитый код, конечно, не может быть выпол-
нен, так как в нем отсутствуют операторы перехода. Для исполне-
ния кода применяется небольшая специальная программа, называ-
ющаяся адресным интерпретатором, или внутренним интерпре-
татором
NEXT. Упомянутый интерпретатор весьма прост. На
рис. 6.6 приведена схема его работы. Во-первых, хотя это и может
показаться вам очевидным, единственным кодом, который способен
воспринять компьютер, является машинный код. т.е. слова типа
CODE и собственно внутренний интерпретатор. Операторы
перехода, находящиеся во входном потоке команд, в конце концов
обязательно должны достигать подпрограмм, представленных в
машинном коде. В большинстве восьмиразрядных компьютеров
применяется косвенный шитый код (рис. 6.6А).На компьютерах,
оснащенных более эффективным микропроцессором 68000, может
быть выполнен прямой шитый код (рис. 6.6В). Поскольку различия
между ними незначительны, мы рассмотрим только один из них -
косвенный шитый код.

Виртуальная Форт-машина имеет два регистра, используемые
внутренним интерпретатором. Под них обычно резервируется две
области памяти. В первом регистре находится указатель IP на ко-
манды шитого кода, выполняющий в программе функцию счетчика
команд. Второй регистр W является рабочим, в нем хранятся вре-
менные данные. Внутренний интерпретатор NEXT обрабатывает
шитый код следующим образом. Сначала он выбирает содержимое
области памяти, на которую ссылается указатель IP. В ней
находится cfa выполняемого слова. Затем cfa помещается в W и
осуществляется косвенный переход на содержимое W. Записав в W
cfa выполняемого слова, мы тем самым запомнили точку продол-
жения вычислений (она имеет имя FOO). Далее происходит пере-
ход от cfa к его содержимому. В cfa находится указатель на проце-
дуру периода выполнения, которая будет интерпретировать данное


 6.8, Внутренний интерпретатор Форта: косвенного шитого кода
(А), прямого шитого кода (В)


 


142


143


слово. Для слов, определенных с помощью слова; , упомянутая
процедура имеет имя NEST. Иногда сна также называется DO-
COLON или (: ) - в последних версиях Форта.

Процессор сможет продолжить вычисления с данного слова,
поскольку оно всегда должно находиться в машинном коде. Пос-
леднее условие является настолько важным, что заслуживает быть
сформулированным в виде общего правила: cfa слова должно
содержать указатель только на машинны й код.

Процедура NEST поместит содержимое IP на стек возвратов,
а содержимое W - в IP, затем увеличит значение IF таким обра-
зом, чтобы оно указывало на pfa слова FOO. Поскольку FOO опре-
делено через двоеточие, IP будет уже указывать на первый адрес
шитого кода в FOO, после чего NEST перейдет на слово NEXT, a
слово FOO начнет интерпретироваться. Последним адресом шитого
кода, интерпретируемого словом NEXT, является слово UNNEST
типа CODE. Оно помещает верхний элемент стека возвратов в IP
и вызывает NEXT. Это приводит к возврату внутреннего интер-
претатора на слово, которое вызвало только что завершившееся
слово. В случае прямого шитого кода NEXT перейдет непосредст-
венно на cfa слова, которое будет выполняться, поэтому по адресу
поля кода (cfa) должен находиться переход на NEST, представлен-
ный обязательно в машинном коде. Отсюда следует, что прямой
шитый код ближе к машинному, чем косвенный, но и работать с
ним труднее, так как это фактически объектный код. Программы в
их исходном виде для интерпретатора как косвенного, так и шито-
го кода в Форте практически одинаковы.

Помимо двух стеков и регистров внутреннего интерпретатора,
виртуальная Форт-машина содержит еще область памяти с именем
N. Такая временная рабочая память используется в основном
словами, выполняющими арифметические операции.


Поделиться:



Последнее изменение этой страницы: 2019-03-29; Просмотров: 226; Нарушение авторского права страницы


lektsia.com 2007 - 2024 год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! (0.092 с.)
Главная | Случайная страница | Обратная связь