Руководство по программированию на Форте [Илья Тарасов] (fb2) читать постранично, страница - 4

- Руководство по программированию на Форте 545 Кб, 67с. скачать: (fb2)  читать: (полностью) - (постранично) - Илья Тарасов

 [Настройки текста]  [Cбросить фильтры]

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

В состав словаря, естественно, входят и арифметико-логические операции. Они точно так же, как все слова Форта, получают свои параметры со стека и возвращают результат на стек. Вот их список:


Имя Стековая нотация Описание + ( A, B → A + B ) Заменяет два верхних числа со стека данных их суммой. – ( A, B → A - B ) Заменяет два верхних числа со стека данных их разностью. * ( A, B → A * B ) Заменяет два верхних числа со стека данных их произведением. / ( A, B → A / B ) Заменяет два верхних числа со стека данных частным от их деления. MOD ( A, B → A mod B ) Заменяет два верхних числа со стека данных остатком от их деления. /MOD ( A, B → A / B, A mod B) Заменяет два верхних числа со стека данных частным и остатком от их деления. ABS ( A → |A| ) Заменяет число его модулем (абсолютным значением). NEGATE ( A → –A ) Изменяет знак числа на противоположный. AND ( A, B → A and B ) Заменяет два верхних числа со стека данных их побитным логическим И. OR ( A, B → A or B ) Заменяет два верхних числа со стека данных их побитным логическим ИЛИ. XOR ( A, B → A xor B ) Заменяет два верхних числа со стека данных их побитным логическим ИСКЛЮЧАЮЩИМ ИЛИ. NOT ( A → not A ) Заменяет число со стека данных его логическим отрицанием.
Из таблицы видно, что все арифметические операции должны выполняться уже после того, как соответствующие числа оказались на стеке. В этом Форт не делает исключений. Результатом же такого правила является необходимость использования постфиксной, или обратной польской, записи формул. Вначале записываются числа в том порядке, как это указано в стековой нотации, а затем идет слово – арифметическая операция. Например, 2 + 2 на Форте будет выглядеть как 2 2 +

Приведем еще несколько примеров записи арифметических выражений:


Обычная запись Постфиксная запись 4 – 3 4 3 – 6 * 7 6 7 * (2 + 3) * 5 – 6 2 3 + 5 * 6 –
Можно сделать одно важное наблюдение: постфиксная запись не требует скобок. Сколь угодно сложное математическое выражение может быть записано путем последовательного перечисления переменных и операций над ними.

Такая форма записи, конечно, непривычна и является одним из главных аргументов при критике Форта. Можно долго перечислять достоинства и недостатки такого подхода, однако следует заметить, что постфиксная запись является не синтаксическим «вывертом», а практически единственной формой представления выражений, пригодной для работы со стеком и словарем – базовыми понятиями Форта, представляющими собой его основу.

Освоение постфиксной записи является, пожалуй, одним их важнейших условий успешной работы с Фортом. В действительности мы довольно часто используем такой подход, например, при интенсивных расчетах на простых калькуляторах, рассчитывая отдельные составляющие формул и записывая их отдельно, а затем перегруппировывая записанные данные. При освоении Форта можно представлять себе числа в виде квадратиков с написанными на них значениями, а арифметические действия выполнять, мысленно по очереди перемещая их «на стек» и применяя к ним нужную операцию.

Можно заметить, что стек данных является целочисленным, поскольку использует такие понятия, как целая часть и остаток от деления. Это означает, что он дает возможность оперировать только с числами формата integer. Разрядность чисел на стеке определяет и разрядность транслятора как такового.

Одним из недостатков такого представления чисел является ограниченный диапазон, особенно для 16-разрядных трансляторов. Особенно эти недостатки проявляются при операциях типа A*B/C. Хотя результат может и укладываться в отведенный для него диапазон, на промежуточном этапе возможно получение числа, превышающего максимально допустимое для записи в стек. Лишние разряды числа будут автоматически отброшены процессором, и мы получим неверный результат. Для того чтобы устранить подобные ситуации, стандартом предусмотрены несколько слов, выполняющих подобные операции за один проход.


Имя Стековая нотация Описание */ ( A, B, C → A*B/C ) Выполняет вычисления в соответствии со стековой нотацией. */MOD ( A, B, C → A*B/C, A*B mod C) то же
Особенностью приведенных слов является то, что промежуточный результат представляется с двойной точностью (обычно в системе команд современных процессоров имеется такая возможность). Запись промежуточного результата в стек при этом не