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

Логические операции


В языке Форт имеется только один тип значений — 16-разрядные двоичные числа, которые, как мы видели, рассматриваются в зависимости от ситуации как целые числа со знаком или как адреса и т. д. Точно так же подходят и к проблеме представления логических значений ИСТИНА и ЛОЖЬ: число 0, в двоичном представлении которого все разряды нули, представляет значение ЛОЖЬ, а любое другое 16-разрядное значение понимается как ИСТИНА. Вместе с тем стандартные слова, которые должны возвращать в качетве результата логическое значение, из всех возможных представлений значения ИСТИНА используют только одно: число -1 (или, что то же самое, 65535), в двоичном представлении которого все разряды единицы. Такое соглашение связано с тем, что традиционные логические операции конъюнкции, дизъюнкции и отрицания выполняются в Форте поразрядно над всеми шестнадцатью разрядами операндов:

AND A,B ---> A B логическое И OR A,B ---> A B логическое ИЛИ XOR A,B ---> A B исключающее ИЛИ NOT A ---> ^ A логическое НЕ

Как и в предыдущих случаях, эти операции не являются независимыми: операция отрицания (поразрядное инвертирование) легко выражается через исключающее ИЛИ (поразрядное сложение по модулю два):

: NOT ( A --> ^A ) -1 XOR ;

Нетрудно увидеть, что для принятого в Форте стандартного представления значений ИСТИНА и ЛОЖЬ все эти слова работают, как обычные логические операции.

Логические значения возникают в операциях сравнения, которые входят в обязательный набор слов и имеют общепринятую программистскую мнемонику:

< A,B ---> A < B меньше = A,B ---> A = B равно > A,B ---> A > B больше

Эти операции снимают со стека два врехних значения, сравнивают их как числа со знаком (операция «равно» выполняет поразрядное сравнение) и возвращают результат сравнения как значение ИСТИНА или ЛОЖЬ в описанном выше стандартном представлении. Из-за стремления к минимизации обязательного набора операций в него не включены слова для операций смешанного сравнения, поскольку их легко выразить через уже имеющиеся:


: <= ( A,B ---> A <= B ) SWAP < NOT ; : >= ( A,B ---> A >= B ) SWAP > NOT ; : <> ( A,B ---> A <> B ) = NOT ;

Для сравнения 16- разрядных чисел без знака имеется слово U< A,B --> A < B. Эта операция обычно используется для сравнения адресов, которые лежат в диапазоне от 0 до 65535. Буква U (от UNSIGNED — беззнаковый) в ее мнемонике говорит о том, что операнды рассматриваются как числа без знака.

Ввиду частого использования и возможности непосредственной реализации на многих существующих ЭВМ в обязательный набор слов включены одноместные операции сравнения с нулем:

0< A ---> A < 0 0= A ---> A = 0 0> A ---> A > 0

При этом слово 0= можно использовать вместо NOT как операцию логического отрицания, и в отличие от NOT оно будет правильно работать при любых представлениях логического значения ИСТИНА.

Описанные выше двухместные операции сравнения естественным образом выражаются через сравнения с нулем:

: < ( A,B ---> A < B ) - 0< ; : = ( A,B ---> A = B ) - 0= ; : > ( A,B ---> A > B ) - 0> ;

Стандартное расширение двойных чисел имеет аналогичные слова для сравнения 32-разрядных значений:

D0= AA ---> AA = 0 D< AA,BB ---> AA < BB D= AA,BB ---> AA = BB DU< AA,BB ---> AA < BB

Слова D< и DU< различаются тем, что первое рассматривает свои операнды как числа со знаком, а второе — как числа без знака. Для слов D0= и D= такое различие несущественно, их, например, можно определить так:

: D0= ( AA ---> AA = 0 ) OR 0= ; : D= ( AA,BB ---> AA = BB ) D- D0= ;

Слово OR (логическое ИЛИ) в определении слова D0= логически складывает старшую и младшую половины исходного 32-разрядного значения. Нулевой результат будет получен тогда и только тогда, когда исходное значение было нулевым. Следующее слово 0= преобразует этот результат к логическому значению в стандартном представлении. Исполнение слова D= состоит в вычислении разности его операндов в сравнении этой разности с нулем.


Содержание раздела