Язык Форт и его реализации


         

Определяющие слова - часть 3


Разберем, как работает данное определение при создании вектора 10 ВЕКТОР X.

Создающая часть компилирует размер вектора и вслед за этим отводит память на 10*2, т.е. 20 байт. Таким образом, для вектора X в словаре отводится область размером 22 байта, в первых двух байтах которой хранится число 10 — размер вектора. При обращении к вектору X на стеке должно находиться значение индекса. Слово DOES> кладет сверху адрес области, сформированной создающей частью, после чего работает исполняющая часть определения. Проверив, что индекс I лежит в диапазоне от 1 до 10, она оставляет на стеке адрес, равный начальному адресу области плюс I*2, т.е. адрес I-го элемента вектора, если считать, что элементы располагаются в зарезервированной области подряд. Слово EXIT (выход) завершает исполнение определения, что позволяет обойтись без части «иначе» в условном операторе. Если окажется, что индекс не положителен или больше числа элементов, то будет напечатано сообщение «ошибка в индексе» словом .", и исполнение закончится через слово ABORT (выброс). Если по каким-либо причинам контроль индексов не нужен, можно дать более краткое определение:

: ВЕКТОР ( N:PA3MEP ---> ) CREATE 2 * ALLOT DOES> ( I:ИНДЕКС,A ---> A[I]:АДРЕС ЭЛ-ТА I) SWAP 1- 2 * + ;

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

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

Используемый в языке Форт способ введения определяющих слов связан с очень важным понятием — частичной параметризацией. Определяющее слово задает целый класс слов со сходным действием, которое описывается исполняющей частью определяющего слова. Каждое отдельное слово из данного класса характеризуется результатом исполнения создающей части — тем или иным содержимым связанной с ним области памяти, адрес которой передается исполняющей части как параметр.Таким образом, исполняющая часть — то общее, что характеризует данный класс слов, — во время ее исполнения частично параметризуется результатом исполнения создающей части для данного отдельного представителя этого класса. Как создающая часть, так и частично параметризованная исполняющая часть, могут требовать дополнительных параметров для своего исполнения (в примере для вектора это размер вектора и индекс). Все это представляет программисту практически неограниченную свободу в создании новых понятий и удобных инструментальных средств.




Содержание  Назад