Глава 1.
ОСНОВЫ ФОРТА

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

ЖИВОЙ ЯЗЫК

Вообразите, что вы — управляющий офисом и только что взяли себе нового энергичного помощника. В первый день вы учите его оформлять вашу корреспонденцию по соответствующему формату (допустим, ваш помощник уже умеет печатать на машинке). В конце дня вы уже можете просто сказать ему: «Пожалуйста, отпечатайте это». На второй день вы показываете своему помощнику систему регистрации. Все утро у вас уходит на соответствующие разъяснения, но уже после обеда вам достаточно отдать короткое распоряжение: «Пожалуйста, зарегистрируйте это». К концу недели вы будете понимать друг друга с полуслова. Так, если вы скажете своему помощнику: «Пожалуйста, отправьте это письмо», он поймет, что письмо нужно напечатать, дать вам на подпись, сделать с него фотокопию и зарегистрировать ее, а оригинал отослать по почте. Подобные взаимоотношения позволят как вам, так и вашему помощнику выполнять свою работу более эффективно и доставят вам обоим больше удовольствия, чем любые другие.

Итак, для правильной организации труда и обеспечения эффективного взаимодействия сотрудников необходимо:

Форт дает вам возможность аналогичным образом организовать ваши собственные процедуры и передать их компьютеру таким же способом (разве что не говорить ему: «пожалуйста»). В качестве примера можно привести стиральную машину, управляемую микропроцессором с программой на Форте. Заключительной командой в нашем примере будет команда, которой мы присвоим имя СТИРАЛЬНАЯ-МАШИНА. Ниже дается определение команды СТИРАЛЬНАЯ-МАШИНА так, как оно выглядит на Форте:

: СТИРАЛЬНАЯ-МАШИНА СТИРАТЬ ВЫКРУЧИВАТЬ ПОЛОСКАТЬ ВЫКРУЧИВАТЬ ;

На языке Форт двоеточие означает начало нового определения. Первое слово после двоеточия, СТИРАЛЬНАЯ-МАШИНА, является именем новой процедуры. Остальные слова, СТИРАТЬ, ВЫКРУЧИВАТЬ, ПОЛОСКАТЬ, ВЫКРУЧИВАТЬ, составляют «определение» этой новой процедуры. Наконец, точкой с запятой отмечается конец определения.

Каждое слово, входящее в состав определения СТИРАЛЬНАЯ-МАШИНА в нашей программе, описывающей стиральную машину, уже специфицировано. В частности, посмотрим, как записывается определение команды ПОЛОСКАТЬ.

: ПОЛОСКАТЬ НАЛИТЬ-ВОДУ СТИРАТЬ ВЫЛИТЬ-ВОДУ ;

Как видите, определение ПОЛОСКАТЬ состоит из группы слов: НАЛИТЬ-ВОДУ, СТИРАТЬ и ВЫЛИТЬ-ВОДУ. Опять-таки каждое из этих слов уже где-то специфицировано в программе, описывающей стиральную машину. Определение команды НАЛИТЬ-ВОДУ может быть таким:

: НАЛИТЬ-ВОДУ КРАНЫ ОТКРЫТЬ ДО-НАПОЛНЕНИЯ КРАНЫ ЗАКРЫТЬ ;

В приведенном определении мы ссылаемся как на объекты (краны), так и на действия (открыть и закрыть). Слово ДО-НАПОЛНЕНИЯ введено для создания «Цикла задержки», чтобы контролировать включение индикатора уровня заполнения емкости стиральной машины водой.

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

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

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

В этой книге мы рассмотрим большинство часто используемых стандартных команд Форта.

ДИАЛОГ

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

Форт называется диалоговым языком, потому что его команды выполняются сразу, как только вы их вводите. В качестве примера (вы можете его выполнить самостоятельно) рассмотрим процесс объединения простых команд в более сложные. Мы будем использовать некоторые слова Форта для управления экраном дисплея или печатающим устройством. Но прежде познакомимся с механизмом «диалога» посредством клавиатуры терминала.

