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

         

Константы и переменные, работа с памятью - часть 3


Слово ALLOT (распределить) резервирует в словаре область памяти, размер которой (в байтах) снимает со стека. Резервирование состоит в том, что текущее значение указателя изменяется на заданную величину, поэтому при положительном значении запроса память отводится вплотную от вершины словаря, а при отрицательном значении запроса происходит освобождение соответствующего участка памяти. Наконец, слово , (запятая) выполняет так называемую «компиляцию» значения, снимаемого со стека: значение переносится на вершину словаря, после чего указатель вершины продвигается на 2 (размер в байтах скомпилированного значения). Некоторые из приведенных слов легко выражаются через другие:

: , ( A --> ) HERE ! 2 ALLOT ; : 2@ ( A --> BB ) DUP 2 + @ SWAP @ ;

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

А как создать в словаре поименованную область памяти? Можно завести область и связать ее адрес с именем через описание константы: HERE 10 ALLOT CONSTANT X10. Слово HERE оставляет на стеке адрес текущей вершины словаря, затем при исполнении текста 10 ALLOT от этой вершины резервируется 10 байт, после чего слово CONSTANT связывает адрес зарезервированной области с именем X10. В дальнейшем при исполнении слова X10 этот адрес будет положен на стек.

Другой возможный путь состоит в использовании слова CREATE (создать) --> в таком контексте: CREATE X10 10 ALLOT. Слово CREATE, подобно слову VARIABLE, выбирает из входной строки очередное слово и определяет его как новую команду с таким действием: положить на стек адрес вершины словаря на момент создания этого слова. Поскольку следующие действия в приведенном примере резервируют память, то слово X10 будет класть на стек адрес зарезервированной области. Очевидно, что слово VARIABLE можно выразить через CREATE

: VARIABLE ( ---> ) CREATE 2 ALLOT ;

или иначе (если мы хотим инициализировать нулем значение создаваемой переменной):

: VARIABLE ( ---> ) CREATE 0 , ;




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