Учебное пособие по языку ФОРТ [ИТФ «Технофорт»] (fb2) читать постранично, страница - 2


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

языка.

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 )

Иногда данные на стеке, сформированные одним словом и используемые потом другим словом, будем называть параметрами.

4. Арифметические операции

Арифметический стек — основное поле для выполнения арифметических действий и хранения промежуточных результатов вычислений. Надо только помнить, что знак операции (точнее слово, обозначающее операцию) пишется ПОСЛЕ того, как аргументы в стеке уже размещены.

Текст

  13  3  - 

помещает в стек число 10, так как слово "-" (минус) извлекает из стека два числа, сперва вычитаемое, потом уменьшаемое, и помещает в стек их разность:

  -               ...  a  b   -->        ...  a-b

C другими операциями все обстоит аналогично

  +            ...  a  b   -->        ...  a+b

  *            ...  a  b   -->        ...  a*b

  ABS          ...  a      -->        ...  |a|

  NEGATE       ...  a      -->        ...  -a

  /            ...  a  b   -->        ...  целая часть

  MOD          ...  a  b   -->        ...  остаток

  /MOD         ...  a  b   -->        ...  остаток    целая часть

B трех последних словах имеются в виду остаток и целая часть частного от деления а на b. Так, при делении 26 на 7 имеем:

         26  7         /    -->  3

         26  7        MOD   -->  5

         26  7        /MOD  -->  5  3

Имеются специальные слова для действий c 1 и 2 (они выполняются немного быстрее)

  1+                 ...  a      -->  ...  a+1

Аналогично работают "1-", "2+", "2-", "2*", "2/".

Следующие слова выполняют поразрядные логические операции над двоичным представлением чисел; в этих операциях числа трактуются как наборы из шестнадцати битов.

  AND       ...        a  b   -->  ...  a AND b  ( И )

  OR        ...        a  b   -->  ...  a OR  b  ( ИЛИ )

  NOT       ...        a      -->  ...    NOT a  ( HE )

  XOR       ...        a  b   -->  ...  a XOR b  ( ИСКЛЮЧАЮЩЕЕ ИЛИ )

5. Определение новых слов

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