Займите место за своим терминалом (для некоторых он будет воображаемым). Возможно, кто-нибудь великодушно предоставит вам условия для занятий, в противном случае вам придется внимательно интерпретировать самому все команды, предназначенные вашему компьютеру. Нажмите клавишу RETURN. Компьютер ответит: ok («все в порядке»), что означает приглашение к работе. С помощью клавиши RETURN вы передаете компьютеру свой запрос. Ответ jak свидетельствует о том, что ваш запрос выполнен, причем без единой ошибки. Мы пока ни о чем не просили, поэтому компьютер послушно ничего не выполнил и выдал приглашение ok.

Теперь введите

15 SPACES

что означает 15 ПРОБЕЛОВ.

Для многих Форт-систем имеет значение, на каком регистре — верхнем или нижнем — вы набираете текст, поэтому, вводя SPACES, убедитесь в том, что набираете эту строку на верхнем регистре. Если во время набора была допущена ошибка, вы можете исправить ее, нажав клавишу backspace (возврат на одну позицию). Вернитесь к тому месту, где сделана ошибка, введите нужный символ и продолжайте набор. Набрав строку правильно, нажмите клавишу RETURN. (После нажатия клавиши RETURN исправлять ошибку уже поздно.)

В дальнейшем мы будем использовать обозначение <return> в тех местах, где вы должны нажимать клавишу RETURN, и подчеркивать ответы компьютера, чтобы отличать их от других символов (даже если сам компьютер и не подчеркивает свои ответы ).

Что произойдет в такой ситуации:

15 SPACES<return>               ok

Как только вы нажали клавишу ввода, компьютер выведет 15 пробелов и затем, выполнив ваш запрос, выдает: ok (после 15-го пробела).

Наберите на клавиатуре следующее:

42 EMIT<return> *ok

Фраза «42 EMIT» приказывает компьютеру вывести символ * (мы обсудим эту команду позднее). Компьютер выводит требуемый символ, а затем ok

На одной строке мы можем помещать несколько команд. Например:

15 SPACES 42 EMIT 42 EMIT<return>               **ok

На этот раз компьютер выводит 15 пробелов и две звездочки. Отметим, что при вводе слов и/или чисел их можно разделять любым количеством пробелов (как вам удобно), но между ними должен быть хотя бы один пробел, чтобы компьютер мог различать слова и/или числа.

Вместо того чтобы всякий раз вводить фразу

42 EMIT

давайте определим ее как слово STAR (ЗВЕЗДОЧКА). Итак, введите:

: STAR 42 EMIT ;<return> ok

Здесь STAR — имя, а 42 EMIT — определение. Заметьте, что мы отделили двоеточие и точку с запятой от соседних с ними слов одним пробелом. Чтобы определения Форта легче воспринимались, условимся отделять имя определения от собственно определения тремя пробелами.

После того как вы наберете на клавиатуре приведенное выше определение и нажмете клавишу RETURN, компьютер ответит вам: ok, т. е. он распознал ваше определение и запомнил его. Введите далее:

STAR<return> *ok

Как видите, компьютер выполнил ваш приказ и выдал звездочку. Определенное вами слово STAR ничем не отличается от определенного ранее EMIT. Поэтому чтобы вам легче было ориентироваться, ранее определенные слова мы будем выделять полужирным шрифтом.

Другим определенным системой словом является CR, которое обеспечивает возврат каретки и перевод строки на вашем терминале. Обязательно почувствуйте разницу в использовании клавиши RETURN и словом Форта CR. В качестве примера наберите на клавиатуре

CR<return> 
ok

Компьютер осуществил возврат каретки, а затем вывел ok (на следующей строке). Введите такой текст:

CR STAR CR STAR CR STAR<return>
*
*ok

Поместим CR в определение слова MARGIN (ПОЛЕ ПРОБЕЛОВ):

: MARGIN CR 30 SPACES ;<return> ok

Теперь вы можете ввести следующее:

MARGIN STAR MARGIN STAR MARGIN STAR<return>

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

