Особенности языка Форт

Курсовой проект - Компьютеры, программирование

Другие курсовые по предмету Компьютеры, программирование

°лога в Форте

 

Из предыдущих примеров не видно, откуда машина возьмёт те числа над которыми будут выполняться действия программы. Данные как бы уже предполагаются введёнными. Дело в том, что ввод данных - это не проблема языка Форт, это проблема Форт-системы. Этот язык не есть язык программирования в чистом виде, как например язык Паскаль который работает под управлением той или иной внешней операционной системы. Форт нуждается в собственной операционной системе, которая организует пошаговый диалог с пользователем. Работа пользователя заключается во вводе фрагмента текста, который Форт система пытается интерпретировать в соответствии с несложными правилами. Она вводимый текст разделяет на команды отделяющиеся друг от друга пробелами и пытается распознать их как команды языка Форт. Если это ей не удаётся, то она пытается их распознать их как числа и положить на стёк. Если и это ей не удаётся, то Форт-система выдаёт сообщение об ошибке. Таким образом, ввод данных осуществляется как ввод внешнего текста состоящего из записи чисел раздёленных пробелами. Точно так же вводятся фрагменты форт программы, и стало быть пользователь в процессе диалога с Форт-системой сам определяет порядок обработки данных форт программами. Пользователь на каждом шаге работы программы просто вводит некоторый текст, а что этот текст из себя представляет, данные или программу решает форт-система. Это нарушает наше обычное представление о работе программы. Обычно, ввод программы и данных разделяется. Сначала полностью вводится программа, а уж затем данные. Система Форт в этом отношении намного гибче.

 

Пример 4: Упорядочение массива по возрастанию

 

Это пример, мы разберём подробно.

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

Мы воспользуемся циклом DO. Для него на вершине стека должны лежать два значения начальное значение параметра и его конечное значение. Запишем команды, которые создадут необходимую структуру стёка.

 

DUP

1

SWAP

1

Запишем изменения вершины стека, которые происходят в процессе выполнения этих команд.

 

Команда 1: N N

Команда 2: 1 N N

Команда 3: N 1 N

Команда 4: 1 N 1 N

 

Таким образом, требуемая структура сформирована и можно записать заголовки цикла

 

DO

DO

 

Первый заголовок снял 1 и N и второй заголовок также снял 1 и N. Далее запишем тело циклов. Здесь мы поступим следующим образом: мы сравним два верхних значения, поменяем их местами если в этом есть необходимость и осуществим прокрутку стека на одну позицию

 

2DUP

>

 

Первый оператор дублирует одно двойное слово или что-то же самое два одинарных, то есть дублирует на вершине стёка два значения. Затем операция "больше" снимает два значения, назовём их А, В и если А > В то кладёт на вершину стёка единицу иначе кладёт ноль. Если на вершине стека единица, то А и В находятся в нужном порядке и ничего делать не надо, иначе их нужно поменять местами

 

IF

ELSE

SWAP

THEN

 

Оператор IF снимает со стека 1 или 0 (результат операции сравнения), если снята единица то ничего не происходит иначе два верхних элемента, а это опять А и В меняются местами. И теперь осталось провернуть стёк. Для этого необходимо выполнить команду N ROLL. Если N - количество элементов массива, то команда осуществит необходимый нам сдвиг стёка. Ясно, что нам опять нужно значение N, но оно было безвозвратно снято со стёка и забыто (о нём сейчас помнят только заголовки циклов). Вот тут мы сможем с пользой применить понятие переменной. Чтобы запомнить в оперативной памяти значение N мы в самом начале программы должны выполнить следующее

 

DUP

VARIABLE N

!

 

Это фрагмент дублирует значение N лежащее на стёке, следующая команда (Variable) резервирует в необходимое количество ячеек памяти и старший адрес зарезервированной области кладёт на стёк. Восклицательный знак снимает два значения со стека (адрес и значение N) и значение пересылает по адресу. Если теперь нам необходимо получить значение переменной N мы должны выполнить следующее:

 

N @

 

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

И осталось завершить циклы

 

LOOP

LOOP

 

Если есть потребность просмотреть массив, необходимо вывести все элементы стека на экран циклическим повторением команды точка.

 

N @ (кладем на стек количество элементов массива)

1 (Кладем на стёк начальное значение параметра цикла)

DO (Снимаем со стека параметры цикла и начинаем работу)

. (Снимаем очередной элемент стека)

LOOP (Переходим к новому шагу цикла)

 

Запишем полученную программу целиком

 

(Создание переменной)

DUP

VARIABLE N

!

(Создание необходимой структуры данных для организации циклов)

DUP

1

SWAP

1

(Обработка массива)

DO

DO

2DUP

>

IF

ELSE

SWAP

THEN

N @

ROLL

LOOP

LOOP

(Выв