СТРУКТУРА СЛОВАРНОЙ СТАТЬИ
Все определения, независимо от того, были ли они специфицированы посредством :, VARIABLE, CREATE или любого другого определяющего слова, состоят из следующих полей1:
- поля имени; поля связи;
- поля кода;
- поля параметров.
Точное представление перечисленных полей в памяти зависит от реализации. И хотя Стандарт-83 предписывает полю имени «естественную длину» (в словаре запоминаются все символы имени - максимально 31), в наших примерах будет использоваться вариант с тремя хранимыми символами имени, так как это легче объяснить.
Ниже показано на примере переменной ДАТА, как рассматриваемые поля располагаются в памяти. На приведенной ниже схеме каждая строка представляет ячейку словаря.
1 Для систем, функционирующих на Форт-процессорах. Приводимая структура элементов словаря и техника вызова процедур относится к виртуальным Форт-системам, реализованным на обычных процессорах с применением косвенного шитого кода, а не к системам, где Форт-процессор реализован непосредственно в кремнии. (Но, изучив материал настоящей главы, вы скорее поймете, как работает Форт-машина.)
Поле имени. В нашем примере первый байт этого поля содержит число символов полного имени определяемого слова (в слове ДАТА четыре буквы). В следующих трех байтах хранятся представления первых трех букв имени определяемого слова в коде ASCII. В системах, где сохраняются только три символа имени, - это вся информация, которая используется апострофом или ['] для сравнения имени определения со словом из входного потока.
(Заметьте, что знаковый бит байта, в котором расположен счетчик символов, используется во время компиляции и показывает, будет ли данное слово исполняться во время компиляции или просто компилироваться в новое определение. Более подробно об этом идет речь в гл. 11.)
Поле связи. Ячейка связи содержит адрес предыдущего определения в словарном списке и применяется при поиске по словарю. В несколько упрощенном виде можно представить организацию связи следующим образом. Всякий раз, добавляя в словарь новое слово, компилятор заносит в поле связи указатель адреса предыдущего определения.
На рисунке он заносит в поле связи слова КУЛИНАРИЯ указатель определения АВТОМОБИЛЬ.
Свой поиск апостроф или ['] начинает с самого последнего занесенного в словарь слова и просматривает «цепочку» в обратном направлении с помощью адресов находящихся в ячейках связи.
Поле связи первого определения в словаре содержит нуль, который предписывает апострофу прекратить поиск - искомого слова в словаре нет
Поле кода. Следующим полем является поле кода Адрес, содержащийся в этом поле, позволяет отличать переменную от константы или от определения через двоеточие. Выполнение Форт-системой некоторого слова заключается в, исполнении процедуры на машинном языке, на которую есть ссылка в данном поле Например, в случае переменной указатель, ссылается на код, который помещает адрес этой переменной в стек, в случае константы - на код, который помещает в стек ее содержимое, а в случае определения через двоеточие - на код, выполняющий оставшуюся часть этого определения.
Код, на который происходит ссылка, называется кодом периода выполнения, потому что он используется при выполнении слова данного вида (а не тогда, когда оно определяется или компилируется).
Все переменные имеют свой один и тот же указатель кода, а все константы - свой Все определения через двоеточие - то же и т. д.
Поле параметров. За полем указателя кода следует поле параметров. В случае переменных и констант роле параметров представляет собой только одну ячейку, в случае 2CONSTANT или 2VARIABLE
- две, в случае массива - столько, сколько вы пожелаете, а в случае определения через двоеточие длина поля параметров зависит от длины данного определения, о чем и пойдет речь в следующем разделе.