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



             

Локальные переменные


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

Для упрощения работы желательно закрепить за локальным объектами внутри определения некоторые постоянные имена, через которые и осуществлять доступ к ним.

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

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

Простейшая надстройка над языком Форт, которая позволяет работать с локальными переменными, выглядит так:

100 ALLOT HERE CONSTANT LP0 ( НАЧАЛО ЛОК. СТЕКА) VARIABLE LP ( ТЕКУЩАЯ ВЕРШИНА ЛОКАЛЬНОГО СТЕКА) : INIT ( ->) LP0 LP ! ; INIT : LOC ( N:СЧЕТЧИК->) 1+ 2* LP @ OVER - DUP LP ! ! ; : UNLOC ( ->) LP @ @ LP +! ; : @@ ( N:СМЕЩ->) CREATE , DOES> ( PFA->A) @ LP @ + @ ; : !! ( N:СМЕЩ->) CREATE , DOES> ( A,PFA->) @ LP @ + ! ; 2 @@ @1 4 @@ @2 6 @@ @3 8 @@ @4 10 @@ @5 ( И Т.Д.) 2 !! !1 4 !! !2 6 !! !3 8 !! !4 10 !! !5 ( И Т.Д.)

Вначале отводится область объемом 100 байт и адрес ее конца запоминается как константа LP0. Эта область будет использоваться как локальный стек, растущий в сторону убывания адресов. Переменная LP хранит указатель на текущую вершину локального стека, ее инициализацию выполняет слово INIT, которое присваивает ей значение LP0.


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