на тему рефераты Информационно-образоательный портал
Рефераты, курсовые, дипломы, научные работы,
на тему рефераты
на тему рефераты
МЕНЮ|
на тему рефераты
поиск
Особенности языка Форт
ля организации циклов с целочисленной переменной - счётчиком цикла - используются слова:

DO A, B исполнение

LOOP исполнение

+LOOP A исполнение

I A исполнение

J A исполнение

LEAVE исполнение

Такие циклы записываются в одной из следующих двух форм : DO <тело> LOOP или DO <тело> + LOOP. В обоих случаях цикл начинается словом DO, которое снимает со стёка два значения: начальное и конечное и запоминает их. Текущее значение счётчика полагается равным начальному значению, после чего исполняются слова, составляющие тело цикла. Слово LOOP увеличивает текущее значение счётчика на единицу и проверяет условие завершения цикла. В отличие от него слово +LOOP прибавляет к текущему значению счётчика значение шага, которое вычисляется на стёке телом цикла и рассматривается как число со знаком. В обоих случаях условием завершения цикла является пересечение границы между А-1 и А при переходе от прежнего значения счётчика к новому, где А - конечное значение, снятое со стёка словом DO. Если пересечения не произошло, то тело цикла исполняется вновь с новым значением счётчика в качестве текущего.

Внутри тела цикла слово I кладёт на стёк текущее значение счётчика. Слово LEAVE, употреблённое внутри цикла вызывает прекращение исполнения его тела; управление переходит к словам следующим за словом LOOP или +LOOP. В программировании часто применяется конструкция цикл в цикле. Чтобы во внутреннем цикле получить текущее значение счётчика объемлющего цикла, используется слово J.

5 Примеры программ

Пример 1: Вычисление факториала

Dup 2 if drop 1

1 если N <2 то N! = 1

Else

N иначе

Dup

S, K, S=N, K=N

Begin

S, K

1 -

S, K, K = K -1

Swap over

K, S, K

* swap

S, K, S=S*K

Dup 1 =

S, K, K=1

Until

S, 1, S = N!

Drop then;

N!

Пример 2: Вычисление наибольшего общего делителя

2dup < swap then

Теперь A>=B

Begin dup

A, B, B

While

Пока В не ноль

2dup mod

А, В, С: остаток

Rot

B, C, A

drop

A, B, A=B, B=C

Repeat drop;

НОД

Пример 3: Вычисление суммы квадратов

0 swap

0, N S[0] = 0

1+ 1

S[0], N+1, 1

Do I

S[I-1], I

Dup * +

S[I] S[I]=S[I] + I*I

Loop

S[N]

6 Организация диалога в Форте

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

Пример 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

(Вывод массива для просмотра)

N @

1

DO

.

LOOP

7. Определяющие слова

Тип данных это не только указание на необходимый объём памяти, но и перечень допустимых операций. Эти самые допустимые операции выглядят так очевидно, что наверное не сразу возникает идея, что допустимые операции также можно определять.

Конечно, те
операции, которые приклеиваются к базовым типам, реализуются разработчиком компилятора и они для изменения недоступны, и конечно, нельзя допустить, чтобы программист - пользователь компилятора имел возможность менять код компилятора, но операцию можно реализовать и средствами самого языка высокого уровня. Это будет почти та же самая процедура или функция языка, с той лишь разницей, что она будет жёстко привязана к конкретным данным. Если таким образом к стандартному типу данных (такому как мы рассматривали в первой лекции) добавить набор процедур и функций, то получится совершенно новая языковая структура именуемая объектом. Объект хорошо тем, что в нём полностью описывается всё, что нужно для понимания его смысла, обработки, размещения в памяти, поэтому программа, построенная из объектов, становится более понятной и более прозрачной для восприятия. Такой подход широко распространён. Это сейчас называется объектным программированием, а язык Форт - это один из первых языков, где прозвучала идея объектного программирования. Правда в Форте нет терминов используемых ныне: объект, класс, инкапсуляция и т.д., но ведь это одна из первых попыток! А теперь перейдём к Форту.

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

Синтаксис определяющего слова

CREATE > СОЗДАВАЕМАЯ ЧАСТЬ

DOES > ИСПОЛНЯЕМАЯ ЧАСТЬ

Рассмотрим в качестве примера определение понятия вектор. При создании вектора будем указывать размер (число элементов), а при обращении к нему - индекс элемента, в результате чего получается адрес данного элемента. Этот адрес можно разыменовать и получить значение элемента или можно заслать по этому адресу новое значение. Если желательно контролировать правильность индекса при обращении к вектору, то определение может выглядеть так:

; Вектор CREATE DUP , 2*ALLOT

DOES >

OVER 1- OVER U< (Проверка индекса)

IF SWAP 2 * + EXIT THEN

. "Ошибка в индексе"

Рассмотрим, как работает данное определение при создании вектора 10 вектор Х.

Создающая часть компилирует размер вектора и вслед за этим отводит память на 10*2 байт. Таким образом, в словаре для вектора Х отводится размером 22 байта, в первых двух байтах хранится число 10 - размер вектора. При обращении к вектору Х на стеке должно находиться значение индекса. Слово DOES> кладёт сверху адрес области сформированной создающей частью, после чего работает исполняющая часть определения. Проверив, что индекс лежит в диапазоне между 1 и 10, она оставляет на стёке адрес, равный начальному адресу области плюс I*2 то есть адрес I - го элемента вектора, если считать, что элементы располагаются в зарезервированной области подряд. Если окажется, что индекс не положителен или больше числа элементов, то будет напечатано сообщение "Ошибка в индексе" и исполнение закончится через слово ABORT.

Заключение

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

Литература

Вострикова З.П. и др. "Программирование на языке "БЕЙСИК" для персональных ЭВМ". Машиностроение, 1993г.

Гохман А.В. и др. "Сборник задач по математической логике и алгебры множеств", издательство Саратовского Университета, 1969г.

Гусев В.В. Основы импульсной техники. М. Советское радио, 1975

Касаткин В.Н. "Информация, алгоритмы, ЭВМ", М. Просвещение, 1991г.

Машовцев В.А. Вступительные экзамены по информатике//Информатика. 1997, №13

Орлов В.А. О вступительных экзаменах по информатике//Информатика, 1997, №15

Яснева Г.Г. Логические основы ЭВМ//Информатика и образование, 1998, №2

Лыскова В.Ю., Ракитина Е.А. Логика в информатике, М. Информатика и образование 1999

Шауцкова Л.З. “Решение логических задач средствами алгебры логики”, газета Информатика 1999, №5.

Страницы: 1, 2



© 2003-2013
Рефераты бесплатно, курсовые, рефераты биология, большая бибилиотека рефератов, дипломы, научные работы, рефераты право, рефераты, рефераты скачать, рефераты литература, курсовые работы, реферат, доклады, рефераты медицина, рефераты на тему, сочинения, реферат бесплатно, рефераты авиация, рефераты психология, рефераты математика, рефераты кулинария, рефераты логистика, рефераты анатомия, рефераты маркетинг, рефераты релиния, рефераты социология, рефераты менеджемент.