Комбинация слов MARGIN STAR пригодится нам в дальнейшем, поэтому введем определение BLIP  (ТОЧКА):

: BLIP MARGIN STAR ;<return> ok

Нам также предстоит выводить горизонтальные последовательности звездочек. Для этой цели введем следующее определение (его назначение мы объясним позднее):

: STARS 0 DO STAR LOOP ;<return> ok

Итак, мы можем ввести:

5 STARS<return> *****ok

или

35 STARS<return> ***********************************ok

или любое представимое число звездочек! Однако нельзя задавать сочетание "0 STARS", в особенности для систем Форта-83. Подробнее об этом речь пойдет в гл. 6.

Нам необходимо слово, которое выполняет команду MARGIN, а затем выводит пять звездочек. Определим слово BAR (ПО-ЛОСКА):

: BAR MAR6IN 5 STARS ;<return> ok

после чего можно ввести строку:

3AR BLIP BAR BLIP BLIP CR

В результате вы получите букву F, составленную из звездочек:

*****
*
*****
*
*

В заключение определим слово для этой новой процедуры. Назовем его F:

: F BAR BLIP BAR BLIP BLIP CR ;<return> ok

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

0 ( Большая буква F )
1 : STAR 42 EMIT ;
2 : STARS 0 DO STAR LOOP ;
3 : MARGIN CR 30 SPACES;
4 : BLIP MARGIN STAR ;
5 : BAR MARGIN 5 STARS;
6 : F BAR BLIP BAR BLIP BLIP CR ;
7
8

СЛОВАРЬ

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

К примеру, если вы вводите строку

: STAR 42 ЕМIТ ;<return>

компилятор компилирует новое определение в словарь. Сам компилятор не выдает на печать звездочку.

(Не хотите ли вы уже сейчас посмотреть список слов, находящихся в словаре? В большинстве систем для этого нужно ввести слово WORDS, и тогда вы получите на экране имена слов вместе с их «адресами» (ссылками на участки памяти). Слова перечислятся в том порядке, в котором их определили — последнее определенное слово будет верхним. В некоторых, более старых системах для таких целей существует слово VLIST.)

Теперь слово STAR находится в словаре. А как выполняется слово, находящееся в словаре? Наберите непосредственно (не внутри определения) следующую строку:

STAR 30 SPACES<return>

Эта строка активирует слово с именем INTERPRET, означающее «текстовый интерпретатор».

Текстовый интерпретатор просматривает входной поток символов в поисках строки символов, внутри которой нет пробелов. Если он находит такую строку, то он ищет ее в словаре.

Найдя нужное слово в словаре, интерпретатор передает его определение слову с именем EXECUTE1, которое выполняет это определение (в нашем случае оно инициирует печать звездочки). Интерпретатор вновь выдает вам ok.

1 Слово EXECUTE (ВЫПОЛНИТЬ) в одном из вариантов переводится как «казнить». Отсюда ассоциации с палачом. — Примеч. пер.

Если интерпретатор не находит такой строки в словаре, он обращается к обработчику чисел (NUMBER). Последний проверяет, не является ли переданная ему информация числом, и если это действительно так, помещает его в участок памяти, отведенный для чисел.

Что произойдет, если вы попытаетесь выполнить слово, которого нет в словаре? Введите следующую фразу:

XLERB<return> XLERB ?

Не найдя слово XLERB в словаре, текстовый интерпретатор попытается передать его NUMBER, который не признает его, после чего интерпретатор вернет вам это слово со знаком вопроса.

Итак, когда вы набираете на терминале предварительно определенное слово, оно интерпретируется и затем выполняется.

Упоминали ли мы о том, что символ «:» является словом? Так, если вы вводите этот символ:

: STAR 42 EMIT ;<return>

происходит следующее:

   

текстовый интерпретатор находит двоеточие во входном потоке и передает его EXECUTE.

EXECUTE предлагает начать компиляцию. Компилятор переводит определение в словарную форму и записывает его в словарь.

Дойдя до точки с запятой, компилятор останавливается и снова начинает выполняться текстовый интерпретатор, который выдает на экран ok.

