Каждое слово-команда, известное форт-системе, хранится в оперативной памяти (в словаре) в виде специальной структуры данных — словарной статьи, состоящей из поля имени, поля связи, поля кода и поля параметров. Стандарт не фиксирует порядок взаимного расположения этих полей, оставляя его на усмотрение разработчиков реализации. Как правило, поля располагаются подряд в том порядке, как они перечислены выше.
Поля имени и связи вместе образуют заголовок словарной статьи, который нужен для поиска статьи по имени слова. Результатом поиска являются поля кода и параметров, которые вместе образуют собственно тело словарной статьи, определяющее действие, связанное с данным словом, т.е. его семантику. Согласно стандарту словарную статью представляет адрес ее поля кода, исходя из которого можно получить адреса всех других ее полей. Поскольку именно этот адрес компилируется в шитый код, то он также называется адресом компиляции.
Поле имени содержит имя слова в виде строки со счетчиком. Стандарт ограничивает максимальную длину имени 31 литерой (5 двоичными разрядами), чтобы остающиеся разряды в байте счетчика можно было использовать под специальные признаки. Важнейший из них — признак немедленного исполнения, который обычно занимает старший разряд байта-счетчика. Таким образом, поле имени имеет переменную длину, которая определяется значением счетчика.
Поле связи занимает 2 байта и содержит адрес заголовка предыдущей словарной статьи. Через это поле словарные статьи связаны в цепные списки, в которых можно вести поиск статьи по имени слова. Поле связи первой статьи в списке содержит некоторое специальное значение, обычно нуль. Новые слова добавляются в конец списка, и поиск слов ведется от конца списка к началу.
Тело словарной статьи реализуется через шитый код в одной из его разновидностей. Для определенности примем за основу косвенный шитый код. В этом случае интерпретатор шитого кода называется адресным интерпретатором форт-системы, поскольку интерпретирует последовательность адресов, каждый из которых является адресом компиляции некоторой словарной статьи (адресом ее поля кода).
В качестве собственных данных адресный интерпретатор использует стек возвратов и указатель на текущее место в интерпретируемой последовательности адресов.
Поле кода словарной статьи в случае косвенного шитого кода занимает 2 байта и содержит адрес машинной программы, которая и выполняет действие, связанное с данным словом. Точка NEXT адресного интерпретатора обеспечивает этой программе доступ к полю параметров данной словарной статьи. Для статей, соответствующих определению через двоеточие, поле кода содержит адрес точки CALL адресного интерпретатора, а поле параметров представляет собой последовательность адресов словарных статей, входящих в данное определение. Завершается такая последовательность адресом словарной статьи EXIT (выход), который компилируется завершающей данное определение точкой с запятой. Для словарных статей нижнего уровня, т.е. реализованных непосредственно в машинном коде, поле кода содержит адрес соответствующей машинной программы, которая обычно располагается в поле параметров этой статьи. Таким образом, можно сказать, что поле кода словарной статьи содержит адрес машинной программы-интерпретатора поля параметров. Все слова, определенные через двоеточие, имеют в качестве интерпретатора действие CALL адресного интерпретатора, слова нижнего уровня наоборот имеют каждое свой отдельный интерпретатор в виде машинной программы, размещенной в поле параметров. В частности, такой программой для слова EXIT является действие RETURN адресного интерпретатора.
На рис. 2.4. приведены адресный интерпретатор и структура словарной статьи для определения
: F ( A ---> A*[A+1]/2 ) DUP 1+ 2 */ ;
вычисляющего сумму натуральных чисел от 1 до A по известной формуле. В качестве языка нижнего уровня для записи действий адресного интерпретатора применяется очевидная нотация. Переменная RI обозначает указатель текущего места в интерпретируемом коде, процедура MEM дает значение, находящееся по заданному адресу в памяти форт-системы. Процедуры RPUSH и RPOP используются для обращения к стеку возвратов с тем, чтобы положить значение на его вершину и снять верхнее значение.
