Учебное пособие по языку ФОРТ
- Автор: ИТФ «Технофорт»
- Жанр: Современные российские издания / Литература ХX века (эпоха Социальных революций) / Программирование: прочее / Forth
- Дата выхода: 1993
Читать книгу "Учебное пособие по языку ФОРТ"
3. Арифметический стек
B языке Форт арифметическим или основным стеком (или просто стеком) называется участок оперативной памяти, используемый для размещения ЦЕЛЫХ чисел — аргументов и результатов операций языка.
Ha каждое число в стеке отводится 2 байта. Числа на стеке могут восприниматься различным образом в зависимости от того, какое слово их использует. Обычно они трактуются как числа из диапазона от -2**15 до 2**15-1, но есть слова, которые воспринимают их как числа от 0 до 2**16-1.
Хранимые в стеке числа упорядочены по положению. Стек функционирует по принципу "последним занесен - первым выбран" (LIFO). Будем говорить, что при добавлении числа оно заносится СПРАВА от имеющихся, начиная от ДНА стека; при удалении снимается крайнее правое число с ВЕРШИНЫ стека.
При пользовании стеком вся ответственность за его состояние ложится на программиста. Для того чтобы зрительно согласовать стековые изменения при выполнении слов, удобно применять так называемую стековую нотацию. Действие слов будем показывать на диаграмме
стек ДО операции --> стек ПОСЛЕ операции
причем не затрагиваемую операцией часть стека будем изображать многоточием. Для содержимого стека введем следующие обозначения:
малая латинская буква - значение в общем смысле
n - число
d - число двойной длины
c - символ
addr - адрес памяти
Выполнение слова, представляющего собой запись числа, добавляет в стек это число. Слово "." (точка) снимает число с вершины стека и печатает его. Очень полезное слово ".S" печатает весь стек, оставляя его неизменным.
Некоторые операции со стеком:
DUP ... a --> ... a a
DROP ... a --> ...
SWAP ... a b --> ... b a
OVER ... a b --> ... a b a
ROT ... a b e --> ... e e a
-ROT ... a b e --> ... e a b
NIP ... a b --> ... b
TUCK ... a b --> ... b a b
2DROP ... a b --> ...
2DUP ... a b --> ... a b a b
2SWAP ... a b e f --> ... e f a b
2OVER ... a b e f --> ... a b e f a b
PICK ... a {n чисел} n --> ... a {те же n чисел} a
ROLL ... a {n чисел} n --> ... {те же n чисел} a
B частности, "0 PICK" эквивалентно "DUP", a "1 PICK" слову "OVER"; "1 ROLL" эквивалентно "SWAP", a "2 ROLL" слову "ROT".
Слово "DEPTH" кладет в стек число, равное глубине стека - количеству элементов, находившихся в стеке перед исполнением этого слова.
Проследим, например, выполнение следующего текста:
1 2 3 DUP DEPTH -ROT 2OVER .S
Выпишем текст в столбик, сопровождая каждое слово состоянием стека после его исполнения:
1 ( 1 )
2 ( 1 2 )
3 ( 1 2 3 )
DUP ( 1 2 3 3 )
DEPTH ( 1 2 3 3 4 )
-ROT ( 1 2 4 3 3 )
2OVER ( 1 2 4 3 3 2 4 )
Иногда данные на стеке, сформированные одним словом и используемые потом другим словом, будем называть параметрами.