КАК ПРАВИЛЬНО «ОБЪЯСНЯТЬСЯ» НА ФОРТЕ?

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

Теперь разберем слово, имя которого состоит из двух знаков пунктуации. Это слово ." и произносится оно как «точка-кавычка». Вы можете применять его внутри определения для вывода «строки» текста на своем терминале. Например2:

1 Для философов, конечно, компьютер не «думает», но, к сожалению, очень трудно подобрать слово, точно отражающее его действия. Поэтому условимся считать, что компьютер «думает».

2 В Форте определен базовый набор слов. В книге такие слова лаются на языке оригинала. В большинстве приводимых здесь примеров слова, определяемые пользователем, написаны по-русски. Версии Форта, распространенные в СССР, позволяют это делать. — Примеч. ред.

: ВСТРЕЧА ." Привет, я говорю на форте " ;<return> ok

Мы только что определили слово с именем ВСТРЕЧА. Его определение состоит только из одного слова, .", за которым следует текст, подлежащий выводу. Знак кавычки в конце текста не будет выведен; он отмечает конец текста и называется ограничителем. Специфицируя слово ВСТРЕЧА, не забудьте в конце поставить символ ;— знак конца определения.

Давайте выполним слово ВСТРЕЧА:

BCTPEЧA<return> Привет, я говорю на форте ок

ПЕРИОД ИСПОЛНЕНИЯ И ПЕРИОД КОМПИЛЯЦИИ

При изучении Форта вам встретятся два термина: период исполнения и период компиляции. Смысл их достаточно прост. Если вы компилируете определение некоторого слова, то речь идет о периоде его компиляции, а если вы выполняете слово — о периоде исполнения.

Например, в только что приведенном определении ВСТРЕЧА компьютер во время компиляции выдал вам просто «ok», а во время выполнения указанного определения вывел на экран следующее: «Привет, я говорю на Форте». В случае предварительно определенных слов, таких, как CR, период компиляции приходится на время создания Форт-системы, а период выполнения наступает всякий раз, когда вы обращаетесь к этим словам (или к словам, которые в свою очередь обращаются к ним).

Посмотрим на эту ситуацию с другой стороны. Когда мы компилируем слово ВСТРЕЧА, компилятор Форта (или набор так называемых «компилирующих слов», осуществляющих компиляцию) на самом деле исполняется. Поэтому для слова ВСТРЕЧА это период компиляции, а для компилирующих слов Форта — период исполнения.

Термины период компиляции и период исполнения будут вам особенно полезны при рассмотрении более сложных слов.

СТЕК — РАБОЧАЯ ОБЛАСТЬ ОПЕРАТИВНОЙ ПАМЯТИ ДЛЯ ВЫПОЛНЕНИЯ АРИФМЕТИЧЕСКИХ ДЕЙСТВИЙ

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

подробно описать весь вычислительный процесс, но поверьте, что чуда здесь нет никакого.

В принципе компьютеры при выполнении операций разбивают их на очень мелкие этапы и реализует предельно элементарные действия. Для нас с вами операция сложения «3 + 4» не составляет труда и вы, не задумываясь, называете результат: «7>, для компьютера же это очень длинная цепочка действий. Представьте себе, что у вас есть карманный калькулятор и вы хотите выполнить на нем такое сложение. Чтобы получить результат, требуется нажать клавиши в указанном ниже порядке.

 

Когда вы поочередно нажимаете клавиши, как показано на рисунке, происходит следующее:  

 

 

Многие калькуляторы и компьютеры решают арифметические задачи аналогичным способом. Вы можете этого и не знать, но компьютер действительно запоминает числа в различных участках своей оперативной памяти и затем выполняет над ними необходимые операции. Центральный участок памяти, где временно запоминаются числа, над которыми затем будет выполнена операция, называется стеком. Числа «вталкиваются в стек» и впоследствии операции выполняются именно над данными числами1. Поясним это на примере. Введите со своего терминала строку

3 4 + .<return> 7 ok

 

