Редакторы, компиляторы, базы данных, игры - это и многое другое написано на Форте - удивительном языке программирования, совместившем в себе компактность Ассемблера и структурность Паскаля.
В.В. Маслов
ФОРТ для БК 0010
ВВЕДЕНИЕ
Форт был создан в начале 70-х годов американцем Чарльзом Муром и затем получил огромное распространение. По популярности Форт поднялся на 3-е место после Бейсика и Паскаля. Начали издаваться различные журналы, вышло много интересных книг, и в 1983 году был разработан стандарт Форт-83.
В нашей стране также появились отечественные разработки Форта и ему подобных языков. Но массовой популярности они не получили. Вероятнее всего, сказался дефицит литературы и отсутствие хорошей документации. Поэтому, разрабатывая ещё одну версию Форта, автор уделил ей особое внимание.
Для массового читателя у нас вышли всего две книги по Форту.
Первая: Баранов С.Н., Ноздрунов Н.Р. Язык Форт и его реализации. - Л.: Машиностроение, 1988. - 155 с.
Вторая: Броуди Л. Начальный курс программирования на языке Форт. - М: Финансы и статистика, 1990. - 352 с.
Первая книга была довольно интересной и столько же непонятной из-за различных неточностей и опечаток. А вот вторую можно посоветовать прочитать. Надеюсь, у Форта появится много новых поклонников, для которых, собственно, и сделана предлагаемая разработка.
Единственное принципиальное отличие от Форта - это экранный редактор текста вместо командного. Добавлены команды для сохранения и чтения текстов с магнитофона, а также команда CSAVE, которая позволит вам делать свои программы, независимыми от Форта. Ну а теперь перейдём к основам.
СИНТАКСИС
Синтаксис языка простой. Вся программа состоит из команд или слов, что одно и то же; просто в Форте принято говорить слова, а не команды.
Слова разделяются пробелами и сами состоят из произвольных символов. Причём большие и малые буквы считаются разными. Если вам не нравятся английские слова, можете переделать их на русские. Как это сделать, будет описано ниже.
Кстати, одно из достоинств Форта в том, что вы можете определять слова, которые сами могут создавать другие слова, и так до бесконечности. Если вы любите оригинальные решения, то Форт - это то, что вам нужно.
ФОРТ СИСТЕМА
Вся работа на Форте - это работа со стеком. Можно сказать, что в Форте 3 стека. Самый главный - это стек данных. Когда вы вводите число, ну, например, 13, и нажимаете клавишу <Ввод> (этой клавишей всегда заканчивается ввод данных), то оно заносится в стек данных.
Если в одной строке набрать несколько чисел, не забыв разделить их пробелами, то все они последовательно, одно за другим, будут помещены в стек данных и, естественно, извлекаться из стека будут в обратном порядке.
Это постоянно вызывает споры о достоинствах и недостатках Форта. Многим кажется, что это переворачивание ставит всё вверх ногами.
Все данные для слов передаются через стек данных, и поэтому программист должен постоянно представлять, что у него происходит в стеке, и следить за его содержимым.
В Форте есть одно правило, из-за которого поначалу все делают ошибки, разрушающие систему. «Если слово использует значение в стеке или просто проверяет его, то это значение удаляется из стека».
Внимательно ещё раз прочитайте. Все ваши ошибки будут следствием игнорирования этого правила.
Как и во всех языках, в Форте есть комментарий; причём здесь он приобретает особую важность.
Комментарий начинается словом «(». Внимание! Именно словом, а это значит, что оно должно отделяться пробелами; дальше идёт произвольный текст и заканчивается символом «)», т.е. пробел перед второй скобкой не обязателен.
Как правило, комментарий ставят в начале программы и в начале определения новых слов. В Форте существует условное обозначение - стековая нотация, которая показывает в комментарии состояние стека данных до и после выполнения слова.
Вот примеры стековой нотации:
( 10 20 ->) - это комментарий, в котором показано, что до выполнения некоторого слова в стеке данных находились два числа 10 и 20, а после исполнения стек пуст.
Символ «->» разделяет содержимое стека данных до и после исполнения слова. Внимание! 20 будет первым извлекаемым числом, а 10 - вторым.
Ещё пример:
( -> 10 20) - здесь до исполнения слова стек пустой, а после исполнения в нем будут два числа: 10 и 20, и опять 20 - первое извлекаемое число.
Ещё раз покажем на практическом примере. Допустим, что вы уже приобрели Форт, а как это сделать, вы узнаете в конце этой статьи, и на экране у вас появилось слово «ok». Это значит «всё в порядке, можете работать».
ok |
10 |
( вы ввели число десять и нажали <Ввод>) |
ok |
20 |
( теперь двадцать) |
ok |
. |
( слово «точка» снимает число со стека данных и выводит его на экран) |
20 |
|
( первым оказалось число 20) |
ok |
. |
( ещё раз) |
10 |
|
( второе число) |
ok |
|
|
Можно всё сделать гораздо проще:
ok 10 20. . 2010 ok
Обратите внимание на то, что точки разделяются пробелами, потому что для Форта «.» и «..» - совершенно разные слова. Не удивляйтесь, что между двумя числами нет пробела, - вы должны об этом позаботиться сами.
ОСНОВНЫЕ СЛОВА ФОРТА
Теперь пришло время перейти к описанию слов или команд Форта. Для наглядности числа в стеке будем обозначать буквами:
n1,n2... |
- произвольные числа обычной точности |
d1,d2... |
- произвольные числа двойной точности |
? |
- число, результат логической операции или данное для логической операции 0 - нет, -1 -да |
С |
- число, обозначающее символ |
VLIST( ->) |
- напоминаем, что в скобках пишется комментарий, т.е. произвольный пояснительный текст, и в нашем случае он показывает, что стек данных не используется словом VLIST |
Это первое слово, которое вам нужно ввести, оно показывает содержимое словаря, в котором хранятся имена всех существующих слов. Все ваши новые слова вносятся в этот словарь, и вы можете их увидеть на экране. Они выводятся первыми.
|
BYE ( ->) |
- конец работы и выход в монитор |
|
SOUND ( n1 n2 ->) |
- включить звук. |
Здесь |
n2 |
- длина полуволны (высота звука) |
|
n1 |
- длительность, выраженная в количестве полуволн |
Пример:
ok 10000 100 SOUND ok
|
(->) |
- Ключевое слово в форте означает начало определения нового слова |
|
-"- |
- конец определения |
Пример:
ok: нотаДО 1000 100 SOUND;
Здесь после слова «:» указано имя нового слова «нота ДО», а далее - слова, которые вызываются при исполнении этого слова. Если теперь ввести
ok нотаДО
то вы услышите тот же самый звук, что и вначале. С помощью команды VLIST можете посмотреть новое слово в списке.
KEY ( -> n) - чтение кода нажатой клавиши.
Пример:
ok KEY. ( точка нужна, чтобы увидеть код клавиши) 48 ( если вы нажали клавишу 0).
Ещё пример простой программы, которая печатает коды нажатых клавиш до- клавиши <Ввод>:
ok: К BEGIN KEY DUP. CR 10 = UNTIL ;
Здесь К - имя нового слова. Введите его, и ваша программа заработает.
EMIT ( n ->) - слово с обратным действием - выводит символ с кодом n на экран.
Пример
ok 48 EMIT 0 ok
С помощью слов KEY и EMT вы можете просмотреть все клавиши и символы. Пример:
ok 155 EMIT ( переход к буквам двойной высоты и обратно).
OCTAL (->) |
- переход к восьмеричным числам. |
HEX |
- переход к шестнадцатеричным. |
DECIMAL |
- переход к десятичным. |
Пример:
ok 155 |
( ввели число в десятичной системе) |
ok OCTAL |
( перешли в восьмеричную) |
ok. |
( прочитаем) |
000233 ok |
( 233 - это 155 в восьмеричной системе исчисления). |
FORGET имя - забыть слово с данным именем в словаре. Иначе говоря, освободить память. Внимание! Если вы удаляете не последнее слово в словаре, то все слова последнего также удаляются!
Пример:
ok VLIST ( просмотреть словарь)
Если вы захотите остановить экран, то нажмите любую клавишу. Для продолжения просмотра повторите нажатие.
ok FORGET нотаДО ( Удалить слово «нотаДО») ok VLIST ( убедитесь, слова нотаДО нет в списке)
FORT_SAVE ( ->) - сохранить Форт с введёнными словами на магнитофоне. С помощью этой команды вы можете сделать копию. Но не старайтесь приобретать копии, так как тем, кто легально купит Форт, в дальнейшем будет скидка в цене на 25%. А так как цена со временем будет расти, то вы будете иметь преимущество.
CSAVE ( ->) - сохранить Форт и сделать автозапуск последнему определённому слову.
Этой командой вы фактически создаёте собственную программу, которая запустится перед Фортом.
EMT (n1 n2 n3 n4 -> n5 n6 n7) - команда для любителей Ассемблера.
Где n1 = R0, n2 = R1, n3 = R2, n4 - номер EMT прерывания, соответственно n5, n6, n7 - это R0, R1, R2 - после прерывания.
Этим словом можно рисовать точки, линии и т.д. - всё, что позволяют делать EMT прерывания на БК.
. " текст" - вывод текста на экран. Здесь будьте внимательны! Текст отделяется пробелом от первой кавычки.
Пример:
ok." У-лю-лю" У-лю-лю ok
. ( n->) - самое распространённое слово «точка».
Печатает на экране число из стека данных и удаляет его.
Пример:
ok 12345 . 12345 ok
СТЕКОВЫЕ КОМАНДЫ
Команды данной группы манипулируют стеком данных.
DROP |
(n -> ) |
- убрать число из стека |
DUP |
(n -> n n) |
- продублировать число в стеке |
SWAP |
(n1 n2 -> n2 n1) |
- поменять местами два числа |
OVER |
(n1 n2 -> n1 n2 n1) |
- сделать копию второго числа в стеке |
ROT |
(n1 n2 n3-> n2 n3 n1) |
- циклически сдвинуть три числа |
АРИФМЕТИЧЕСКИЕ КОМАНДЫ
+ |
( n1 n2 -> n3) |
- сложение n1 с n2 и результат n3 поместить в стек. |
- |
( n1 n2 -> n3) |
- вычитание, где n3 = n1 - n2. |
* |
( n1 n2 -> n3) |
- умножение, n3 = n1 * n2. |
/ |
( n1 n2 -> n3) |
- деление, n3 = n1/n2. |
MOD |
( n1 n2 -> n3) |
- n3 остаток от деления n1 на n2. |
/ MOD |
( n1 n2 -> n3 n4) |
- n3 остаток, n4 - частное. |
Примеры:
ok 1 2 +. |
( сложение) |
3 ok |
( результат) |
ok 1 2 - . |
( вычитание) |
-1 ok |
( результат) |
ok132/MOD. |
( деление с остатком) |
6 ok. |
( частное) |
) 1 ok |
( остаток) |
ЛОГИЧЕСКИЕ КОМАНДЫ
Результатом логических команд могут быть только два числа: 0-ложь, - 1 - истина.
> |
( n1 n2 -> ?) |
n1 больше n2 |
< |
( n1 n2 -> ?) |
n1 меньше n2 |
>= |
( n1 n2 -> ?) |
n1 больше или равно n2 |
<= |
( n1 n2 -> ?) |
n1 меньше или равно n2 |
= |
( n1 n2 -> ? ) |
n1 равно n2 |
<> |
( n1 n2 -> ?) |
n1 не равно n2 |
0> |
( n1 ->?) |
n1 больше 0 |
0< |
( n1 ->?) |
n1 меньше 0 |
0= |
( n1 ->?) |
n1 равно 0 |
Примеры:
ok 1 2 > . |
( 1 больше 2 ?) |
0 ok |
( нет) |
ok 1 2 =. |
( 1 равно 2 ?) |
0 ok |
( нет) |
ok 1 2 < . |
( 1 меньше 2?) |
-1 ok |
( да) |
Результат логических команд в основном используется в циклах и переходах, т.е. в командах передачи управления.
КОМАНДЫ ЦИКЛОВ И ПЕРЕДАЧИ УПРАВЛЕНИЯ
В Форте есть два режима работы: режим исполнения и режим компиляции. Режим исполнения - это когда слова исполняются, а компиляции - это когда вы ввели : и определяете новое слово.
Некоторые слова работают только в каком-то одном режиме, а некоторые в обоих. Команды этой группы работают только в режиме компиляции, т.е. определения через двоеточие.
IF |
( ?->) |
- если ... |
ELSE |
( ->) |
- иначе ... |
THEN |
( ->) |
- тогда ... |
Если перед исполнением слова IF в стеке данных находится -1 (истина), то выполняются слова от IF до ELSE; если этого слова нет, до THEN. Если в стеке данных находится 0, т.е. «ложь», то выполняются слова от ELSE и далее, а если ELSE нет, то слова после THEN. Внимание! Если вы ввели слово IF, то обязательно должно быть слово THEN независимо от ELSE. И напоминаем, что проверяемое число всегда будет удаляться из стека данных.
Пример:
ok : проверить IF . « да » ELSE . « нет » THEN ; ok 1 2 > проверить нет ok ok 1 2 < проверить да ok
BEGIN ... UNTIL - повторять все слова между BEGIN и UNTIL, пока в стеке перед словом UNTIL не будет -1 (истина).
Пример:
ok: К BEGIN KEY DUP . 10= UNTIL;
Данный цикл повторяется, пока вы не нажмёте клавишу <Ввод>, код которой 10.
ВНИМАНИЕ! СЛОВО UNTIL ПРОВЕРЯЕТ ЗНАЧЕНИЕ В СТЕКЕ, А СЛЕДОВАТЕЛЬНО, УДАЛЯЕТ ЕГО.
DO ( n1 n2 ->) ... LOOP - эти два слова ограничивают циклически повторяемые слова. Перед DO в стеке данных должно быть два числа. Первое n1 - определяет конец цикла, а второе n2 - начальное значение счётчика цикла. После завершения каждого цикла счётчик автоматически увеличивается на 1. Внутри тела цикла, слово 1, оставляет на вершине стека данных значение счётчика цикла, которое вы можете использовать для своих целей.
Пример:
ok : цикл DO 1. CR LOOP ; ok 3 1 цикл 1 2 ok
Слово CR - переводит курсор на новую строку.
ЗАКЛЮЧЕНИЕ
Невозможно описать в одной статье все команды. Подробное описание вы можете приобрести на кассете вместе с Фортом.
Итак, что нужно сделать, чтобы приобрести Форт?
- Вам необходимо выслать 75 руб. по адресу: 248006 Калуга, ул. Московская, 237, Калужский инновационный коммерческий банк, МЧП «ИПД», л/с 468001.
- Вложить квитанцию в конверт и отправить её по адресу: 248010 Калуга-10 а/я 481«ИПД».