Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Язык программирования (и ОС) ФОРТ (FORTH) 0025: Работа с Форт-системой


Информационный Канал Subscribe.Ru

Семантика слова Форт многообразна.

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

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

Хочу сразу обратить внимание: повсеместное использование GUI (графический
интерфейс пользователя), который сейчас пихают во все что движется (точнее
считает) -- тупиковый путь ! Доказать это очень просто -- на языке, если он
достаточно полон, можно описать любые действия. Нарисовать можно только то,
что предусмотрел разработчик вашей рисовалки. При использовании средств
графического интерфейса или визуального программирования вы получаете на
несколько порядков меньше возможностей, чем при использовании языковых
средств. Если вы хотя бы немножно понадаблюдаете, вы сразу увидите слепоту
околокомпьютерного человечества, будь то пользователи, службы их поддержки
(администраторы, настройщики ПО и т.д.) и самое печальное программисты. Куча
корпораций начиная с Xerox, IBM, Microsoft, а теперь еще и сотни активных
участников движения OpenSource (авторы KDE и иже с ними) превратили
пользователей в обезьян с мышью !

Причины этого очень просты:

1. люди не в состоянии преодолеть "барьер обучения" у себя в голове, и освоить
пару-тройку языков програмирования хотя бы на минимальном уровне, чтобы быть
в
состоянии заставить работать компьютер, а не махать мышью самому (вы еще не
видели дуриков, которые вручную (в FARе) перекачивают по FTP в течение
нескольких недель результаты испытаний пром.установки из соседнего города ?
уверяю, таких 90% всех пользователей, и они в этом почти не виноваты 8-( )

2. авторы программ изначально не дают пользователям возможности модифицировать
код, выкинуть ненужные части или добавить свои, или хотя бы использовать
программный интерфейс для автоматизации каких-то действий. Тем, кто прозрел и
освоил программирование, зачастую приходится писать те же функции, которыми
уже обладают десятки готовых программы. В простых случаях это не критично --
выгода от того, что работает компьютер, а не вы, перевешивает затраты на
программирование. Но к сожалению очень часто самостоятельно написать такой
софт практически невыгодно (из-за затрат на отладку, а особенно если
используются какие-то закрытые или сложные алгоритмы), а готовый софт не дает
доступа к своим функциям или делает это очень ограниченно.

Естественно я не призываю всех снести Windows/KDE/PalmOS/., дружно убраться в
командную строку (несколько командных консолей в графическом режиме -- не GUI)
и обложиться книжками по программированию. Нужно смотреть на то, что вы
делаете на компьютере: если вы его используете на уровне не выше
универсального плеера и сетевой бродилки, вам великолепно подходит любая
современная графическая среда. Если же вы хотя бы ведете на нем переписку или
документацию фирмы, у вас гарантированно есть задачи, к которым нужно
приложить голову -- хотя бы автоматическое резервное копирования данных и
оповещение о входящей почте.

Опять же я не предлагаю делать все из командной строки -- если вам почти
всегда нужно запустить что-то вручную, удобнее нажать экранную кнопку или
пункт меню мышью, чем вводить иногда очень длинное (авторам 1С Бухгалтерии
пора сделать промывание мозгов) имя команды. Но GUI должен быть именно и
только UI (пользовательским интерфейсом), а не пришит намертво к основному
коду. Именно поэтому надо давить в зародыше Delphi и подобную дрянь, а вместо
этого уходить на развитие (скриптовых или компилируемых -- не важно) языков,
прививание программистам привычки обеспечивать удобный программный интерфейс
и
делать программы отдельно из основной части и легко отрываемого/заменяемого
пользовательского интерфейса, и обучение пользователей минимальным навыкам
программирования. Авторов современных учебных программ в школах и ВУЗах
отправить в забой или с метлой на улицы, преподавателей -- на переподготовку
в обязательном порядке.

Запускаем несколько (см. выше) форт-систем под
вашей ОС и в симуляторах, и начинаем знакомится с языком.

GP-FORTH (DOS 16)
SMAL32 (DOS DPMI)
SP-FORTH (Win32)
Dragon Forth (PalmOS)
Quartus Forth (PalmOS)

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

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

Форт отличается тем, что вы определяя новые форт-слова (см. далее) расширяете
сам язык. Сразу, как только вы определили новое слово, вы можете его
выполнить. Это сместе с открытостью компилятора Форта для пользователя
позволяет вам вмешиваться непосредственно в работу компилятора или даже
запустить для части кода ваш собственный вариант компилятора или парсера (код,
преобразующий текст программы в форму, понятную компилятору).

Итак, настало время практически поработать с Фортом.
Введите

55 111 +

При вводе команд в конце строки нужно нажимать клавишу [Enter] или ее аналог.

Если на экране вы увидете ok, то команда была успешно принята и выполнена:

> 55 111 +
ok

Вы ввели в стек данных (см. далее) числа 55 и 111, а потом сложили их, но не
увидели результат, так как не дали команду вывести его.

Слово . (произносится как "точка") просит компьютер выдать число на экран. Вы
увидите

166 ok

т.е. сумму чисел 55 и 11. Теперь введите

5 6 *

и получится:

30 ok

Слово * -- это операция умножения. А теперь попробуйте

55 111 + 2 * . .

На экране должно получиться

332 Ok

Форт сначала произвел сложение, затем было введено число 2, которое было
перемножено с суммой, и был напечатан результат. Теперь введите

60 5 / .

вы увидите

12 ok

Аналогично

60 5 - .

выдаст

55 Ok

Попробуйте теперь ввести такую последовательность

5 60 - .

вы получите

-55 ok

Очевидно, что порядок, в котором вводятся числа, небезразличен. Попробуйте
ввести

5 60 / .

вы получите

0 ok

Минимальная версия Форта работает только с целыми числами, а 5/60 --
периодическая дробь 0.08(3), и ее значение округляется до 0. Многие
реализации Форта могут работать с обычными дробями и с числами с плавающей
запятой.

СТЕК

При работе с Фортом вы будете очень активно работать со стеком. Явное
использование стека и наличие специальных команд для его изменения -- одно из
существенных отличий языка Форт от других языков.

Стек -- структура данных, которая может хранить несколько объектов (целых
чисел, указателей на объеты других типов, в некоторых форт-системах плавающие
числа, упакованные в целые). Стек имеет две основных операции: push (помещение
объекта на вершину стека) и pop (взятие объекта с вершины).

Стек можно представить как сложенную стопкой колоду карт.
Когда мы вводим число, оно кладется на стек (push), как будто в колоду
добавляется карта. Когда выполняется слово . (точка, вывод числа), число
берется со стека (карта снимается с колоды).

Когда вы вводите:

55 111 +

числа 55 и 111 кладутся в стек, а слово + берет их из стека, складывает и
полученную сумму снова кладет в стек:

     =============
     =============
55
     =============
     push 55
     =============
111
     =============
     push 111
     55
     =============
+
     =============
     pop 111
     pop 55
     =============
(выполнение сложения)
     =============
     push 166
     =============

Для краткой записи состояния стека в дальнейшем будем использовать следующую
нотацию (условную запись):

( x1 x2 x3 -- y4 y5 )

Левая и правая скобки в Форте задают соответственно начало и конец комментария
-- если вы введете такой текст в форт-коде, он будет проигнорирован. Слева
указывается состояние стека до операции, справа -- после. Число на вершине
стека -- крайнее справа, на дне -- слева. Можно использовать более короткую
запись

( n1 n2 n3 )

которая обозначает текущее состояние стека.
Например, в описании слова + указываеся стековая нотация:

+ ( n1 n2 -- n1+n2 ) \ слово берет со стека n2, потом n1 и кладет их сумму

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

2 55 111 + * .

тогда вы увидите

332 ok

Форт берет из стека два верхних числа 55 и 111, складывает их, кладет сумму
назад в стек, поэтому в нем находятся

2 166

Оператор * затем умножает число 2 на 166, что дает 332, и кладет в стек
результат, который после этого выводится.
Использование обратной польской нотации в выражении

2 55 111 + *

эквивалентно

2 * (55 + 111)

в обычной алгебраической нотации. Если вы набрали на клавиатуре

55 111 2 + *

то это эквивалентно вводу

55 * (111 + 2)

что, конечно же, отличается от предыдущего примера.

Тот же пример с использованием стековой нотации:

     ( )
2    ( -- 2 )
55   ( 2 -- 2 55 )
111  ( 2 55 111 )
+    ( 2 166 )
*    ( 332 )
 .    ( 332 -- )
     ( )

Если вы наберете этот текст в файл и подсунете его форт-системам, которые
умеют читать форт-программы из текстовых файлов, то они напечатают число 332
и
завершат свою работу или перейдут в режим командной строки:

C:\> notepad z.txt
C:\> spf4 z.txt
SP-FORTH - ANS FORTH 94 for Win95/98/ME/NT/2000/XP
Open source project at http://spf.sf.net
Russian FIG at http://www.forth.org.ru ; Started by A.Cherezov
Version 4.00 Build 011 at 18.Mar.2003

332 _

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

ОПРЕДЕЛЕНИЕ НОВЫХ СЛОВ

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

: TIMES2 * . ;

и вы увидите только ok, т.е. будто бы ничего не произошло. Но теперь, если вы
введете

5 TIMES2

то увидите

10 ok

Вы только что определили (описали) слово TIMES2 на языке Форт, которое
представляет собой крошечную программу: ее действие состоит в том, чтобы
поместить в стек число 2, умножить его на то значение, которое было в стеке
раньше, и затем вывести результат.

Слово : (двоеточие) дало Форту указание начать определение и принять слово
TIMES2 (элементы форт-кода разделяются одним или несколькими пробелами) в
качестве имени нового слова Форта. Слова * и . -- ранее существовавшие слова
Форта, а 2 -- число. В конце ; (точка с запятой) указывает на то, что
определение закончено.

На этом примере вы видите что слова Форта можно использовать
1. как команды, которые должны быть исполнены сразу после их ввода
2. или как указания, какие слова нужно выполнить при работе TIMES2.

Ввод

5 TIMES2

приводит к такому же результату, как и ввод

5 2 *

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

Программа на Форте пишется путем составления описаний (определений) новых слов
через ранее определенные слова, пока не будет определено слово, которое нужно
ввести, чтобы исполнить программу. Большинство новых слов языка создается в
виде так называемых определений через двоеточие, потому что их определение
начинается с : и заканчивается ; (точкой с запятой).

Нужно отметить одно уникальное свойство Форта: когда вы пишете на нем, вы на
самом деле не пишете программу -- вы расширяете язык, добавляя в него новые
слова. Если ваша форт-система умеет записывать свое состояние, вы можете
взять базовую форт-систему forth.exe, добавить нужные вам наборы слов, и
сохранить форт-систему в файл myforth.exe -- при этом вы получите вашу
собственную версию Форта, заточенную под ваши нужды. Обычные компиляторы
других языков так не умеют -- при компиляции программы они каждый раз должны
загружать библиотеки, и при этом вы никак не можете вмешаться в работу самого
компилятора.

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

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

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

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

Когда определяется новое слово, например TIMES2, то говорят, что оно
компилируется (помещается, заносится) в словарь Форта.
Словарь -- внутренняя база данных форт-системы, в которой хранятся имя
слова, и последовательность ранее определенных слов, которые должны быть
выполнены при работе слова TIMES2.

Когда какое-либо слово выполняет свои действия, как, например, когда вы
вводите

5 TIMES2

слово исполняется.
Компиляция и исполнение -- это две основные операции, которые
выполняет Форт.

Если вы знакомы с другими языками программирования, то знаете, что они
компилируют или исполняют всю программу целиком, а не такие мелкие кусочки,
как описания слов. Одной из причин того, что Форт так легко взаимодействует с
пользователем, является как раз то, что программа на нем пишется (и
компилируется ) в виде набора небольших фрагментов, каждый из которых может
быть опробован (и исполнен) немедленно. Именно поэтому Форт так легко изучать
экспериментально. Хотя TIMES2 в буквальном смысле представляет собой настоящую
программу, она совсем проста.

Давайте сделаем немного более сложную программу.

: SQUARE DUP * ;

Слово DUP делает копию (дубликат) числа, находящегося на вершине стека.
Предположим, что мы ввели

6 SQUARE .

результатом этого является

36 ok

Слово SQUARE делает копию числа 6 в стеке, оставляя ( 6 6 ), а затем
перемножает эти два одинаковых числа, получая 36. Очевидно, слово . (точка)
выводит результат. Теперь мы можем определить

: CUBE DUP SQUARE * :

для вычисления куба числа. Если вы знакомы с другими языками программирования,
то заметите, что наши слова похожи на подпрограммы и, возможно, запротестуете
против написания таких коротких подпрограмм. Например, вы бы предпочли
определить слово CUBE иначе:

: CUBE DUP DUP   :

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

: SQUARE  ( n1 -- n2 ) DUP * ;          \ квадрат числа
: CUBE    ( n1 -- n2 ) DUP SQUARE * ;   \ куб числа

Мы добавили комментарии, чтобы программа стала более понятной. Любые слова в
Форте, заключенные в круглые скобки (с обязательным пробелом после открывающей
скобки), игнорируются, в них заключаются комментарии для программиста.
Другой вариант комментария -- слово \ (backslash, не спутайте со словом / ).
Любой текст после слова \ и до конца строки будет проигнорирован
форт-системой.

В соответствии с принятым для Форта правилом в комментарий помещается
информация о состоянии стека до и после выполнения слова в виде
( ... -- ... ). Например, комментарий о стеке для * выглядит так:
( n1 n2 -- n3 ). Комментарий о стеке необходим для всех слов, кроме самых
коротких и простых. Без него очень легко забыть, как работает программа.

На этом на сегодня можно закончить:

BYE

УПРАЖНЕНИЯ см. [orange].

Хотел предложить применить Форт практически в ваших текущих задачах, но
это невозможно до тех пор, пока вы не освоите язык хотя бы в минимальном
объеме (структуры управления, ввод и вывод данных, работа со стеком и с
памятью).

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

НОВЫЕ СЛОВА

Входной поток вводимый код программы и команды, устройством ввода может
быть клавиатура (консоль), любые носители данных, сетевые соединйния и т.п.

Интерпретатор часть форт-системы, вводящая текст на Форте пословно
и выполняющая его по словам

Компилятор часть форт-системы, генерирующая машинный код или
код особых видов (например список адресов вызываемых слов), добавляя
новые слова внутрь себя

Парсер часть форт-системы, которая анализирует входной поток
и передает выделенные из него части текста интерпретатору
или компилятору

Семантика значение форт-слова, набор действий, которое оно выполняет

Синтаксис внешний вид, строение языка управления, программирования или
определения данных

Хост-ОС операционная система более низкого уровня, поверх которой
работает форт-система

================
http://akps.ssau.ru
forth@km.ru
FidoNet SU.FORTH 2:5057/18.29
tel.: +7 8462 28 9910 (work), 15 4313 (home)

Subscribe.Ru
Поддержка подписчиков
Другие рассылки этой тематики
Другие рассылки этого автора
Подписан адрес:
Код этой рассылки: comp.soft.prog.forth
Отписаться
Вспомнить пароль

В избранное