Вспомните, что при вводе числа интерпретатор текста переправляет его обработчику чисел NUMBER, который помещает это число в некоторый участок памяти. Таким участком является стек.

Короче говоря, когда вы вводите число 3 с терминала, вы «вталкиваете» его в стек.

 

Далее в вершину стека помещается число 4, «проталкивая» тройку внутрь.

1 Для пользователей карманных калькуляторов. В обычных калькуляторах, как правило, применяется и стек, и постфиксная запись арифметики.

 

Следующее слово из входного потока должно быть найдено в словаре. Знак + был предварительно определен как последовательность таких действий: «взять два верхних числа из стека, просуммировать их и поместить результат обратно в 

Слово . также находится в словаре. Оно входит Форт-системы и определено таким образом: «взять и вывести его на терминал».

ПОСТФИКСНАЯ ЗАПИСЬ

«Но, позвольте, — скажете вы, — почему на Форте нужно писать

3 4 +

а не

3 + 4

как это принято?» Дело в том, что в Форте применяется постфиксная запись (называемая так потому, что знак операции располагается после чисел) вместо инфиксной (где знак операции располагается между числами), поэтому все слова, которым «требуются» числа, могут их взять из стека. Например, слово + берет из стека два числа и складывает их, слово . берет одно число и выводит его, SPACES берет одно число и выводит соответствующее ему количество пробелов, EMIT берет число, которое изображает какой-либо символ, и выводит этот символ. Даже слово STARS, которое мы определили сами, берет число из стека и выводит заданное этим числом количество звездочек.

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

Ранее отмечалось, что Форт позволяет использовать слово любым из двух способов: либо называя его, либо применяя в определении другого слова, тем самым именуя то другое слово. Постфиксная запись является частью механизма, который предоставляет вам такую возможность. Например, предположим, что вам требуется слово, которое всегда прибавляет число 4 к любому числу, находящемуся в стеке. Назовем это слово

ПЛЮС-ЧЕТЫРЕ

что означает «больше на четыре», и определим его следующим образом:

: ПЛЮС-ЧЕТЫРЕ 4 + ;<return>

Выполним проверки

3 ПЛЮС-ЧЕТЫРЕ .<return> 7 ok

и еще раз

-10 ПЛЮС-ЧЕТЫРЕ .<return> -6 ok

Число 4, находящееся внутри определения, помещается в стек таким же образом, как если бы оно находилось вне определения. Затем слово + складывает два числа, хранящихся в стеке. Так как операция сложения всегда выполняется над содержимым стека, тот факт, что число 4 пришло из определения, а 3 нет, не имеет значения.

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

РАБОТА СО СТЕКОМ

Мы уже продемонстрировали некоторые методы работы со стеком и постфиксную запись. Теперь рассмотрим этот вопрос более детально.

Стек Форта функционирует по принципу «последним занесен первым выбран» (LIFO). Вы это видели в приведенном выше при мере. Число 3 было занесено в стек первым, а затем в него занесли число 4, «протолкнув» вглубь стека тройку. Позднее при выполнении операции сложения машина выбрала первым число 4, так как оно находилось в вершине стека.

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

2 4 6 8 . . . .<return> 8 6 4 2 ok

 

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

Будьте внимательны, чтобы не допустить ошибки. Наберите на клавиатуре

10 20 30 . . . .

(четыре точки) и нажмите клавишу RETURN. В результате вы получите :

10 20 30 . . . .<return> З0 20 10 . Стек пуст

Каждая точка удаляет из стека одно значение. Четвертая точка «обнаружит», что в стеке нечего взять для вывода на дисплей, о чем вы и получите сообщение.

 

Такая ошибка называется потерей элемента стека. (Заметьте, что потеря элемента стека вовсе не «ok».) В противном случае, когда вы исчерпали емкость стека, возникает ситуация его переполнения. Однако стек настолько глубок, что такое событие практически нереально, если только вы не совершите что-то из ряда вон выходящее.

