Язык программирования Форт

       

Учимся на практике


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

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

Если вы готовы, напечатайте на клавиатуре

55 111 +

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

Тогда на экране вы увидите "ok" (все в порядке). Что произошло ? Вы ввели числа 55 и 111 и сложили их, но не увидели результат, потому что не попросили напечатать его. Форт напечатал "ok", поскольку он справился с тем, что вы ввели. Сообщение "ok" -- это подсказка-приглашение, которая говорит вам о том, что Форт готов принимать с клавиатуры новую информацию. Теперь введите

.

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

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. Некоторые реализации Форта могут обрабатывать дроби и числа с плавающей запятой, и мы об этом еще узнаем в . А в данный момент вам необходимо еще проэкспериментировать с арифметическими действиями, потому что Форт лучше всего изучать на практике. Для выполнения арифметических действий вы пользовались стеком языка Форт.

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

55 111 +

числа 55 и 111 кладутся в стек, а операция + изымает их из стека, складывает и полученную сумму снова кладет в стек. Наши "карты" показаны на .


рис. 1.1

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



55 111 + * .

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

332 ok

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

2 166

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

2 55 111 + *

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

2 * (55 + 111)

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

55 111 2 + *

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

55 * (111 + 2)

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


рис. 1.2

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

: TIMES2 * . ;

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

5 TIMES2

то увидите

10 ok

Вы только что определили (описали) слово TIMES2 (умножить_на_2) на языке Форт, которое представляет собой крошечную программу: ее действие состоит в том, чтобы поместить в стек число 2, умножить его на то значение, которое было в стеке раньше, и затем напечатать результат. : (двоеточие) дало Форту указание начать определение и принять слово TIMES2 (каждая следующая порция ввода заканчивается пробелом) в качестве имени нового слова Форта. Три символа (2, * и.) -- ранее существовавшие слова Форта, которые рассказывают программе, что она должна делать, затем ; (точка с запятой) указывает на то, что определение закончено. (Обратите внимание, что в качестве слова в Форте может выступать один символ, как, например, в английском языке слова "I" (я) и "а" (артикль).)



Слова Форта можно использовать двояко: либо как команды, которые должны быть немедленно исполнены, примерами этого были наши арифметические упражнения, либо для описания новых слов. Заметим, что ввод

5 TIMES2

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

5 2 *

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

Почти все, что вы приказываете Форту сделать, обозначается словом или числом. Учтите, что между словами и числами должен быть по крайней мере один пробел. Операторы типа + , * , / и . -- это слова, и даже : и ; -- это тоже слова, которые указывают начало и конец описания слова. (Как вы уже заметили, если в тексте встречается Форт-слово, мы выделяем его полужирным шрифтом и знаки пунктуации отделяем от него пробелами.)

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

Программы на языке Форт фактически являются расширением самого языка за счет включения в него новых слов и операторов.

Когда слово, например 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 * ;

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

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


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