Как правило, вас не должно интересовать содержимое всего стека — вам нужны только те числа, с которыми вы работаете в данный момент. Остальные же значения, если таковые были занесены в стек ранее, должны в сохранности находиться в стеке до того момента, пока они не понадобятся. Если вы, к примеру, захотите нарисовать прямоугольник, применяя ту же технику, что и

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

при создании буквы F, то для начертания сторон можно написать слово

: СТОРОНЫ STAR 5 SPACES STAR 5 ;

которое при выполнении дает вам следующее: 

*     *

Предположим, вы хотите научиться рисовать прямоугольник любого размера. Тогда вы должны не заключать число 5 в определении, а передавать его слову СТОРОНЫ как аргумент. В этом случае ваше определение будет выглядеть так:

: СТОРОНЫ STAR SPACES STAR ;

Теперь нужно обращаться к слову СТОРОНЫ, скажем, таким образом:

5 СТОРОНЫ

При этом несмотря на то, что при первом употреблении слова STAR в стек заносится число 42, предназначенное для EMIT, заданное вами число 5 будет благополучно дожидаться в стеке выполнения своего слова SPACES.

СТЕКОВАЯ НОТАЦИЯ

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

Применительно к нашему простому примеру ПЛЮС-ЧЕТЫРЕ изложенное выше означает, что перед выполнением указанного слова в стеке должен находиться один аргумент, а после его вы-

' Для знатоков семантики. В математике слово аргумент ассоциируется с независимой переменной некоторой функции. Компьютерные лингвисты заимствовали этот термин для обозначения значений, передаваемых функциям или подпрограммам. Кроме того, для описания аналогичных объектов используется слово параметры.

полнения оставаться результат в виде одного значения. Если вы поместите внутри определения ПЛЮС-ЧЕТЫРЕ «точку» для вывода получаемого результата на дисплей, то изменится стековый эффект: данное слово не должно будет возвращать в стек значение, полученное в результате своего выполнения.

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

Комментарий — это некоторая информация, предназначенная только для человека: она ни выполняется, ни компилируется. В Форте слово ( , левая круглая скобка, символизирует начало комментария. Текстовому интерпретатору предписывается осуществлять пропуск последующего текста до тех пор, пока не встретится правая круглая скобка, означающая конец комментария. Поскольку ( является словом, вы обязаны отделять этот символ пробелом так же, как и в случае применения слова ."1

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

: НИЧЕГО ( это слово ничего не выполняет ) ;

Текст «это слово ничего не выполняет» является комментарием. Вернемся к стековой нотации. Основной формат комментария этого вида выглядит так:

( -- )

1 Для начинающих. Закрывающая круглая скобка не является словом. Это просто символ, который служит ограничителем для слова ( . (Вспомните, что для слова ." ограничителем является символ ")

Такой комментарий означает, что данное определение никакого эффекта на стек не оказывает. К словам подобного рода относится CR или специфицированное нами слово STAR. (Во время своего исполнения слово STAR помещает в стек число 42, но извлекает его из стека до завершения работы, так что стековых эффектов в рассматриваемом случае нет.) Принято отделять стековую нотацию от имени определения двумя пробелами:

: STAR ( -- ) 42 EMIT ;

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

Если некоторое слово должно выбрать из стека аргументы, то эти аргументы перечисляются слева от двойного дефиса. Например, стековая нотация для слова . («точка») выглядит следующим образом:

( n -- )

(Буква n заменяет число.) Если слово возвращает стеку аргументы, то они перечисляются справа от двойного дефиса. Стековая нотация для слова + имеет вид:

( n1 n2 — сумма )

Для обозначения аргументов вы можете использовать имена, сокращения или просто нумеровать их: nl, n2, nЗ и т. д., как было сделано в приведенном выше примере.

Когда вы указываете несколько аргументов справа или слева от дефиса, необходимо строго соблюдать порядок их размещения. Запомните следующее правило: крайний правый объект в стековой нотации является верхним элементом стека. 

Это легко запоминается, поскольку перечисление аргументов в стековой нотации совпадает с порядком их ввода. Если вы вводите в стек для некоторого слова числа 1 2 3, то стековый комментарий будет таков:

( 1 2 3 -- )

т е. 1 окажется на дне, а 3 - в вершине стека.

Так как вы, очевидно, уже разобрались в правилах записи, в дальнейшем будет опускаться <return>, за исключением тех случаев, где это необходимо для ясности. Ответы компьютера в книге всегда подчеркнуты, поэтому вам должно быть понятно, когда следует нажимать клавишу RETURN.

Ниже приводится список слов Форта, которые вам уже знакомы, вместе с их стековой нотацией (n замещается числом, с — символом)

: ххх уyу ; ( — )   Определение нового слова с именем ххх, 
                    состоящее из слова или слов ууу.
CR          ( — )   Возврат каретки и перевод строки.
SPACES      ( n — ) Вывод заданного числа пробелов.
SPACE       ( — )   Вывод одного пробела.
ЕMIТ        ( с — ) Вывод символа.
." ххх"     ( — )   Вывод строки символов ххх. Символ " является
                    признаком конца строки.
+ ( nl n2 — сумма ) Суммирование.
.           ( n — ) Вывод числа, за которым следует один пробел.
( xхх)      ( — )   Комментарий, который текстовым интерпретатором не воспринимается. Символ ) является ограничителем.

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

ОСНОВНЫЕ ТЕРМИНЫ

Выполнение. Применительно к слову —- это выполнение операций, заданных в скомпилированном определении данного слова.

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

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

Интерпретация. Чтение из входного потока при обращении к интерпретатору текста и поиск каждого встретившегося слова в словаре. В случае неудачи это слово трактуется как число.

Инфиксная запись. Метод записи: знак операции располагается между операндами, над которыми она выполняется, например 2 + 5.

Компиляция. Генерация по исходному тексту элемента словаря (внутренняя форма определения). Следует отличать от EXECUTE.

Переполнение стека. Аварийная ситуация, которая создается в том случае, когда вся область памяти, отведенная под стек, заполнена данными.

Постфиксная запись. Метод записи: знак операции следует за операндами, над которыми эта операция выполняется, например 2 5 + Также известен как обратная польская запись.

Потеря элемента стека. Аварийная ситуация, которая возникает в том случае, когда для выполнения какой-либо операции требуется элемент из стека, а стек пуст.

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

Словарь. В Форте это перечень слов и определений, включающий в себя как «системные» определения (созданные при генерации системы), так и «пользовательские» (которые создаете вы сами). Словарь размещается в памяти компьютера в компилируемой форме.

Слово. В Форте это имя определения.

Стек. Участок памяти,» в который данные помещаются и из которого они удаляются по принципу «последним пришел — первым обслужен» (LIFO).

LIFO. Принцип функционирования стека (последним пришел — первым обслужен). Так, коробка для хранения теннисных мячей имеет структуру LIFO: последний помещенный в нее мяч вы выбираете первым.

УПРАЖНЕНИЯ

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

1.1. Определите слово с именем ДАР, которое при своем выполнении выдаст название какого-то подарка. Например, вы можете определить

: ДАР ." подставку для книг " ;

Теперь определите слово с именем ДАРИТЕЛЬ, которое выводит на печать имя некоего лица, а затем слово с именем СПАСИБО, определение которого включает вновь созданные слова ДАР и ДАРИТЕЛЬ и выводит на печать сообщение, аналогичное следующему:

Дорогая Маша.
    спасибо за подставку для книг, ок

1.2. Определите слово с именем МИНУС-ДЕСЯТЬ, которое выбирает некоторое число из стека, вычитает 10 и помещает полученный результат в стек. (Подсказка: вы можете использовать слово +) Не забудьте включить в определение стековую нотацию.

1.3. После того как вы введете слова при решении упр. 1.1, переопределите слово ДАРИТЕЛЬ так, чтобы можно было вывести на печать чье-то другое имя (не переопределяя слово СПАСИБО), выполните последнее снова. Сможете ли вы объяснить, почему слово СПАСИБО выводит на печать имя первого дарителя?