Б. Терминология
Этот глоссарий включает в себя терминологию Форта, используемую в этой книге, а также общепринятую терминологию из области технологии ЭВМ. Заметьте, что применение и значение определенных терминов в Форте отличаются от общепринятых в вычислительной технике. Глоссарий предназначен для помощи при работе с текстом книги, он не является полным и исчерпывающим.
16-bit-number. 16-битовое число. Число (со знаком или без), которое может быть записано в 16 битов памяти. 16-битовое число без знака может представлять числа в диапазоне 0 - 65.535, а со знаком - в интервале -32.768 - 32.767. Для представления чисел со знаком используется дополнение по модулю два. См. также числа со знаком; числа без знака; дополнение по модулю два.
32-bit-number. 32-битовое число. Число (со знаком или без), которое может быть записано в 32 битах памяти. 32-битовое число без знака может представлять число в диапазоне 0 - 4.294.967.295, а со знаком - в интервале -2.147.483.648 - 2.147.483.647. Для представления чисел со знаком используется дополнение до модулю два. См. также числа со знаком; числа без знака; дополнение по модулю два.
Address. Адрес. Позиция в памяти ЭВМ. Адреса в большинстве микроЭВМ нумеруются байт-за-байтом, начиная с 0 до предельного адреса, который задается разрядностью адресной шины. Восьмибитовые микропроцессоры, такие как Z-80 и 8080, имеют 16 адресных шин и предельный адрес 65.535 (2^16). Шестнадцатибитовые микропроцессоры, такие как 8086, 8088 и 68000 часто имеют 20, 24 или даже 32 адресные шины и могут использовать очень большие памяти. Выражение "Z-80 может адресоваться к 65535 байтам памяти" означает, что максимальное значение адреса равно 65534.
Address interpreter. Интерпретатор адресов. Машинная программа Форта, которая осуществляет исполнение программы путем пошагового перехода по списку адресов других машинных программ, включающих в себя откомпилированные Форт-программы. Называется также внутренним интерпретатором, в противоположность внешнему интерпретатору.
См. также поле параметров.
Address space. Адресное пространство. Область памяти ЭВМ. к которой ЭВМ может адресоваться непосредственно. В большинстве микропроцессоров адресное пространство ограничено основной (полупроводниковой) памятью, но в ЭВМ с виртуальной памятью адресное пространство может распространятся на массовую память.
Algebraic notation. Алгебраическая нотация. Обычная нотация в алгебре. Система отображения математических соотношений, использующая произвольные символы в качестве операндов, инфиксную нотацию для операторов и скобки для задания очередности операций. В более широком толковании - любое выражение, использующее те же правила формирования. Противостоит постфиксной и префиксной нотации.
Algorithm. Алгоритм. Набор правил, которые определяют, как достичь желаемого результата. Все программы ЭВМ явно или неявно написаны так, чтобы реализовать один или несколько алгоритмов.
Arguament(s) Аргумент(ы). Величина (или величины), необходимая программе для выполнение ее функций. В форте аргументы помещаются в стек параметров для последующего использования их Форт-словами. Если слово CUBE в форте описано так, чтобы вычислять куб числа, то число 5 в примере 5 CUBE является аргументом. См. также операнд.
Arithmetic coprocessor. Арифметический сопроцессор. Специальная микросхема, используемая совместно с центральным процессорным устройством для ускоренного вычисления арифметических и трансцендентных, функций. Арифметический сопроцессор 8087 спроектирован для совместной работы с процессорами 8086 и 8088.
Arithmetic overflow. Арифметическое переполнение. Ошибка, которая происходит, когда арифметическая операция выдает результат, не соответствующий разрядности памяти. Например, если два числа одинарной длины перемножены с помощью * и получен результат более 65535 (2^16-1), этот результат ошибочен, так как * игнорирует часть произведения, не укладывающуюся в 16 битов. В случае работы с операторами смешанного типа для результата будет выделено 32 разряда.
См. также числа одинарной длины; числа двойной длины.
Array. Массив. Совокупность чисел, строк или другой информации, где каждый информационный объект называется элементом, а элементам поставлены в соответствие числа или индексы. Вектор представляет собой одномерный или линейный массив с одним индексом, матрица - двумерный массив, уложенный в ряды и столбцы с двумя индексами (хотя матрица с одним рядом идентична вектору); массивы большей размерности также возможны.
ASCII. Обозначение для Американского стандартного кода для обмена информацией. ASCII первоначально был разработан для стандартизации обмена между телетайпными терминалами. ASCII-код определяет набор управляющих символов (со значениями 0 - 31 и 127), чисел, букв и других символов (со значениями 32 - 126). (См. приложение Д, где приведена таблица ASCII-символов.) Заметим, что ASCII определяет только набор символов для младших 7 битов байта, так что коды между 128 и 255 8- битового байта не определены в ASCII и их использование на разных ЭВМ сильно варьируется.
Assembler language. Ассемблер. Язык программирования низкого уровня, использующий мнемонику, которая может быть непосредственно транслирована в исполняемую машинную программу. Форт-ассемблер состоит из слов словаря ASSEMBLER, которые описывают мнемонику и компилируют машинные программы. См. также набор инструкций, машинные инструкции.
Base (number). Основание (числа). См. основание системы счисления. Baud rate. Скорость передачи (в бодах). Телекоммуникационный термин, часто используется неверно в значении "бит в секунду". Скорость передачи в бодах в действительности равна числу раз в секунду, когда телекоммуникационный канал меняет свое состояние, что в зависимости от схемы кодирования может давать число битов в секунду значительно больше, чем скорость передачи в бодах.
Baudot code. Код Бодо. Старый телекоммуникационный код, названный в честь Эмиля Бодо. В этом коде представления символов на телетайпе используется только 5 битов в верхнем и нижнем регистрах (поэтому возможно представление более чем 32 символов).
Код Бодо используется также для некоторых других целей, таких как передача данных о погоде и для связи между глухими.
Binary notation. Двоичное представление. Система представления чисел, использующая основание 2. Существует только две двоичные цифры, 0 и 1. Внутреннее представление чисел в ЭВМ только двоичное, так как бистабильные электронные схемы хорошо приспособлены для представления двоичных цифр. Вход и выход системы Форта может быть сделан двоичным с помощью 2 BASE ! См. также бит.
Bit. Бит. Самая малая единица информации, имеющая только два состояния 0 и 1. Бит - это сокращение термина "binary digit" (двоичная цифра) и т.о. является цифрой двоичного представления. См. также байт.
Bit mask. Бит-маска. Число, используемое для извлечения или изменения битов другого числа. Бит-маски широко используются для манипулирования битами в памяти, а также используются с булевыми операторами, позволяя в одном байте хранить восемь отдельных флагов. Называется также просто маской.
Block. Блок. В Форте - часть массовой памяти, которая содержит 1024 (1К) байтов. Блоки нумеруются последовательно и загружаются в память словом BLOCK. Для переноса блока из памяти на диск используется UPDATE и FLUSH (или SAVE-BUFFERS). Называется также экраном, в особенности если содержит только алфавитно-цифровую информацию. См. также блочный буфер; кэш диска; виртуальная память.
Block buffer. Блочный буфер. Область в основной памяти для хранения блоков форта при обмене с диском. Блок заносится в блочный буфер с помощью слова BLOCK, которое оставляет в стеке адрес первого байта блочного буфера. Активный s данный момент блочный буфер помечается для последующей переписи на диск с помощью слова UPDATE. Перенос осуществляется при необходимости перезаписи в блочный буфер или при использовании слов FLUSH или SAVE-BUFFERS. См. также блок; кэш диска; виртуальная память.
Boolean flag.Булев флаг. Число, используемое для описания логического состояния. Истинно в Форт-79 равно-1, в то время как в форт-83 - -1 (FFFF HEX или все биты равны 1).
В обоих стандартах 0 соответствует ложно. Условные операторы Форта распознают любое ненулевое число в стеке как булев флаг истинно. Часто называется просто флагом. Назван в честь британского математика Джоржа Буля.
Buffer. Буфер. Область памяти, зарезервированная для временного хранения информации. В Форте блочные буферы используются для пересылки 1024 байтов с диска и на диск, а входной буфер воспринимает данные, поступающие с клавиатуры. Byte. Байт. Группа из 8 битов, которая чаще всего рассматривается 'как элемент памяти. Байт может принимать значение О - 255 (в десятичном представлении) или 0 - FF в шестнадцатеричном. См. также бит; килобайт; мегабайт.
Case-construct. CASE- конструкция. Структура программы, которая позволяет при исполнении осуществлять переход на одну из нескольких программ в зависимости от того, какая совокупность условий удовлетворена. CASE- конструкция может быть реализована через систему встроенных структур IF...ELSE...THEN, но часто используются специальные Форт-слова, такие как ACASE и NCASE в MMSFORTH. См. также векторное исполнение.
Cell. Ячейка. В Форте размер ячейки равен 16 битам. Ячейка в форте предпочтительнее, чем более распространенный термин "слово" (что означает для большинства микро ЭВМ то же самое), чтобы избежать путаницы с форт-термином "слово". Ячейка может содержать ровно одно число одинарной длины. См. также длина слова.
Central processing unit. Центральный процессор. Часть ЭВМ, которая интерпретирует и исполняет машинные инструкции. В микро ЭВМ - это одна микросхема, называемая микропроцессором. Часто используется сокращение ЦП, иногда называется просто процессор. CFA. Обозначение для адреса поля программы.
Code-field. Поле программы. Часть откомпилированного Форт-описания, содержимое которого указывает на машинную программу, которая исполняется, когда исполняется описанное слово. См. также адрес поля программы.
Code-field-address. Адрес поля программы. Адрес поля программы откомпилированного Форт-описания.
Поле параметров типа двоеточие содержит список адресов полей программы слов, содержащихся в описании, но не адрес, содержащийся в поле программы. Обычно обозначается сокращением CFA. См. также поле программы.
Colon-definition. Описание-двоеточие. Описание слова Форта, созданное оператором :. Часто используется синоним слово-двоеточие.
Colon-word. Слово-двоеточие. Слово Форта, описанное словом описателем :. Слова-двоеточие, кстати, являются наиболее часто встречающимися словами Форта. Часто используется синоним описание двоеточие.
Comparison operator. Оператор сравнения. Оператор, который определяет соотношение между двумя числами и выдает булев флаг, характеризующий это соотношение. Например, оператор сравнения может определить, является ли величина меньше, больше или равна 0, меньше, больше или равна другой величине. Операторы сравнения могут комбинироваться, чтобы сформировать такие проверки, как меньше или равно, больше или равно и т. д. Примерами могут служить слова Форта , = и 0=.
Compilation. Компиляция. Процесс трансляции исходного текста программы в форму, пригодную для исполнения на ЭВМ. В большинстве языков (таких как Фортран) компиляция состоит в формировании машинной программы из исходного текста высокого уровня. Описания-двоеточия в Форте при компиляции образуют список адресов полей программы, которые указывают интерпретатору исполнительные адреса. Мнемоника Форт-ассемблера компилируется в машинные инструкции, которые ЭВМ может исполнить немедленно.
Compile mode. Режим компиляции. Режим, при котором внешний интерпретатор Форта компилирует слова в Форт-описания, а не исполняет их. Это происходит, когда переменная STATE не равна 0. Если в режиме компиляции встретится слово немедленного исполнения, оно выполняется. Противостоит режиму исполнения.
Compiled code. Откомпилированная программа. Результат компиляции. Ассемблер компилирует выполнимую машинную программу. Форт-компилятор формирует список адресов, который может исполнить интерпретатор адресов.
См. также режим компиляции; поле параметров.
Concatenate. Присоединить. Сформировать "стык-в-стык" цепочку из строк, списков величин или Других наборов информации;
Conditional operator. Условный оператор. Элемент программы, который вызывает передачу управления (ветвление) по указанному адресу или выполнение заданной функции, если выполнено определенное условие. Примерами из Форта могут служить IF, WHILE, UNTIL и ABORT", каждый из которых предполагает наличие в стеке флага, который- и определяет, что делать. См. также булев флаг.
Control character. Управляющий символ. ASCII-символ, который выполняет управление терминалом. ASCII-символы имеют коды от 1 до 31 и 127. Например, слово Форта CR выдает символ "возврат каретки" иди 13. См. также ASCII; управляющая клавиша. См. приложение Г.
Control key. Клавиша CTRL. Клавиша, расположенная на терминале ЭВМ и большинства микрокомпьютеров, которая при , совместном нажатии с другой клавишей формирует ASCH-CTRL- символ. Например, CTRL H выдаст ASCII-код 8 (возвращение курсора на одну позицию). См. приложение Г.
Controlled reference word. Слово из контролируемого списка. В стандарте Форт-83 слова, которые, хотя и не входят в обязательный список, если присутствуют в стандартной системе, должны быть описаны в соответствии со спецификациями стандарта. Противоположно слову из расширяющего набора слов; слову из обязательного списка и словам из "неконтролируемого" списка.
Count (siring). Счетчик (строки). Байт, размещенный непосредственно перед строкой алфавитно-цифровых символов и со держащий число символов в строке (0-255). См. также счетная строка.
Counted string. Счетная строка. Формат, обычно используемый в Форте для записи строк символов. Счетная строка состоит из байта-счетчика (однобайтовое число), за которым непосредственно следует строка символов. Байт-счетчик определяет число символов в теле строки. См. также счетчик (строки).
CPU. ЦПБ. Сокращение, означающее "центральный процессорный блок."
Crosscompiler. Кросскомпилятор. Программа, которая позволяет откомпилировать программу на одной ЭВМ ,так, что она сможет работать на другой. В Форте разновидностью кросскомпилятора является метакомпилятор или целевой компилятор, который позволяет преобразовывать всю систему Форта так, что она сможет работать на другой ЭВМ, часто со специальными функциями.
Data stack. Стек данных. Синоним стека параметров.
Decimal notation. Десятичная система представления. Представление чисел в привычной десятичной системе счисления, которая использует цифры 0 - 9. В Форте десятичный ввод и вывод задаются словом DECIMAL.
Decompiler. Декомпилятор. Программа Форта, которая "декомпилирует" откомпилированные описания-двоеточие так, что они приобретают вид, напоминающий исходный текст. Декомпилятор показывает, как были описаны откомпилированные слова.
Deferred compilation. Отложенная компиляция. Термин Форта, описывающий действие COMPILE и других родственных слов. Когда внутри слова-двоеточие исполняется оператор COMPILE, он компилирует CFA слова, следующего за ним, в описание слова-двоеточие таким образом, что, когда слово-двоеточие исполняется, это CFA будет скомпилировано в словарь. Таким образом компиляция слова, следующего за COMPILE, откладывается до исполнения COMPILE. Например, LITERAL содержит COMPILE LIT, причем это слово немедленного исполнения, так что. когда LITERAL встречается в описании,.оно компилирует LIT и число из стека в словарь.
Defining word. Слово-описатель. Слово Форта, которое служит для описания новых (производных) слов. Любое слово-двоеточие, которое описано с помощью CREATE, является словом-описателем. Общеизвестными примерами могут служить CONSTANT и VARIABLE. Новые слова-описатели могут быть созданы с помощью конструкции CREATE...DOES>.
Delimiter. Разделитель. Любой код, обычно ASCII-символ, который используется для выделения элементов данных. Например, слово." использует в качестве разделителя " (двойные кавычки), а слово ( использует >
(закрывающую скобку), форт распознает пробел (ASCII 32) в качестве разделителя между форт-словами и числами во входном потоке. Для отделения последовательностей символов различной длины в файле могут использоваться один или несколько разделителей. См. также разбор.
Dictionary. Словарь. В Форте - это связанный список откомпилированных описаний, которые могут быть исполнены интерпретатором адресов Форта. Читаемый ЭВМ набор слов Форта, которые могут быть исполнены или откомпилированы. Форт помечает начало словаря и адрес его "вершины", последний заносится в стек с помощью HERE.
Dictionary pointer. Указатель словаря. Переменная (иногда называемая DP), значение которой указывает на первый свободный байт выше словаря. Значение указателя словаря засылается в стек оператором HERE.
Disassembler. Дисассемблер. Служебная программа, которая отображает машинную программу в читаемой форме мнемоники ассемблера. Дисассемблер рассматривает группу из одного или нескольких байтов и отображает мнемонику ассемблера и аргументы, которые были бы необходимы для их генерации.
Disk cache. Кэш диска. Метод управления дисковой памятью, в котором часто используемая информация находится в памяти, а не считывается с диска каждый раз, когда необходима. Блочный буфер Форта является разновидностью кэш-буфера. См. также виртуальная память; буфер; блок.
Disk operating system. Дисковая операционная система. Набор программ или служебных средств для обеспечения взаимодействия между оператором, ЭВМ и другими элементами, такими как принтер, интерфейс RS-232 и дисковая память. Дисковая операционная система контролирует также многие функции ЭВМ. СР/М и MS-DOS являются типичными примерами ДОС для микроЭВМ. Автономная версия Форта несет в себе элементы дисковой операционной системы.
Do-loop. do-loop. Программная конструкция, которая заставляет определенную часть программы выполняться заданное число раз. do-loop в Форте реализуется с помощью DO-LOOP или DO...+LOOP. См. также цикл; бесконечный цикл.
DOS. ДОС. Сокращение для "дисковая операционная система".
Double-length-number. Число двойной длины. Целое 32- разрядное число. Числа двойной длины без знака лежат в диапазоне 0 - 4.294.967.295, а числа двойной длины со знаком - от 2.147.483.648 до 2.147.483.647. Называются также двойными числами и числами двойной точности (хотя последнее нетипично, это должно относиться только к числам с плавающей запятой). Противоположно числам одинарной длины.
Double-number. Двойное число. Синоним числа двойной длины, что предпочтительнее.
Double-precision number. Число двойной точности. Синоним числа двойной длины, последний термин предпочтительнее. Более правильно - число с плавающей запятой с двойным числом значащих цифр.
Editor. Редактор. Программа для ввода и модификации данных, обычно исходного текста программы. Форт-редактор Используется для модификации содержимого блоков Форта.
Element (array). Элемент (массива). Часть массива, обычно число или строка, доступ к которой возможен с помощью индекса массива. См. также индекс (массива).
Escape key. Клавиша ESC. Клавиша, присутствующая на многих терминалах для инициации ESC-последовательностей. Она формирует ASCII код 27.
Escape-seguencc. ESC-последовательность, Последовательность символов, начинающая с символа ESC (ASCII 27). ESC-последовательность используется для управления внешними устройствами, такими как терминал или принтер. См. также клавиша ESC.
Execute mode. Режим исполнения. Режим работы в Форте, в котором слова, встретившиеся во входном потоке, немедленно исполняются и в котором числа кладутся в стек, а не компилируются, форт устанавливается в режим исполнения, когда значение переменной STATE равно 0. Противоположен режиму компиляции. Execution. Исполнение. Действие, при котором ЭВМ выполняет операции, заданные программой (или Форт-словом). Исполнение в Форте происходит, когда значение переменной STATE равно 0, и осуществляется интерпретатором адресов. См. также режим исполнения; режим компиляции.
Exponential notation. Показательное представление. Способ представления чисел с плавающей запятой в виде мантиссы и показателя степени. Так, число с плавающей запятой 1024. может быть представлено как 1,024*10^3 или, как обычно, на выходе ЭВМ 1.024Е3, 1.024 - мантисса, а 3 -- показатель. Показатель равен показателю степени, в которую нужно возвести 10, после чего умножить результат на мантиссу, чтобы получить правильную величину числа. Научная нотация является формой показательного представления.
Extension word set. Расширяющий набор слов. Набор слое, которые могут быть добавлены к системе для расширения ее возможностей. Как в стандарте Форт-79, так и в Форт-83 эти слова не являются обязательными, но если они вводятся в систему, они должны соответствовать стандартному описанию. Стандартные расширяющие наборы включают в себя библиотеку для работы с числами двойной длины, ассемблер и системные расширения. Нестандартные наборы часто содержат графику, библиотеку для работы с числами с плавающей запятой, декомпилятор, слова для работы со строками и т. д.
Extensible language. Расширяемый язык. Любой язык, такой как Форт. который может расширить свои возможности с помощью своих собственных средств, в противоположность таким языкам, как Фортран, Паскаль или Бейсик, которые используются для написания программ, не имеющих ничего общего с самим языком.
Factoring. Факторизация. В Форте процесс разбиения задачи на более мелкие задачи, которые могут быть эффективно запрограммированы на Форте. Длинные описания слов могут (и обычно должны) быть для ясности разложены не несколько более коротких описаний. Этот процесс аналогичен факторизации сложных уравнений в набор более простых.
False (flag). Ложно (флаг). Булев флаг, который устанавливается, когда при проверке выясняется, что некоторое условие не выполняется. Противоположно флагу истинно. См. также условный оператор.
Field (file). Поле (в файле). Заданная область памяти в пределах записи а файле, обычно содержащая один элемент информации.
В адресном файле, например, каждая запись может содержать поля для имени, адреса, улицы, города, страны и почтовый индекс.
File. Файл. Упорядоченная совокупность данных в массовой памяти. Файл обычно состоит из одной или более записей, каждая из которых содержит одно или более полей.
Flag. Флаг- число, часто один бит, которое индицирует состояние определенного условия. Если флаг имеет только два возможных состояния, называемых истинно и ложно, то это булев флаг.
Flag register. Регистр флагов. Регистр ЦПБ, разряды которого индицируют условия, соответствующие результату выполнения самой последней инструкции, например произошло или нет арифметическое переполнение. Разряды этого регистра анализируются при выполнении условных операций машинной программы.
Floating-point notation. Представление чисел с плавающей запятой. Способ показа того, что число имеет целую и дробную , части: целую часть - слева от десятичной запятой и дробную часть - справа. Так, 12,34 равно 12 + 34/100. Положение десятичной запятой корректируется автоматически (плавает) в зависимости от результата арифметической операции. См. также показательное представление.
Flowchart. Блок-схема. Диаграмма, которая графически демонстрирует процесс выполнения программы. Блок-схема является часто хорошим способом прояснить структуру программы.
FORTH-standart. Стандарт Форта. Минимально необходимый набор слов Форта и их специфированных функций, а также описанных функций слов, которые не являются обязательными. Цель стандарта - позволить стандартным Форт-программам работать на самых разных ЭВМ. Двумя главными стандартами Форта являются Форт-79 и Форт-83, были предложены и другие более ранние стандарты, но они не получили широкого распространения. См. также слово из контролируемого списка: слово из расширяющего набора; слово из обязательного списка; слово из неконтролируемого списка.
Hash code. Хэш-код. См. хэширование.
Hashing. Хэширование. Метод, при котором входной код используется для того, чтобы определить, где этот код должен быть записан в память или файл.
Определяется хэш-код, который используется для вычисления адреса в памяти. Тот же самый хэш-код (и, следовательно, тот же адрес) генерируется при поиске кода. ускоряя таким образом доступ к информации. Хэширование - это метод кодирования строки или числа, обычно для того, чтобы сэкономить память. В Форте хэширование используется лишь иногда, чтобы приписать слова к различным маршрутам поиска, таким образом ускоряя поиск в словаре и компиляцию.
HEX. Жаргонное слово, обозначающее шестнадцатеричную систему представления.
Hexadecimal notation. Шестнадцатеричное представление. Представление чисел при основании системы счисления 16. Шестнадцатеричные цифры лежат в диапазоне 0 - 9 и для представления десятичных чисел от 10 до 15 - от A до F. 31 в десятичном представлении равно 1F в шестнадцатеричном. Противостоит двоичному, восьмеричному и десятичному представлению.
High-level language. Язык высокого уровня. Языки программирования (такой как Бейсик, Кобол, Фортран и, конечно. Форт), которые используют слова и (в какой-то степени) синтаксис человеческого языка. Все языки высокого уровня должны идти на некоторый компромисс между использованием памяти и быстродействием с целью облегчения программирования для людей. Форт требует меньшего компромисса, чем большинство других языков. Противостоит языкам низкого уровня.
Immediate word. Слово немедленного исполнения. Слово Форта, которое будет исполнено даже в режиме компиляции, на пример, во время компиляции описания. Слова немедленного исполнения помечаются с помощью установки специального бита в заголовке. Примерами таких слов могут служить (, IF, BEGIN,.(, и LITERAL. См. также отложенная компиляция; лидирующий бит.
Incremental compiler. Инкрементный компилятор. Тип компилятора, который интерпретирует исходный текст элемент-за-элементом и последовательно формирует исполняемую машинную программу. Компиляция в Форте производится инкрементно.
Indefinite loop. Бесконечный цикл. Программная структура, которая вызывает повторное исполнение выделенной части программы бесконечное число раз, пока не будет выполнено определенное условие.
ВEGIN...WHILE...REPEAT и BEGIN- UNTIL являются конструкциями, организующими бесконечные циклы в Форте. См. также цикл. Противостоит do-loop.
Index (array). Индекс (массива). Одно или более чисел, которое определяет номер элемента массива. См. также вектор; матрица.
Index (loop). Индекс (цикла). В структуре do-loop счетчик числа циклов. В DO...LOOP в Форте значение индекса заносится в стек параметров оператором I.
Index line. Индексная строка. Верхняя строка блоков Форта, согласно договоренности используется для комментариев содержимого блока, таких как дата, автор, список описанных слов и т. д.
Infix notation. Инфиксная нотация. Представление математических функций, при котором операторы помещаются между операндами. Алгебраическая нотация является формой инфиксной нотации. Инфиксная нотация требует использования скобок для определения порядка операций. Противостоит префиксной и постфиксной нотации.
Inner interpreter. Внутренний интерпретатор. Короткая машинная программа, которая осуществляет выполнение скомпилированного списка адресов-заданий из описаний словаря Форт. Синоним интерпретатора адресов. См. также поле программы; поле параметров.
Input stream. Входной поток. Термин Форта для исходного текста программы или данных, которые интерпретируются в данный момент внешним интерпретатором Форта. Входной поток поступает с клавиатуры, когда значение переменной BLK равно 0, в противном случае - из блока, номер которого лежит в BLK. Форт-определение входного потока отличается от общепризнанного в вычислительной технике, где входной поток является синонимом потока заданий, списка задач, ожидающих исполнения, обычно на главном процессоре.
Instruction set. Набор инструкций. Полный набор команд машинного языка (двоичных чисел s памяти), которые может исполнить центральный процессор. Полный ассемблер включает мнемонику полного набора инструкций процессора.
Interpretation. Интерпретация. В Форте существует два различных значения, которые следует понимать из контекста.
Видном случае интерпретация - это процесс, при котором исходный текст программы или данных воспринимается из входного потока внешним или текстовым интерпретатором и обрабатывается. Если система Форт находится в режиме исполнения, слова немедленно исполняются, а числа заносятся в стек. В режиме компиляции входные данные используются для описания новых слов. Под интерпретацией понимается также декодирование и исполнение слов, описанных в словаре Форта, что производится внутренними или адресным интерпретатором. Эти значения отличаются от общепринятых в вычислительной технике, где под "интерпретацией" подразумевается работа интерпретатора, при которой в случае языков высокого уровня исходный текст исполняется элемент за элементом через машинные программы без формирования полного объектного образа программы (Бейсик использует обычно интерпретатор). Поскольку Форт способен как немедленно исполнять слова при их вводе, так и компилировать новые слова и программы, он сочетает в себе преимущества интерпретатора и компилятора, обеспечивая немедленную реакцию первого и быстродействие последнего. См. также цепной интерпретивный язык.
Interpreter. Интерпретатор. В вычислительной технике применения языка высокого уровня, в котором исходный текст преобразуется в машинную программу и исполняется элемент за элементом без построения полного объектного образа программы (Бейсик использует обычно интерпретатор). В Форте смысл сходен, но отличен как в случае внешнего (текстового), так и внутреннего (адресного) интерпретатора. Первый воспринимает и исполняет или компилирует текст, в то время как последний декодирует и исполняет описание в Форт-словаре. Форт работает, вообще говоря, как интерпретатор, только когда входная программа исполняется внешним интерпретатором. См. также интерпретация.
Irrational number. Иррациональное число. Число, такое как "Пи" или е, которое не может быть выражено через какое-либо отношение двух целых чисел. См. также рациональное приближение.
Kernel. Ядро. Набор форт-примитивов (последовательности машинных программ) в "нижней" части словаря, который является базисом всех последующих Форт-описаний.
Kilobyte. Килобайт. 1024 (2^10) 8-битовых байтов информации, обычно я памяти или на диске. См. также байт; мегабайт.
Last-in-first-out stack. Стековая структура LIFO. Любой стек, где число, введенное последним, окажется выведено первым, в Форте как стек параметров так и стек возвратов относятся к этому типу. Least significant bit. Младший бит. Бит любого числа, который является младшим при двоичном представлении. В двоичном числе 101 самая правая единица является младшим битом.
Least significant byte. Младший байт. Байт любого числа, который является младшим при шестнадцатеричном представлении. В шестнадцатеричном числе 12AF AF-младший байт.
Least significant digit. Младшая значащая цифра. Цифра в любом числе, которая отображает наименее значимую величину. Самая правая цифра. В десятичном представлении 5 в 1295 представляет собой младшую значащую цифру.
Least significant number. Младшее число. В Форт-числе двойной длины - это число одинарной длины, которое представляет младшую его часть. В шестнадцатеричном представлении F25F в числе 129CF25F является младшим.
LFA. Обозначение для "адреса поля связи".
Linear array. Линейный массив. Структура данных, которые могут быть представлены в виде линейки элементов массива. Массив с элементами, пронумерованными последовательно от N1 до Nn с помощью одного индекса. Отдельная строка или колонка матрицы является линейным массивом. Вектор. Противоположность матрицы.
Link-field. Поле связи. Часть откомпилированного Форт-описания, которая содержит адрес или связь, определяющие следующее слово, которое будет просмотрено при поиске в словаре.
Link-field address. Адрес поля связи. Адрес поля связи в откомпилированном Форт-описании. Содержимое этого адреса указывает на слово, которое при поиске в словаре будет просмотрено следующим. Но не адрес в поле связи.
Literal. Литерал. В Форте это число, которое скомпилировано в описание-двоеточие (либо в результате распознания числа во входном потоке, либо словом LITERAL) и которое при исполнении слова, куда оно было скомпилировано, заносится в стек. В некоторых версиях разрешено использовать в качестве литералов байты и числа двойной длины. В вычислительной технике это слово имеет другое значение и относится к прямому числовому представлению величины числа в противоположность символьному представлению. В строке Бейсик A=5+6,5 и 6 - литералы.
Load block. Загрузочный блок. В Форте блок, используемый для загрузки других блоков. Загрузочный блок является удобным средством для контроля за порядком загрузки последовательности блоков, при загрузке, например, различных дополнений и частей программы.
Loop. Цикл. Программная структура, которая вызывает повторное исполнение определенной части программы. Число повторений цикла может быть задано (конечные циклы или do-loop) или не определено (бесконечный цикл).
Low-level language. Язык низкого уровня. Язык программирования, который транслируется непосредственно или почти напрямую на машинный язык. Ассемблер является наиболее распространенным языком низкого уровня, мнемоника которого непосредственно преобразуется в машинные инструкции. Форт, позволяя описание слов с использованием ассемблера, комбинирует преимущества языков высокого и низкого уровней.
LSB - в контексте младший бит или байт какого-либо числа.
Machine code. Машинная программа. Набор двоичных кодов, которые будучи загруженными резидентно в память могут быть непосредственно исполнены центральным процессором. Все языки в конечном итоге транслируют инструкции высокого уровня в машинную программу.
Machine instruction. Машинная инструкция. Двоичное число в машинной программе, которое предписывает центральному процессору выполнить специфическую функцию. См. также набор инструкций; машинная программа; машинный язык; ассемблер; мнемоника.
Machine language. Машинный язык.
Язык, состоящий из машинных программ, которые непосредственно исполнимы центральным процессором. Обычно представляются в виде байтов в шестнадцатеричном счислении. Метод программирования - путем загрузки набора двоичных кодов, которые могут быть исполнены ЭВМ. Противостоит языку высокого уровня; языкам низкого уровня; ассемблеру.
Mask (bit). Маска. См, также бит-маска.
Mass storage. Массовая память. Устройство долговременной памяти данных вне основной (полупроводниковой) памяти. Типичными устройствами массовой памяти являются гибкий и жесткий магнитные диски, магнитофон и память на магнитных доменах.
Matrix. Матрица. Двумерный массив, который может быть представлен о виде таблицы данных, изображенной на плоскости. Элементы образуют строки и столбцы и адресуются с помощью двух индексов. Вектор или линейный массив могут рассматриваться как матрица (только с одной строкой или столбцом). Квадратная матрица имеет равное число строк и столбцов. Megabyte. Мегабайт. 1.048.576 (2^20) 8-битовых байтов в памяти или на диске. См. также килобайт.
Memory. Память. Часть ЭВМ, в которой запоминаются данные и программа. Внутренняя память адресуема центральным процессором непосредственно. Существуют постоянные запоминающие устройства (ПЗУ), содержимое которых центральный процессор может прочесть, но не может изменить, имеются также запоминающие устройства с произвольной выборкой (ЗУПВ), для которых осуществимо как чтение, так и запись. Внешняя память содержит информацию, которая должна быть считана в основную память, прежде чем будет использована процессором. Внешняя память - это массовая память, включающая в себя такие устройства, как магнитофоны или диски. См. также адресное пространство; массовая память; виртуальная память.
Memory map. Карта памяти. Визуальное представление того, где размещаются различные части системы и как используется память для тех или иных функций ЭВМ. Карта памяти полезна при описании функций программы, языка или ЭВМ.
Metacompiler. Метакомпилятор.
Разновидность кросскомпилятора, которая используется для написания других компиляторов. В Форте метакомпилятор - это Форт-программа, которая может компилировать полную форт-систему и запускать ее на той же или другой ЭВМ. Называется также целевым компилятором.
Microprocessor. Микропроцессор. Центральный процессор в виде одной микросхемы. Центральный процессор микроЭВМ.
Mixed-mode arithmetic. "Смешанная" арифметика. Арифметические операции, которые используют операнды как двойной, так и одинарной длины или выдают результат другой длины, чем операнды. Операторы смешанного типа используются для того, чтобы избежать арифметического переполнения.
Mixed-mode operator. Оператор смешанного типа. Арифметический оператор, который работает со "смешанной" арифметикой.
Mnemonic. Мнемоника. Техника помощи человеческой памяти, более конкретно-читаемое сокращение, состоящее из первых букв или частей последовательности слов. В терминологии вычислительной техники - последовательность букв, которая образует инструкцию, используемую ассемблером для компиляции одной машинной команды. Мнемоники в форт-ассемблере - Это слова, которые компилируют машинную программу.
Modulus. Модуль. Остаток целочисленного деления.
Most significant bit. Старший бит. Бит любого числа, который при двоичном представлении обозначает самую старшую цифру. В двоичном числе 101 самая левая единица является старшим битом.
Most significant byte. Старший байт. Байт любого числа, который при шестнадцатеричном представлении является старшим. В шестнадцатеричном числе 12AF 12 является старшим байтом.
Most significant digit. Старшая цифра. Цифра любого числа, которая отображает наиболее значимую величину. В десятичном представлении 1 в 1295 является старшей цифрой.
Most significant number. Старшее число. В числе двойной длины число одинарной длины, в котором записана старшая часть двойного числа. В шестнадцатеричном числе A34B9C5D А34В является старшим числом.
Name field. Поле имени.
Часть откомпилированного Форт-описания в словаре, которая содержит имя слова и другую информацию. См. также адрес поля имени.
Name-field address. Адрес поля имени. Адрес первого байта поля имени откомпилированного Форт-описания. Адрес поля имени - это не адрес, хранящийся в поле имени.
NFA - сокращение для name-field address (адрес поля имени).
Nibble. Полубайт 4 бита. Number. Число, в Форте - 16-битовое число, т.е. целое число одинарной длины или в зависимости от контекста любое числовое значение.
Number base. Основание числа. Основание системы счисления. Число символов, первый из которых 0, используемое для представления цифры в числе. В шестнадцатеричных числах (числах с основанием 16) диапазон символов простирается от О до 9 и от А до F, в то время как в восьмеричной (основание 8) - от 0 до 7. В Форте основание системы счисления при вводе и выводе может изменяться от 2 до 70 путем изменения содержимого переменной BASE.
Object code. Объектный код. Исполняемая программа, обычно синоним машинной программы, полученной в результате трансляции исходного текста посредством компилятора или ассемблера. Объектный код, полученный в результате компиляции Форт-ассемблером, является исполняемой машинной программой. Другие компилированные Форт-программы представляют собой список адресов и(или) чисел, исполняемых только интерпретатором адресов Форта, и. хотя это не объектный код в строгом смысле этого слова, его иногда называют объектным кодом Форта.
Octal notation. Восьмеричное представление- Представление чисел при основании системы счисления 8. Восьмеричные цифры лежат в диапазоне 0 - 7. Каждая восьмеричная цифра представляется тремя битами. Восьмеричное представление бывает полезным для понимания структуры машинных инструкций процессора.
One-dimeniional array. Одномерный массив. Синоним вектора или линейного массива.
Ones complement. Дополнение по модулю один. Дополнение числа по модулю один получается путем инверсии всех битов числа, т.е. все биты равные 1 1 сбрасываются в 0, а все нулевые биты делаются равными 1.
Дополнение по модули один числа 10011001 равно 01100110. См. также дополнение по модулю два.
Op-code. - жаргонное выражение для operation code (код операции).
Operand. Операнд. Объект, с которым работает оператор. В Форте в выражении 3 4 + 3 и 4 являются операндами, используемыми оператором.
Operation system. Операционная система. См. дисковая операционная система.
Operation code. Код операции. Машинная инструкция, иногда называется КОП.
Operator. Оператор. Символ или слово Форта, которые выполняют математическую операцию. В Форт выражении 3 4 + + является оператором, а 3 и 4 - операндами.
Outer interpreter. Внешний интерпретатор. Часть Форт-системы, которая интерпретирует входной поток, исполняя слова и числа или компилируя их в описания новых слов или, менее часто, производя разбор входных данных. Называется также текстовым интерпретатором. Противостоит интерпретатору адресов; внутреннему интерпретатору.
Overflow (data). Переполнение (данных). Ошибка, когда результат операции превосходит по размеру место, выделенное для его записи. Например, результат операции над числами одинарной длины дает переполнение, если он требует для своей записи более 16 битов. См. также арифметическое переполнение.
Overflow (stack). Переполнение стека. Переполнение стека происходит, когда место в памяти, выделенное для него, оказывается полностью использовано. В Форте это обычно случается, когда указатель стека параметров начинает указывать на верх словаря.
Parameter-field. Поле параметров. Часть откомпилированного Форт-описания, которое содержит информацию, определяющую специфическое поведение слова. Поле параметров слова-двоеточие содержит список адресов полей программы слов в описании. Поле параметров переменной содержит значение этой переменной. Поле параметров слова-примитива содержит машинную программу, исполняемую этим примитивом.
Parameter field address. Адрес поля параметров. Адрес начала поля параметров в Форт-описании. Но не адрес, содержащийся в поле параметров.
Parameter stack. Стек параметров. Стек типа LIFO, с которым манипулируют Форт-программы. Называется также стеком данных. Противостоит стеку возвратов.
Parsing. Разбор. Процесс разбиения входного потока Форта на алфавитно-цифровые последовательности, разделенные символами-разделителями. Внешний интерпретатор. Форта обычно производит выделение чисел или слов Форта в виде лексем, используя пробел в качестве разделителя. Строки данных могут также подвергаться разбору, в каждом случае могут использоваться разные разделители. Разбор обычно производится словом WORD. Вообще в вычислительной технике - это прием исходного текста программы и подготовка его для интерпретации или компиляции.
PFA. Обозначение адреса поля параметров.
Polish notation. Польская нотация. См. префиксная нотация.
Postfix notation. Постфиксная нотация. Форма математической нотации, в которой операторы следуют за операндами. Алгебраическое выражение (2+3) * (4+5) в постфиксной нотации должно выглядеть как 2 3 + 4 5 + * Форт использует постфиксную нотацию, так как ее легче совместить с LIFO-стеком. Синоним инверсной польской нотации. Противоположно алгебраической нотации префиксной нотации; инфиксной нотации.
Precedence bit. Лидирующий бит. Бит поля имени слова Форта, который определяет, является ли оно словом немедленного исполнения и, следовательно, должно ли слово исполняться в режиме компиляции. См. также "слово немедленного исполнения".
Prefix notation. Префиксная нотация. Форма математической нотации, при которой оператор предшествует своим операндам. Алгебраическое выражение (3+4) * (5+6) в префиксной нотации должно выглядеть как * + 3 4 + 5 6 То же, что и польская нотация. Противоположно алгебраической нотации; инфиксной нотации; постфиксной нотации.
Primitive. Примитив. Тип слов Форта, которые непосредственно исполняют машинную программу, в частности слова из ядра Форта. Содержимое поля программы примитива указывает на поле параметров этого же слова, которое содержит исполняемую машинную программу.
Processor. Процессор. Центральный процессор или микропроцессор.
PUSH. Операция занесения числа в стек (см. также POP)
Radix. Основание системы считывания (см. также BASE)
RAM. Память с произвольным доступом (ППД)
Random access memory. Память с произвольным доступом. Главная (полупроводниковая) память, которая позволяет центральному процессору как чтение, так и запись. Сокращение ППД. Противоположна постоянной памяти. Технически памятью с произвольным доступом может быть любая память, к которой может обратиться центральный процессор, но обычно терминологически ПЗУ исключается. См. также память.
Rational approximation. Рациональная аппроксимация. Аппроксимация иррациональных чисел с помощью отношений целых чисел. Так, Пи (3.1415926...) может быть аппроксимировало с точностью трех десятичных знаков отношением 22/7 (3.1428571...), в то время как 355/113 (3.1415929...) является аппроксимацией Пи с точностью до семи десятичных знаков.
Read-only memory. Постоянная память. Основная (полупроводниковая) память, которая может быть прочитана, но содержимое которой не может быть изменено центральным процессором. Сокращение - ПЗУ. Противоположна памяти, с произвольным доступом. См. также память.
Record (file). Запись (в файле). Группа связанных элементов информации, которые могут рассматриваться в файле как единое целое. Например, типовой файл платежной ведомости должен содержать набор записей, включающих имя, зарплату и другие необходимые данные, относящиеся к конкретному сотруднику. Место, выделенное для каждого элемента информации в записи, называется полем.
Recursion. Рекурсия. Способность программы обращаться к самой себе. Рекурсия в Форте заключается в том, чтобы слово могло обратиться к самому себе из своего описания, что может быть сделано с помощью слов MYSELF или RECUBSE или имени самого слова, в зависимости от версии.
Register. Регистр. Одна из нескольких ячеек памяти, используемых центральным процессором для различных целей.
Required word. Слово из обязательного списка.
Слово Форта, которое должно присутствовать в стандартах Форт-79, или в Форт-83, или в обоих. Обязательные слова образуют ядро стандартной системы форта и должны использоваться в описании всех слов, которые можно назвать "стандартными". То же самое, что и стандартное слово. Противостоит словам из контролируемого списка; словам из неконтролируемого списка; расширяющему набору слов.
Return stack. Стек возвратов. LIFO-стек Форта, который используется для хранения адресов слов, ожидающих завершения исполнения, и извлечения их в процессе исполнения Форт-программы. Стек возвратов обычно скрыт от программиста, но он может быть использован для временного хранения данных с помощью слов >R, R@ и R>. Стек возвратов используется также обычно для хранения индекса и предела в do-loop.
Reverse Polish notation. Инверсная польская нотация. Синоним постфиксной нотации. Названа в честь Яна Лукашевича, польского математика. Противостоит алгебраической нотации; инфиксной нотации; префиксной нотации.
Run-time code. Исполнительная программа. Машинная программа, на которую указывает адрес, содержащийся в поле программы слова Форта. Исполнительная программа определяет, как будет исполняться слово Форта. Каждое слово-описатель (такое как ;, CONSTANT и VARIABLE) кладет адрес исполнительной программы, специфической для этого слова-описателя,-во все производные слова. Исполнительная программа примитива - это машинная программа, лежащая в его поле параметров.
Scaling. Масштабирование. Процесс преобразования одного числа в другое с использованием фиксированного коэффициента (масштабного коэффициента). Обычно это делается для того, чтобы не потерять точность или не допустить переполнения. Преобразование 12.34 в целое 1234 является примером масштабирования также преобразования миль в футы. Масштабирование особенно важно, когда используются целые числа, представляющие величины, обычно характеризуемые числами с плавающей запятой. Выбор правильного коэффициента крайне важен для того, чтобы не потерять точность при арифметических расчетах.
См. также масштабный коэффициент.
Scaling operator. Масштабный оператор. Одно из слов Форта, таких как */ и */MOD, которые используются для масштабирования чисел. Масштабные операторы Форта, чтобы сохранить точность, используют для промежуточных результатов числа двойной длины.
Screen. Экран. Наиболее распространенный, в том числе и в этой книге, синоним выражения "блок Форта, который может быть отображен на терминале", хотя значение и несколько варьируется. Чаще всего используется в отношении исходного текста программы. Также, конечно, дисплей видеотерминала.
Search path. Путь поиска. Последовательность, в соответствии с которой производится просмотр одного или нескольких контекстных словарей. Метод просмотра варьируется от версии к версии очень широко.
Shadow block. Теневой блок. Блок комментариев и пояснений, который составляет пару с блоком, где размещен текст исходной программы.
Signed number. Число со знаком. Целое число, в котором старший бит определяет его знак. Число представляется в виде дополнения по модулю два. Если старший бит равен 1, число отрицательно.
Single-length number. Число одинарной длины. 16- битовое число со знаком или без. См. также 16-битовое число.
Smudge bit. Бит-метка. Во многих версиях Форта этот бит определяет, может ли быть данное число найдено в словаре. Бит-метка используется, чтобы предотвратить обнаружение в словаре слов, которые не скомпилированы должным образом, хотя это и плохая практика, так как приводит к тому, что ошибки занимают место в памяти.
Source code. Исходный текст программы. В любом языке ЭВМ - это исходный текст программы, который последовательно транслируется в форму (машинного, объектного кода), которая может быть непосредственно исполнена ЭВМ. Исходный текст Форта состоит из описаний слов, которые обычно записаны в блоках или экранах. См. также язык высокого уровня; язык низкого уровня; ассемблер; машинная программа, объектный код.
Stack. Стек. Последовательность ячеек памяти, используемая для временного хранения чисел.
LIFO-стек (так как это сделано в Форте) определяет последовательность, в которой одни команды заносят числа в отек, а другие извлекают их из стека. Стек управляется указателем стека, который указывает на верх стека. При записи и извлечении чисел указатель изменяется таким образом, что он указывает на число, которое доступно в данный момент. Стек является очень эффективным способом запоминания и извлечения обрабатываемой информации. Стек параметров (данных) используется для пересылки чисел между словами. В форте имеется множество слов для манипулирования последовательностями чисел в стеке параметров. Отдельный стек (возвратов) контролирует исполнение слов и, как правило, циклов do-loop, хотя он может хранить и ограниченное число кодов. Центральный процессор также использует стек параметров как временную память при выполнении машинных программ. См. также LIFO-стек; стек параметров; стек возвратов.
Stack chart. Отображение стека. В Форте принято отображать содержимое стека параметров до начала и после завершения исполнения слова Форта. Изменение в содержимое стека, вносимое словом, отображается слева направо, самое правое число лежит на верху стека. Исполнение слова отмечается "-" или "->". Пример отображения стека для слова SWAP: (n1 n2 - n2 n1) или ( n1 n2 -> n2 n1)
Slack-manipulation word. Слово, манипулирующее стеком. Слово Форта, которое изменяет порядок кодов или их число в стеке. Примерами слов, манипулирующих стеком, являются DROP, DUP, SWAP, OVER. ROT, PICK и ROLL.
Standard word. Стандартное слово. Синоним выражения "слово из обязательного списка" (в стандартах Форта).
State-smart word. Слово, зависящее от STATE. Слово Форта, работающее по разному в зависимости от значения STATE, которое определяет, находится ли Форт в режиме исполнения или компиляции. Примерами таких слов в Форт-79 являются ." и '. В Форт-83 отсутствуют слова из обязательного списка, зависящие от STATE.
String. Строка. Последовательность алфавитно-цифровых символов.
Строки используются для записи ASCII-текстов, См. также: счетная строка; сепаратор; ASCII.
Structured programming. Структурное программирование. Философия программирования, при которой каждая последовательность команд в программе представляет собой модуль только с одной точкой входа и выхода и которая по завершении возвращает управление в точку, откуда произошел вызов. Программы должны писаться для того, чтобы они были исполнены, с единственным исключением, когда условный оператор может выбрать один из альтернативных маршрутов исполнения, условие может определить и время завершения цикла. Структурное программирование препятствует созданию текстов про грамм, которые трудно понять, модифицировать и исправлять. Форт сам обеспечивает структурное программирование, но без ограничений, присущих многим другим языкам, таким как Паскаль.
Stub. Подставка. Слово-подставка, описанное в Форте, не используется в окончательной версии программы, но оно определяется временно для того, чтобы проверить функции, которые могут использоваться в главной программе.
Target compilation. Целевая компиляция. В Форте - процесс компиляции элементов словаря в область памяти, не совпадающую с верхом словаря. Целевая компиляция может использоваться для создания полной системы Форта, которая будет работать в произвольной области памяти или которая может быть перенесена в другую ЭВМ. Часто используется синоним "метакомпилятор". См. также кросскомпилятор; метакомпилятор.
Text-input buffer. Текстовый входной буфер. Область памяти в системе Форта, которая зарезервирована для приема информации от клавиатуры. См. также буфер; входной поток.
Text interpreter. Текстовый интерпретатор. Синоним внешнего интерпретатора.
Thread. Цепочка, В Форте - последовательность слов и машинных программ-примитивов, которые исполняются, когда исполняется слово из входного потока. Иногда используется в смысле последовательности слов, просматриваемых при поиске в словаре.
Threaded interpretive language.
Цепной интерпретивный язык. Цепной интерпретивный язык подобен обычному интерпретивному языку, в котором исходная программа может быть исполнена без формирования объектного модуля или программы, обеспечивающей оперативное и удобное взаимодействие между оператором и ЭВМ. Но в отличие от других интерпретивных языков группы имеющихся коротких машинных программ сцепляются вместе, чтобы обеспечить последовательность выполнения, что много быстрее, чем способы, используемые в большинстве интерпретивных языков. В Форте это делается, когда слово или последовательность слов выполняется с пульта или другого входного устройства с последующим исполнением машинных программ, специфицированных при описании этих слов. Но в отличие от других интерпретивных языков эти цепочки описаны в процессе написания программы, т.е.. когда слово Форта описано, оно компилирует машинные программы, подлежащие исполнению, задавая тем самым цепочку выполнения данного слова. Программы на цепном интерпретивном языке исполняются фактически так же быстро, как откомпилированные программы, и обычно требуют меньше памяти, Форт - наиболее популярный цепной интерпретивный язык. См. также компиляция; цепочка.
Token. Лексема. В Форте группа символов, которая выделена из входного потока внешним интерпретатором, и интерпретируемая как число или имя слова. См. также разбор.
Translation table. Таблица преобразования. Линейный массив, используемый для преобразования одного числа в другое. Обычно число - это индекс массива, который при обращении заменяется элементом массива. Примером могла бы служить таблица преобразования ASCII-символов в другие коды.
True (flag). Истинно (флаг). Число, полученное в результате проверки условия. В Форт-79 истинно соответствует 1, а в Форт-83 - -1 (все 16 битов равны 1). См. также булев флаг; флаг ложно.
Tuos-complement notation. Представление в виде дополнения по модулю два. Метод представления отрицательных чисел путем взятия дополнения по модулю 1 от их абсолютной величины и добавления к нему 1.
Это дает тот же результат, что и вычитание абсолютной величины из нуля. Дополнение по модулю два упрощает некоторые арифметические операции в двоичной арифметике. См. также дополнение по модулю один; числа со знаком.
Uncontrolled reference word. Слово из неконтролируемого списка. Слово, специфицированное в стандарте Форт-83, которое имеет уже определенную функцию в других версиях. Изменение функции не рекомендуется, но не запрещается. См. также слово из обязательного списка; слово из контролируемого списка.
Unsigned number. Число без знака. Число, где все биты используются для кодировки двоичного кода. Противоположно числу со знаком, где старший бит равен 1, если число отрицательно. См. также дополнение по модулю 2.
User stack. Стек пользователя. Синоним стека параметров.
User variable. Переменная пользователя. Форт-переменная, которая является частью базовой Форт-системы. Хотя она используется подобно остальным переменным, она отличается от них способом запоминания. В описании такой переменной хранится не ее величина, а указание на адрес. Переменные пользователя в многопользовательских версиях при идентичных именах имеют разные значения для разных пользователей. Примерами таких слов являются BASE, STATE, CURRENT и CONTEXT.
Vector. Вектор. Синоним линейного или одномерного массива.
Vectored execution. Векторное исполнение. Если вектор (линейный массив) содержит список адресов полей программы слов, тогда эти слова могут быть исполнены путем занесения соответствующего элемента массива в стек и использования EXECUTE. В Форте этот термин относится также к возможности изменить работу слова путем изменения содержимого первого элемента поля параметров, заменяя его на CFA нового слова. Так, если EMIT описан как : EMIT ; и существует другое слово , тогда EMIT можно заставить выполнять другую функцию, выполнив FIND ' EMIT ! в Форт-79 или ' ' EMIT >BODY ! в Форт-83.
Virtual memory. Виртуальная память. Массовая память (обычно диск), которая с помощью некоторой схемы может быть переведена в состояние, когда она может рассматриваться как часть основной памяти.
Техника перемещения блоков в буфер и обратно и последующая адресация к буферам являются простой формой виртуальной памяти в Форте. См. также дисковый кэш.
Vocabulary. Контекстный словарь. Связанный список - из словаря Форта. Контекстные словари используются для управления порядком поиска слов Форта внешним интерпретатором. Применение различных контекстных словарей позволяет использовать одно и то же имя в различных контекстах без конфликта.
Word (Forth usage). Слово (использование в Форте). Фундаментальный элемент программирования в форте и статья в словаре. Слово Форта обычно содержит имя, связь с другим словом в словаре, указатель машинной программы, которая определяет, как будет выполняться слово, и один или более параметров (чисел, машинную программу, или список адресов других Форт-слов). Слова Форта вызываются по имени и аналогичны подпрограммам в других языках. Форт-программирование состоит в описании новых слов через ранее описанные или с помощью машинных программ. Это определение слова отличается терминологически от того, что принято в вычислительной технике, где слова - это последовательность битов, минимальное число битов в памяти, к которому возможна адресация со стороны центрального процессора. См. также.словарь; поле имени; поле связи; поле программы; поле параметров; длина слова.
Word length. Длина слова. В вычислительной технике минимальное число битов, к которому может непосредственно обращаться центральный процессор. Длина слова для большинства микропроцессоров равна 8-битовому байту, хотя используются и 16- битовые слова; длина слова в базовой ЭВМ может быть равна 64 битам и более. Противостоит значению слова Форта.
Д. Ответы к упражнениям
Блок 0 [0:0] ( Глава 1. Упражнения 1. 01 из 02 ) ( 1. ) ( а. 10 б. 0 в. 6 г. 1 д. 4 ) ( 2. ) ( а. 1 2 * b. 1 2 * 2 / в. 2 3 / 1 + г. 1 2 + 3 / д. 3 2 1 + / е. 3 4 + 2 1 + / ) ( 3. ) : POWER4 ( n -- ) DUP CUBE * ; ( 4, ) : NEWPOWER4 ( n -- ) SQUARE SQUARE ; ( 5. ) : PYTHAGORUS ( n1 n2 -- ) SQUARE SWAP SQUARE * :
Блок 1 [1:0] ( Глава 1. Упражнения 1. 02 из 02 ) ( 6. ) ( AREA ( радиус -- ) SQUARE 314 * ; ( 7. ) : VOLUME ( длина радиус -- ) AREA * ; : XVOLUME ( радиус длина -- ) SWAP AREA * ; ( Второе описание менее эффективно из-эа лишнего SWAP . )
Блок 2 [2:0] ( Глава 1. Упражнения 2. 01 из 02 ) ( 1. ) ( Главное преимущество диска заключается в уменьшении вероятности потери программы и в простоте ее изменения.) ( 2. ) : .X ." -" ; ( .X может быть изменено для отображения любого символа. ) ( 3. ) : LIMITBAR ( n --) DUP 40 > IF DROP 40 THEN BAR ; ( Для использования с 80-символьным экраном: ) ( : LIMITBAR ( n -- ) DUP 80 > IF DROP 80 THEN BAR ; ) ( Аналогичным образом можно приспособиться к экрану любой ширины ) ( 4. ) : LIMITBAR1 ( n --) 100 / DUP 64 > IF DROP 64 THEN BAR ; (5. ) : LIMITBAR2 ( в.- ) 10000 / 64 * DUP 64 > IF DROP 64 THEN BAR ;
Блок 3 [3 :0] ( Глава 1. Упражнения 2. 02 из 02 ) ( 6. ) : GRAPH ( n1 т2 n3 ... -- или n1 n2 n3 ) CR DEPTH DUP 16 < IF DO LIMITBAR LOOP THEN ; ( Заметии, что исходное число может остаться в стеке.) ( 7.) : BAR ( n --) DUP 0 DO .X LOOP . СR ; ( DUP позволяет использовать вернее число как LIMlTBAR, так и . ) : LIMITBAR3 ( n -- ) DUP 50 > IF DROP 50 THEN BAR ;
Блок 4 [4 :0] ( Глава 2, Упражнения 1. 01 из 04 ] . ( 1. ) ( а. 5 5 + 5 + . Ответ: 15 б. 5 5 * 5 * 5 * . 625 в. 5 5 + 5 * . , 50 г. 5 5 + 5 / . 2 д. 5 5 + 2 / . 5 е. 10 5 5 + / . 1 ж. 5 4 + 5 5 + / . 0 з. 5 5 * 5 4 * 4 4 * + . 61 и. 5 4 + 5 4 + * . 81 к. 5 4 + 5 4 + * . 81
Блок 5 [5 :0] Глава 2. Упражнения 1. 02 из 04 ) ( 2.) а. 5 5 5 + + . Ответ: 15 б. 5 5 5 5 * * * . 625 в. 5 5 5 + * . 50 г. Это нельзя изменить. д. и это нет. е. Это тоже нельзя.
ж. И это не может быть изменено з. 5 5 * 5 4 * 4 4 * + + . 61 и. Т эти два также нельзя к. изменить. )
Блок 6 [6 :0] ( Глава 2. Упражнения 1. 03 из 04 ) ( 3. ) ( Сначала сложим 3 и 5, умножим на 2, разделим на 4 и добавим 16. Постфиксная запись: 3 5 + 2 * 4 / 16 + ( дает 20). ( Заметим, что если есть выбор, то, чтобы не было ошибки округления, умножение должно всегда предшествовать делению. Например: 7 100 * 6 / выдает 116 в то время как 7 6 / 100 * выдает 100 )
( 4. ) ( 9 3 + 5 * 6 / 2 + 32 + . Ответ: 44 5 6 * 3 * 3 * 2 * 32 * . 6336 5 4 + 22 * 5 10 * 2 + + 2 * . 500 )
Блок 7 [7 :0] ( Глава 2. Упражнения 1. 04 из 04 ) ( 5. ) ( a. 5 DUP DUP + + . Ответ: 15 б. 5 DUP DUP DUP * * * . 625 в. 5 DUP DUP + * . 50 г. 5 DUP + 5 / . 2 д. 5 DUP + 2 / . 5 е. 10 5 DUP + / . 1 ж. 5 4 + 5 DUP + / . 0 з. 5 DUP * 5 4 * + 4 * DUP * + . 61 и. 5 4 + DUP * . 81 к. 5 4 + DUP * . 81 )
Блок 8 [8 :0] ( Глава 2. Упражнения 2. 01 из 04 ) ( 1. ) a. SWAP б. DUP в. OVER г. OVER SWAP д. DUP ВОТ е. ROT ж. SWAP з. SWAP ROT и. ROT SWAP к. ROT ROT л. OVER SWAP м. 3 PICK ROT ROT [FORTH-79] 2 PICK ROT ROT [FORTH-83] н. OVER SWAP DUP o. 3 PICK ROT ROT OVER SWAP DUP [79] 2 PICK ROT ROT OVER SWAP DUP [83])
Блок 9 [9 :0] ( Глава 2. Упражнения 2. 02 из 04 ) ( 2.) а. * б. DUP + + в. SWAP DUP + + г. - д. DUP DUP * * SWAP DUP * * f. OVER + * e. + DUP * факториэуем [a + b] [а + b] ж. ROT ROT + SWAP / з. OVER + ROT ROT + SWAP / и. SWAP OVER + ROT ROT + SWAP / к. DUP + ROT ROT + SWAP / л. ROT ROT + SWAP DUP + / м. OVER SWAP - ROT ROT SWAP - * н. + + * факторизируем a [b + с + d ] o. * 1 + * * факторизуем a b [1 + c d]
Блок 10 [10 :0] ( Глава 2. Упражнения 2. 03 из 04 ) ( З. ) : OVER ( n1 n2 -- n1 n2 n1 ) SWAP DUP ROT ROT ; ( 4. ) : 2DUP ( n1 n2 -- n1 n2 n1 n2) OVER OVER ; ( 5. ) : NEWDUP83 ( n -- n n ) 0 PICK ; ( FORTH-83 ) : NEWDUP79 ( n -- n n ) 1 PICK ; ( FORTH-79 ) : NEWOVER83 ( n1 n2 -- n1 n2 n1 ) 1 PICK : ( F-83 ) : NEWOVER79 ( n1 n2 -- n1 n2 n1 ) 2 PICK ; ( F-79 ) ( 6. ) : NEWROT83 ( n1 n2 n3 -- n2 n3 n1 ) 2 ROLL ; ( F-83 ) : NEWROT79 ( nl n2 n3 -- n2 n3 n1 ) 3 ROLL ; ( F-79 )
Блок 11 [11 :0] ( Глава 2. Упрахнеиия 2. 03 из 04 ) ( 7. ) : 2SWAP83 ( 1 2 3 4 - 3 4 2 1 ) 3 ROLL 3 ROLL ; [ 83 ] : 2SWAP79 ( 1 2 3 4 - 3 4 2 1 ) 4 ROLL 4 KOLL ; [ 79 ] ( 8. ) : ROTSTACK83 DEPTH 1 - ROLL ; ( FORTH-83 ) : ROTSTACK79 DEPTH ROLL ; ( FORTH-79 ) ( 9. ) : SPHERE ( радиус -- 100*v ) DUP DUP * * 314 ( 10. ) * 4 * 3 / ; : .ВОTТОМ*83 DEPTH 1 - PICK DEPTH 1 - PICK * . ; [83] : .BOTTOM*79 DEPTH PICK DEPTH PICK * . ; [79] ( 11. ) : NEWMOD ( n1 -- n2 ) OVER OVBB / * - ;
Блок 12 [12 :0] ( Глава 3. Упражнения 1. 01 из 02 ) ( 1. ) ( Двоичная часть результата имеет вид: 1 дает 1 3 дает 11 7 дает 111 15 дает 1111 31 дает 11111 63 дает 111111 127 дает 1111111 255 дает 11111111 Число, которое на единицу меньше чем два в степени n, состоит из последовательности n бит, равных единице. ) ( 2. ) Шестнадцатеричная часть результата имеет вид: 2 дает 2 4 дает 4 8 дает 8 16 дает 10 32 дает 20 64 дает 40 128 дает 80 256 дает 100 ) Шестнадцатеричное число отображает содержимое 1 байта. )
Блох 13 [13 :0] ( Глава 3. Упражнения 1. 02 из 02 ) ( 3. ) ( Ответ неизбежно будет сведен к 2., так как 11111111 равно ff в шестнадпатеричном представлении, а 1111111111111111 равно FFFF ) ( 4. ) ( Вам следует ввести FFFF 1 + . , и, если вы это сделали, то получите результат =0. Легче запоминать и задавать числа а шестнадцатеричном представлении, результат, требующий для представления более двух байт, дает ошибку переполнения и засылает в стек два 0 байта.) ( 5. ) ( Прежде чем использовать описание ) DECIMAL : HЕХ 16 BASE ! ; : OCTAL 8 BASE ! ; : BINARY 2 BASE ! ; ( 6. ) ( Taкие слова как AA, BAC и т.д. помешают использовать соответствующие шестнадцатеркчные числа, если в их начале не стоит 0. GG не шестнадцатеричное число )
Блок 14 [14 :0] ( Глава 3. Упражнения 1. 01 из 02 ) ( 1. ) а. 11110111 AND б. 100 OR в. 0 AND г. 11111111 OR д. 10100000 AND e. 1111 AND ж. 10101111 XOR з. 11111111 XOR и. 11111111 XOR ) ( 2. ) : ZERO-IT ( n -- 0 ) 0 AND ; ( 3. ) : NEW= ( n1 n2 -- f ) XOR DUP / 1 XOR ; (4. ) : <> ( n1 n2 -- f ) XOR DUP / ; ( Выше приведено быстродействующее описание. ) ( Другой вариант: : <> ( n1 n2 -- f ) = 0 = ; )
Блок 15 [15 :0] ( Глава 3. Упражнения 2. 02 из 02 ) ( 5. ) : NOT1 ( n1 -- n2 ) 65535 XOR ; : NOT2 ( n1 -- n2 ) 65535 - ; ( 6.) : SET? ( n1 маска -- f) DUP ROT AND = ; ( 7. ) : NOTSET? ( n1 маска -- f) DUP ROT AND = 0 = ; ( или )
Блок 16 [16 :0] ( Глава 3. Упражнения 3. 01 из 02 ) ( 1. ) : .DEC.BIN ( n -- ) DECIMAL DUP . DUP U. ( 2.) .BIN U.BIN DROP ; ( Таблица должна иметь следующий вид ) ( 1 1 1 1 2 2 10 10 3 3 11 11 32766 32766 111111111111110 111111111111110 32767 32767 111111111111111 111111111111111 -32768 32768 -1000000000000000 1000000000000000 -32767 32769 -1111111111111111 1000000000000001 -3 65533 -11 1111111111111101 -2 65534 -10 1111111111111110 -1 65535 -1 1111111111111111
Бпок 17 [17 :0] ( Глава З. Упражнения 3. 02 из 02 ) ( 3.) ( 65536 + n ) ( 4.) : NEWNEGATE ( n -- -n ) 65535 XOR 1 + ; : NEWNEGATE -1 XOR 1 + ; является эхвквалентным ) ( 65535 XOR выдает то. что называется дополнением по модулю 1; добавление 1 превращает его в дополнение по модулю 2, которое меняет знак. ) ( 5. ) : NEW- ( n1 n2 -- n3 ) NEGATE + ; ( Так в действительности выполняется вычитание в ЭВМ; то есть добавляется дополненме по модулю два. )
Блок 18 [18 :0] ( Глава 3. Упражнения 4. 01 из 02 ) ( 1. ) : .LSB ( n --) 255 AND . ; ( 255 в двоичном виде равно 11111111 ) ( 2.) : MSB ( n -- ) 256 / . ; ( Это не работает для отрицательных чисел, так как отрицательное делимое даст отрицательное частное. ) ( 3.) : .LSB1 ( n -- ) 256 / 256 * - ; ( 4.) : .LSB2 ( n -- ) PAD 1 PAD C@ . ; : .MSB2 ( n -- ) PAD 1 PAD 1+ С@ . ; ( Описания в упражнениях 1 и 2 будут быстрее. ) ( 5.) : 256/ ( n1 -- n2 ) PAD 1+ С@ ; ( В отличие от 256 / это игнорирует знак числа.)
Блок 19 [19 :0] ( Глава 3. Упражнения 4. 02 из 02 ) ( 6.) : 256+ PAD ! PAD 1 + С@ 1 + PAD 1 + C! PAD @ ;
Блок 20 [20 :0] ( Глава 4. Упражнения 1. 01 из 02 ) ( 1. ) ( "Нормал." С округлением по нижн. границе) ( ост част ост част) а. 0 5 0 5 б. 0 0 0 0 в. 2 3 2 3 г. -2 -3 1 -4 д. 2 -3 -1 -4 е. -2 3 -2 3 ж. 0 -5 0 -5 з. 0 -5 0 -5 и. 0 5 0 5 к.
Деление на 0 является ошибкой ) Блок 21 [21 :0] ( Глава 4. Упражнение 1. 02 из 02 ) (2.) : LINE ( N -- строка ) 50 / ; (3.) : POS ( -- pos ) 50 MOD ; ( 4.) : POSLINE ( N длина -- роs строка ) /MOD ; ( 5.) : NEW/ ( n1 n2 -- n3) /MOD SWAP IF DUP 0 < IF 1+ THEN THEN ; : NEWMOD ( n1 n2 -- n3 ) 2DUP N/ * - ; ( 6.) ( 2000 100 30 */ . дает 6666 2000 30 /MOD 100 * SWAP 100 * 30 / + . . также дает 6666 2000 100 30 */MOD . . дает 6666 20 2000 30 /MOD 100 * SWAP 100 * 30 /MOD RОТ + . . дает 6666 20 Преимущество */ очевидно, тах как оно не дает переполнения)
Блок 22 [22 :0] ( Глава 4. Упражнения 2. 02 из 02 ) : .LARGEST-3 ( n1 n2 n3 -- ) MAX MAX . ; ( 2.) : 79.SMALLEST-3 ( n1 n2 n3 -- n1 n2 n3 ) 3 PICK 3 PICK 3 PICK MIN MIN ; ( FORTH-79 ) : 83.SMALLEST-3 ( n1 n2 n3 -- nl n2 n3 ) 2 PICK 2 PICK 2 PICK MIN MIN ; ( FORTH-83 ) ( 3. ) : TREE>5? ( n1 n2 n3 -- f ) 5 > MAX MAX 5 > ; ( 4. ) : ALL>5? ( n1 n2 n3 -- f ) 5 > MIN MIN 5 > ; ( 5.) : >LOWER2? ( n1 n2 n3 -- f ) ROT ROT MAX > ; ( 6.) : TEMPDIFF ( n1 n2 n3 ) - ABS ;
Блок 23 [23 :0] ( Глава 4. Упражнения 2. 02 из 02 ) ( 7. ) : LARCER-MAG ( n1 n2 -- n3 ) ABS SWAP ABS MAX ; ( 8. ) : NEAREST-0 ( n1 n2 -- n3 ) ABS SWP ABS MIN ; ( 9 ) : -ABS ( n -- -n или -n -- -n ) ABS NEGATE ; ( 10. ) : OTHER-QUAD ( x y -- -x -y и т.д.) NEGATE SWAP NEGATE SWAP ; ( 11. ) ; NEWNEGATE -1 * ;
Блок 24 [24:0] (Глава 4. Упражнения 3. 01 из 02 ( 1. ) : PYRVOL ( область h -- v) * 2 /MOD + ; ( 2. ) : F->C ( f -> c ) 32 - 5 9 */MOD SWAP 10 9 */ 5 + 10 / + ; ( SWAP 10 9 */ 5 t 10 / по существу округляет в большую сторону, добавляя к числу 0.5 . ) : 10F->10C (10f -- 10с ) 320 - 9 5 */MOD SWAP 100 90 */ 50 + 100 / + ; ( Вводите значение температуры, умноженое на 10, в результате получается та же, но округленная величина. Это способ работает с десятыми долями целого числа. )
Блок 25 [25 :0] ( Глава 4. Упражнения 3. 02 из 02 ) ( 3.) ( а. факторизируем [а + в]/c ) : (a.+.b)./.c ( a b c -- n) ROT ROT + SWAP / ; ( б. факторизируем [a + b/c]/c ) : (a.+.b./.c.)./.c ( а b с -- n) SWAP ОVER / ROT + SWAP / ; ( в.
факторизируем [a + b]^2 ) : (A.+.B)^2 ( а b -- n ) + DUP * ; ( г. факторизируем 3[а + b]^2 : 3.(A.+.B)^2 ( a b -- n ) (A.+.B)^2 3 * ; ( д. факторизируем [a + b]^4 ) : (a.+.b)^4 ( a b -- n) (A.+.B)^2 DUP * ; ( Оказывается даже сложные выражения могут стать простыми за счет факторизации)
Блок 26 [26 :0] ( Глава 4. Упражнения 4. 01 из 03 ) ( 1. ) ( а. 25E15 б. 25E-5 в. 25E5 г. 25E-6 д. 1Е-5 е. 1 ж. 25E2 з. 500.005 и. 499.998 к. 499.995 ) ( 2. ) : EXP* ( m1 e1 m2 e2 -- m3 e3 ) ROT + ROT ROT * SWAP ; ( 3. ) ( Здесь не принято никаких мер против переполнения : : EXP/ ( m е m е -- m е) ROT SWAP - 2 - ROT 100 * / SWAP ; ( Мантисса - 2 и показатель * 100 способствуют ( 4. ) ( предотвращению переполнения ) : TOM ( km m - m ) SWAP 1000 * + ; ( 5. ) : TOCMMM ( mm -- m mm ) 10 /MOD SWAP ;
Блок 27 [27 :0] ( Глава 4. Упражнения 4. 02 из 03 ) ( 6. ) : TOKM ( m -- km m ) 1000 /MOD SWAP ; ( 7. ) : TOFT ( mi ft - ft ) ROT 5280 * + ; ( 8. ) : TOMILES ( ft - mi ft ) 5280 /MOD SWAP ; ( 9. ) : FTTOM ( ft -- m) 305 1000 */ ; ( 10. ) : ТОMЕТRIС ( mi ft -- km cm ) TOFT FTTOM TOKM ; ( 11. ) : C->F ( c -- f ) 9 5 */ 320 + ;
Блок 28 [28 :0] ( Глава 4. Упражнения 4. 03 из 03 ) ( 12. ) : CIRCUM ( -- длина окружности в мм ) 10000 355 113 */ 3 8 */ ; ( Проблема заключается в подавлении переполнения) ( 13. ) : IN->FT ( in -- ft ) 12 /MOD SWAP 6 / + ; ( 6 / + эквивалентно добавлению 2/12 остатка. )
Блок 29 [29 :0] ( Глава 4. Упражнения 5. 01 из 13 ) ( 1.) 4.294.967.296 равно 2 в 32-ой степени. ) ( 2. ) ( 2DROP [ d -- ] 2DUP [ d -- d d ] 2SWAP [ d1 d2 -- d2 d1 ] 2OVER [ d1 d2 -- d1 d2 d1 ] 2ROT [ d1 d2 d3 -- d2 d3 d1 ] Не существует стандартных слов-эквивалентов PICK, ROLL или DEPTH для чисел двойной длины ) ( 3.) : NEW2DROP ( d -- ) DROP DROP ; ( 4. ) ( Это не то же самое. Число двойной длины содержит старшее и младшее числа, каждое из которых должно быть задублировано. )
Блок 30 [30 :0] ( Глава 4. Упражнения 5. 02 из 03 ) ( 5. ) : NEW2DUP ( d -- d d ) OVER OVER ; ( 6. ) 2SWAP83 ( d1 d2 -- d2 d1 ) 3 ROLL 3 ROLL ; ( F-83) 2SWAP79 ( d1 d2 -- d2 d1 ) 4 ROLL 4 ROLL ; ( F-79) ( 7. ) 2ROT83 ( d1 d2 d3 -- d2 d3 d1 ) 5 ROLL 5 ROLL ; ( F-83) 2ROT7( ( d1 d2 d3 -- d2 d3 d1 ) 6 ROLL 6 ROLL ; ( F-79) ( 8. ) 2OVER83 ( d1 d2 -- d1 d2 d1 ) 3 PICK 3 PICK ; ( F-83) 2OVER79 ( d1 d2 -- d1 d2 d1 ) 4 PICK 4 PICK ; ( F-79) ( 9. ) 2ROLL83 2 * DUP ROLL SWAP 1- ROLL ; ( FORTH-83) 2ROLL79 2 * DUP 1+ ROLL SWAP ROLL ; ( FORTH-79)
Блок 31 [31 :0] ( Глава 4. Упражнения 5. 03 из 03 ) ( 10. ) : 2PICK83 2 * DUP PICK SWAP 1- PICK ; ( FORTH-83 ) : 2PICK79 2 * DUP 1+ PICK SWAP PICK ; ( FORTH-79 ) ( 11. ) : S->D ( n -- d ) HI# ; ( 12. ) ( HI# будет содержать 0. ) ( 13. ) : 10^N 1 SWAP 0 DO 10 * LOOP : : BEF. #PT 1- 10^N 0 D/ ; : AFT. 2DUP ВЕF. #PT 1- 10^N 0 D* D- ; ( Таким образом можно разделить целую и дробную части числа двойной длины. )
Блок 32 [32 :0] ( Глава 4. Упражнения 6. 01 из 02 ) ( 1. ) ( 1 UM* выполнит это. Используются числа без знака. ) ( 2. ) : M* ( n n -- d ) 0 ROT 0 D* ; : М+ ( d n -- d ) 0 D+ ; : М- ( d n -- d ) 0 D- ; : М/ ( d n -- d ) 0 D/ DROP ; : M/MOD ( d n -- n n ) 0 D/MOD DROP SWAP DROP ; ( 3. ) ( Как M* так и М/МОD воспринимают числа со знаком, в то время как U* и U/MOD работают с числами без знака.)
Блок 33 [33 :0] ( Глава 4. Улражнения 6. 02 из 02 ) ( 4. ) : ->DOLLARS1 ( d -- n) 100 M/ ; ( MMSFORTH ) : ->DOLLARS2 ( d -- n) 100 0 D/ DROP ; ( Стандарт ) : ->CENTS1 ( d -- n) 2DUP ->DOLLARS1 100 * М- DROP ; ( MMSFORTH ) : -> CENTS2 ( d -- n) 2DUP ->DOLLARS2 100 * 0 D- DROP ; ( Стандарт ) ( 5. ) : FRAC1 2SWAP ROT 0 D/ ROT 0 D* ; ( Стандарт ) : FRAC2 M*/ ; ( MMSFORTH )
Блок 34 [34: 0] ( Глава 4. Упражнения 7. 01 из 01 ) ( 1.) ( а. % 5.5 % 1200 F+ F. б. % 23 % 5 F/ LOG F. в. DEGREES % 55 SIN 2DUP F* % 45 COS 2DUP F* F+ F. г. % 1- SQR F. д. % 3.25 2DUP F* PI F* F. ) ( 2. ) : RECT ( n1 n2 -- ) I-F FDF 5 ROLL I-F FDF DF* DF. ; ( 3.) : NEWFABS ( f1 -- f2 ) 2DUP F* SQR ; ( 4.) : HYPOT ( f1 f2 -- f3 ) 2DUP F* 2SWAP 2DUP F* F+ SQR ; ( 5. ) : TABLE1 0 46 DO I 3 .R ( приращение равно 1 градусу) I I-F SIN 10 F.R I I-F TAN 10 F.R CR ; : TABLE2 0 451 DO I I-F % 10 F/ 2DUP 6 F.R 2DUP SIN 10 F.R TAN 10 F.R CR LOOP ; ( приращение равно одной десятой )
Блок 35 [35 :0] ( Глава 4. Упражнения 6. 01 из 03 ) ( 1. ) а. 5 8 + % 5.5 % 6.5 F+ б. % 35 10 >87 F+ SIN в. % -55 FNEGATE ) ( 2. ) ( г. 5 . % 35 2DUP COS 2SWAP SIN F+ F. ) : 87FABS ( f1 -- f2 ) FDUP F* SQR ; : 87CINT ( f1 -- f2 ) 87> ; : 87I-F ( n -- f ) >87 ; : 87RAD PI % 180 F/ ; : 87L10 % 10 LOG ; ( 3. ) : FACT 1001 2 % 1 DO I >87 F* LOOP F. ; ( Выдает реэултт .4023872600770938Е2568; 100 итераций требует 10.1 секунд.
Выполнение цикла требует 7.1 секунд. Т.о. 100.000 преобразований в форму с плавающей точкой и умножений требуют 3.1 секунды. )
Блок З6 [36 :0] ( Глава 4. Упражнения 8. 02 из 03 ) ( 4. ) ( С клавиатуры % 113 % 355 F/ PI F- F. дает 2.66764E-7 или ошибку около 0.00000003 ) ( 5. ) : ANGLE ( x y -- угол ) DEGREES PHASE ; ( 6. ) : НУРОТ ( x y -- угол ) DEGREES MAG ; ( 7. ) : CONC-CHANGE ( pH H-ch -- % ) FSWAP FNEGATE 10^ F/ % 100 F* ; : DELTAPH ( рH H-ch -- pH1) ( Вычис. новое H, затем - новое pH) FSWAP FNEGATE 10^ F+ LOG10 FNEGATE ; ( Практически это нельзя сделать в рамках целочисленной арифметики, не написав программу размером в несколько блоков с таблицами логарифмов и степеней 10.)
Блок 37 [37 :0] ( Глава 4. Упражнения 8. 03 из 03 ) ( 8. ) : ARM-MOVE ( x1 y1 x2 y2 -- - приращение угла приращение радиуса ) DEGREES FOVER FOVER MAG DF87> PHASE DF87>
FOVER FOVER PHASE FROT FROT MAG DF>87 DF>87 FROT F- FROT FROT FSWAP F- FSWAP ; ( Поскольку не существует FPICK или 2FSWAP числа запоминаются в "обычном" стеке с помощью DF87> и восстанавливаются DF>87. )
Блок 38 [38 :0] ( Глава 5. Упражнения 1. 01 из 02 ) ( 1. ) : BS 8 EMIT ; ( 2. ) : РАПЕ 12 EMIT ; ( 3. ) : CRS 0 DO CR LOOP ; ( 4. ) : DASHES 0 DO 45 EMIT LOOP ; ( Это эквивалентно : DASHES 0 DO ." -" LOOP ; )
Блок 39 [39:0] ( Глава 5. Упражнения 1. 02 из 02 ) ( 5.) : MMENU ." MAIN МЕNU" ; : THIS ." This is the " ; : 1ST ." first " ; : 2ND ." second " ; : 3RD ." 3rd " ; : 4th ." FORTH " ; : СHЕ ." choice" : : MENU 9 SRACES 5 DASHES SPACE MMENU SPACE 5 DASHES 2 CRS 40 DASHES CR 4 SPACES ." A" 6 DASHES SPACE THIS 1ST СНЕ CR 4 SRACES ." В" 5 DASHES SPACE THIS 2ND СНЕ CR 4 SRACES ." С" 8 DASHES SPACE THIS 3RD СНЕ CR 4 SRACES ." D" 6 DASHES SPACE THIS 4TH СНЕ CR 40 DASHES CR 5 DASHES SPACE ." WHAT IS YOUR CHOICE, PLEASE?" SPACE 5 DASHES CR ; ( 6. ) : $. COUNT TYPE :
Блок 40 [40 :0] ( Глава 5.
Упражнения 2. 01 из 03 ) ( 1.) : PLOT1 CR DEPTH 0 DO MIN XS CR LOOP ; ( Заметьте, насколько элегантнее MIN, чем IF ... THEN. как это сделано в главе 1. ) ( 2.) : РLOТ2 РRINT CR DEPTH 0 DO 79 MIN XS CR LOOP CRT ; ( 3. ) : YS 0 DO 89 EMIT LOOP ; : PLOT3 CR DEPTH 2/ 0 DO YS CR XS CR LOOP ; ( 4. ) : PLOT4 CR DEPTH 0 DO I . 3 SPACES XS CR LOOP ; ( 5. ) : PLOT5 CR DEPTH 0 DO I . 3 SPACES 1- SPACES ." X" CR LOOP ; ( 1- необходима перед SPACES для того, чтобы поместить "X" в конец строки. )
Блок 41 [41 :0]. (Глава 5. Упражнения 2. 02 из 03 ) ( 6.) : PLOT6 CR DEPTH 0 DO I . SPACE 1- 75 1000 */ SPACES ." Х" CR LOOP ; ( Заметьте, что масштабирование выполнено с использованнем 75. ) ( 7.) : PLOT7 CR DEPTH 2/ 0 DO SWAP XS YS CR LOOP ; ( 8. ) : PLOT8 CR DEPTH 2/ 0 DO SWAP 1- SPACES ." X" 1- SPACES ." Y" CR LOOP ; ( 9. ) : PLOT9 СR DEPTH 2/ О DO SWAP 1- SPACES ." X" DUP 1- SPACES ." Y" . CR LOOP ; ( 10. ) : PLOT10 CR DEPTH 2/ 0 DO SWAP 1- SPACES ." X" DUP 60 1000 */ 1- SPACES ." Y" . CR LOOP ;
Блок 42 [42 :0] ( Глава 5. Упражнения 2. 03 из 03 ) ( 11.) : PLOT11 CR DEPTH 2/ 0 SWAP 0 DO OVER SWAP - 3 PICK SWAP 0 DO CB ." ." LOOP SPACES ." X" SWAP OVER . . LOOP DROP ; ( Это описание можно упростить, использовав переменную или второй стек, стек возвратов, который будет описан в следующих главах, вы можете убедиться тeпeрь, насколько проще временное запоминание чисел в PAD как в: ) : PLOT12 CR DEPTH 2/ 0 PAD ! 0 DO OVER OVER PAD @ - 0 DO CR ." ." LOOP SPACES ." X" DUP PAD I . . LOOP ; ( Хотя и не намного короче, PLOT12 имеет более простые манипуляции со стеком, так как предшествующая величина Х [или 0 в начале] записана в PAD. )
Блок 43 [43 :0] ( Глава 5. Упражнения 3. 01 из 03 ) ( 1. ) : UD$. ( ud -- ) TYPE ; ( 2. ) : UD$. ( u -- ) 0 TYPE ; ( 3. ) : S#. ( n -- ) DUP 0< NEGATE SWAP OVER DABS TYPE ; ( Здесь и в следующем упражнении NEGATE, как обсуждалось ранее, в FORTH-83 присутствовать не должен.) ( 4. ) : S$.R ( n1 n2 -- ) SWAP DUP 0< NEGATE SWAP OVER DABS ROT OVER - SPACES TYPE ; ( Длина поля n2, хранится в стеке пока это необходимо, а затем используется ROT OVER - SPACES, как в описании U.R в тексте. )
Блок 44 [44 :0] ( Глава 5. Упражнении 3. 02 из 03 ) ( 5.) : .L ( n1 n2 -- ) SWAP DUP D< NEGATE ROT OVER - ROT ROT TYPE SPACES ; ( Запомните, никакого NEGATE в FORTH-83 нет. ) ( 6. ) : .DATE ( d --) TYPE ; ( 7. ) : .MDY ( d -- ) TYPE ; ( 121, 100, и 109 являются ASCII "у", "d" и "m". )
Блок 45 [45 :0] ( Глава 5. Упражнения 3. 03 из 03 ) ( 1. ) : .PHONE ( n1 n2 n3 ---) 0 TYPE ; ( Заметьте, что можно преобразовывать несколько чисел одновременно, но DROP DROP необходимо для удаления из стека частного двойной длины, исключая n1. которое удаляется #> .) ( 9.) : Fl. ( d -- )
IF #РТ 1- 0 DO # LOOP THEN 46 HOLD #S #> TYPE ; ( Это иллюстрирует, какая программа может находиться ( между . При вводе .1234 будет отображен начальный 0.)
Блок 46 [46 :0] ( Глава 6. Упражнения 1. 01 из 04 ) ( 1.) VARIABLE FEET VARIABLE INCHES : F->I ( -- ) FЕЕТ @ 12 * INCHES ! ; ( 2.) 2VARIABLE DFEET 2VARIABLE DINCHES : DF->I DFEET 2@ 12 0 D* DINCHES 2! ; ( 0 формирует 12 число двойной длины. ) ( 3.) : NEW2! ( d адр -- ) SWAP OVER 2SWAP 2+ ! ! ; ( 2! может использоваться для запоминания двух чисел одинарной длины. n1 n2 адр 2! запоминает n1 по адресу "адр", а n2 по адресу "адр+2" .) ( 4. ) : NEW+! ( n адр - ) DUP @ RОТ + SWAP ! ; ( 5. ) : NEW@ ( адр -- n ) DUP 1+ С@ 256 * SWAP C@ + ;
Блок 47 [47 :0] ( Глава 6. Упражнения 1. 02 из 04 ) ( 6. ) : NEW! ( n адр --) OVER OVER SWAP 256 / SWAP 1+ С! С! ; ( 7.) : VARSWAP ( адр1 адр2 --) DUP @ PAD ! SWAP DUP @ ROT ! PAD @ SWAP ! : ( 8. ) CREATE 1WEEK 0 , 0 , 0 , 0 , 0 , 0 , 0 , CREATE 2WEEK 0 , 0 , 0 , 0 , 0 , 0 , 0 , ( Оба слова засылают при использовании в стек ) ( свои адреса.) : !SUN ! ; : !MON 2+ ! ; : !TUE 4 + ! ; : !WED 6 + ! ; : !THU 8 + ! ; : !FRI 10 + ! ; : !SAT 12 + ! ; ( Все слова имеют диаграмму преобразования стека ( n адр -- )
Блок 48 [48 :0] ( Глава 6. Упражнения 1. 03 из 04 ) ( 10. ) : @SUN @ ; : MON 2+ @ ; : @TUE 4 + @ ; : @WED 6 + @ ; : @THU 8 + @ ; : @FRI 10 + @ ; : @SAT 12 + @ ; ( Каждое слово живет схему преобразования стека (адр -- n) ( 11. ) : RSWAP ( n1 n2 адр -- ) SWAP 2 * OVER + ROT 2 * ROT + VARSWAP ; ( Каждое число должно умножаться на 2 и добавляться к адресу так, чтобы их содержимое можно было бы обменять с помощью VARSWAP ) ( 12. ) CREATE CNT 0 С, 0 С, 0 С, 0 С, 0 С, 0 С, 0 С,
Блок 49 [49 :0] ( Глава 6. Упражнения 1. 04 из 04 ) (13.) : +SUN 0 + +! 1 0 CNT + +! ; : +MON 2 + +! 1 1 CNT + +! ; : +TUE 4 + +! 1 2 CNT + +! ; : +WED 6 + +! 1 3 CNT + +! ; : +THU 8 + +! 1 4 CNT + +! ; : +FRI 10 + +! 1 5 CNT + +! ; : +SAT 12 + +! 1 6 CNT + +! ; ( Каждое слово имеет cxeuy преобразования стека адр -- n ) ( 14. ) : DAY-AVE ( день - средн. ) DUP DUP 2 * 1WEEK + @ SWAP 2 * 2WЕЕК + @ + SWAP CNT + C@ / ;
Блок 50 [50 :0] ( Глава 6. Упражнения 2. 01 из 01 ) ( 11.) : NEWFILL ( адр n с -- ) ROT SWAP OVER С! DUP ( 2. ) 1+ ROT 1- CMOVE ; : NEWERASE ( адр n -- ) 0 FILL ; ( 3. ) : INITIALIZE ( адр n -- ) 2 * ERASE ; ( 4. ) : ARR-COPY1 ( адр1 адр2 n -- ) 2 * CMOVE ; : ARR-COPY2 ( адр1 адр2 n -- ) MOVE ; ( 5. ) : ARR-EXCH ( адр1 адр2 n --) PAD ! ( Запишем счетчик в PAD) OVER PAD 2 + PAD @ MOVE ( Переносим адр1 в PAD ) DUP ROT PAD @ MOVE ( Переносим адр2 в адр1 ) PAD 2 + SWAP PAD @ MOVE ( Переносим PAD+2 в адр2 ) ;
Блок 51 [51 :0] ( Глава 6. Упражнения 3. 01 из 02 ) ( 1.) CVARIABLE CREATE 1 ALLOT ; 4VARIABLE CREATE 4 ALLOT : ( 2. ) ARRAY CREATE 2 * ALLOT ; ( 3. ) : CARRAY CREATE ALLOT ; : 2ARRAY CREATE 4 * ALLOT ; : 4ARRAY CREATE 8 * ALLOT ; ( 4. ) VARIABLE 1LENGTH VARIABLE 2LENCTH 12 CONSTANT 1->2 : CONVERT1-2 1LENGTH @ 1->2 * 2LENGTH ! ; : CONVBRT2-1 2LENGTH @ 1->2 / 1LEHGTH ! ; ( Сменить коэффициент можно путем замени 12 [см. выше] и рекомпиляции или путем n ' 1->2 ! [79]. или n ' {или [']} >BODY ! [83])
Блок 52 [52 :0] ( Глава 6. Упражнения 3. 02 из 02 ) ( 5.) : X->Y ( x -- у ) A @ * В @ + ; ( Замена операций путем изменения содержимого переменных А и В соответствует n А ! или n В ! .) ( 6.) ( В Форт-79 здесь нет различия. Оба засылают в стек адрес, где запомнено значение. ' >BODY является эквивалентом для Форт-83. ) ( 7.) : SET-FEET ( -- ) 12 ['] TO-INCHES >BODY ! ; : SET-YARDS ( -- ) 36 ['] TO-INCHES >BODY ! ; ( в описании-двоеточии должно использоваться ['] вместо '.)
Блок 53 [53 :0] ( Глава 6. Упражнения 4. 01 из 01 ) ( 1.) : SIR ." Dear Sir:" ; : MADAM ." Dear Madam:" ; : SORM ." Dear Sir or Madam:" ; VARIABLE HELLO : SALUTATION HELLO @ EXECUTE ; ( Смена приветствия путем FIND HELLO ! в Форт-79 или ' HELLO ! в Форт-83. ) ( 2. ) CREATE CHOICES FIND PRINT , FIND CRT , FIND PCRT , ( В Форт-83 используйте ' вместо FIND. ) : CHOOSE ." PRINTER (1), SCREEN(2), OR BOTH(3) " KEY 49 - 0 МАХ 2 MIN 2 * CHOICES + 6 EXECUTE ; ( Нажатие клавиши преобразуется в число от 0 до 2 путем вычитания значения ASCII 1 [49]. 0 МАХ 2 MIN гарантирует, что неверное нажатие клавиши не выведет из строя систему. )
Блок 54 [54 :0] ( Глава 6. Упражнения 4. 02 из 06 ) ( 3. ) VARIABLE COUNT1 VARIABLE COUNT2 VARIABLE COUNT3 0 COUNT1 ! 0 COUNT2 ! 0 COUNT3 ! VARIABLE WT1 VARIABLE WT2 VARIABLE WT3 0 WТ1 ! 0 WT2 ! 0 WT3 ! ( 4а. ) : CLASS ( wt -- n ) 100 / 0 MAX 2 MIN ; ( 4b. ) CREATE COUNTADDRS COUNT1 , COUNT2 , COUNT3 , CREATE WTADDRS WT1 , WT2 , WT3 , ( 4c. ) : BW ( wt --) DUP CLASS 2 * DUP 1 SWAP COUNTADDRS + @ +! WTADDRS + @ +! ;
Блок 55 [55 :0] ( Глава 6. Упражнения 4. 03 из 06 ) ( 4d. ) : SUMMARY ( n -- ) CR ." In class " DUP . ." there are " 2 * DUP COUNTADDRS + @ @ . ." bolts with a total weight of " DUP WTADDRS + @ @ . CR ." and а mean weight of " DUP WTADDRS + @ @ SWAP COUNTADDRS + @ @ / . ." ." CR ; ( 5. ) CREATE COUNT 0 , 0 , 0 , CREATE WEIGHTS 0 , 0 , 0 , : NBW ( wt -- ) DUP CLASS 2 * DUP 1 SWAP COUNT + +! WEIGHTS + +! ; ( Упражн. 4х5 иллюстрируют 2 способа сделать одну и ту же вещь. 4 также показывает насколько легко использовать переменные совместно с таблицами. Обратите внимание на сходство описания WT и NWT. NWT лучше, так как оно требует меньше памяти и времени, хотя 4 имеет небольшое преимущество контроля значений с помощью, например, WT1 @ . .)
Блок 56 [56 :0] ( Глава 6. Упражнения 4. 04 из 06 ) ( 5. ) : SMPHRASE ." under 200 grams, is " ; : MDPHRASE ." 100 to 200 grams, is " ; : LGPHRASE ." more then 200 gramss, is " ; CREATE PHRASES FIND SMPHRASE , FIND MDPHRASE , FIND LGPHRASE , ( В Форт-8З следует использовать ' вместо FIND . ) ( 6. ) 0 CONSTANT SMALL 2 CONSTANT MEDIUM 4 CONSTANT LARGE : SAY ( n -- n ) DUP PHRASES + @ EXECUTE ; : CNT ( n -- ) ." Total count, " SAY COUNT + @ . ; : WEICHT ( n -- ) ." Total weight, " SAY WE1GHTS + @ . ; : AVERAGE ( n -- ) ." AVERAGE weight, " SAY DUP WEIGHTS + @ SWAP COUNTS + @ / . ; ( SAY удаляет ненужные части следующих слов; эта техника, наэываемая разбором, широко используется в Форте.)
Блок 57 [57 :0] ( Глава 6.
Упражнения 4. 05 из 06) ( 7a. ) CREATE DVORAK 32 С, 123 С, 95 С, 37 С, 35 С, 33 С, 41 С, 45 С, 36 С, 94 С, 64 С, 43 С, 87 С, 56 С, 86 C, 90 С, 54 С, 91 С, 55 С, 53 С, 51 С, 49 С, 57 С, 48 С, 50 С, 52 С, 83 С, 115 С, 119 С, 61 С, 118 С, 122 С, 38 С, 65 С, 88 С, 74 С, 69 С, 62 С, 85 С, 73 С, 68 С, 67 С, 72 С, 84 С, 78 С, 77 С, 66 С, 82 С, 76 С, 34 С, 80 С, 79 С, 89 С, 71 С, 75 С, 60 С, 81 С, 70 С, 58 С, 47 С, 92 С, 93 С, 40 С, 42 С, 96 С, 97 С, 120 С, 106 С, 101 С, 46 С, 117 С, 105 С, 100 С, 99 С, 104 С, 116 С, 110 С, 109 С, 98 С, 114 С, 108 С, 63 С, 112 С, 111 С, 121 С, 103 С, 107 С, 44 С, 113 С, 102 С, 59 С, 63 С, 124 С, 125 С, 126 С, ( Это таблица преобразования клавиатуры QWERTY в Dvorak. Она начинается с пробела [ASCII 32], который имеет идентичиое значение для обоих типов клавиатуры. )
Блок 58 [58 :0] ( Глава 6. Упражнения 4. 06 из 06 ) ( 7и. ) : DKEY KEY DUP 31 > OVER 127 < AND IF 32 - DVORAK + С@ THEN ; ( DKEY используется также, где обычно ) ( 8. ) ( применяется KEY ) CREATE KEYBD FIND DKEY , FIND KEY , VARIABLE ?KBD ( В Форт-83 используйте ' вместо FIND. CONSTANT было бы быстрее, но скорость здесь не важна.) : CHOICE CR ." Type 1 for Dvorak" CR ." Type 2 for QWERTY" KEY DUP 49 - 0 MAX 1 MIN 2* KEYBD + @ ?KBD ! ; : NEWKEY ?KBD @ EXECUTE ; : TEST BEGIN NEWKEY EMIT 0 UNTIL ; ( Используется для теста клавиатуры. )
Блок 59 [59 :0] ( Глава 6. Упражнения 5. 01 из 03 ) ( 1.) 9 ARRAY NUMBERS : CLASS ( вес -- ) 10 / 0 МАХ 9 MIN ; : COUNTS ( n -- ) CLASS 1 SWAP NUMBERS +! ; ( 2.) 9 ARRAY WTSUM : !W ( вес счет -- ) DUP CLASS WTSUM +! ; ( 3. ) : .TOT-#S CR 10 0 DO I NUBMERS @ 6 .R LOOP ; : .TOT-WT CR 10 0 DO I WTSUM @ 6 .R LOOP ; : .AVE-WT CR 10 0 DO I WTSUM @ ( 4. ) I NUMBERS @ / 6 .R LOOP ; : !WT ( w -) DUP COUNTS !W .TOT-WT .TOT-#S .AVE-WT ; : INIT 10 0 DO DO 0 I WTSUM ! 0 I NUMBERS ! LOOP ; ( Используйте INIT для начального обнуления массива)
Блок 60 [60 :0] ( Глава 6. Упражнения 5. 02 из 03 ) 1 8 ARRAY NUMWTS : CLASS ( вес --) 10 / 0 МАХ 9 MIN ; ( Аналог.
CLASS ранее) : COUNTS ( вес ) CLASS 1 0 ROT NUMWTS +! ; : !W ( wt -- ) DUP CLASS 1 SWAP NUMWTS +! ; : .TOT-#S CR 10 0 DO 0 I NUMWTS @ 6 .R LOOP ; : .TOT-WT CR 10 0 DO I 1 NUMWTS @ 6 .R LOOP ; : .AVE-WT CR 10 0 DO 1 I NUMWTS @ 0 1 NUMWTS @ / 6 .R LOOP ; : !WT ( w -- ) DUP COUNTS !W .TOT-WT .TOT-#S .AVE-@T ; ( Это идентично предшествующему примеру. ) : INIT 10 0 DO 0 0 I NUMWTS ! 0 1 NUMWTS ! LOOP ; ( Заметьте, насколько это похоже на предшествующее упражн. Использование матрицы экономит немного место за счет потери некоторого времени. Реальное преимущество матрицы сказыва- ется при размерности больше двух или, когда для математических расчетов необходима матричная алгебра. )
Блок 61 [61 :0] ( Глава 6. Упражнения 5. 03 из 03 ) ( 6.) CREATE NEWSTACK 32 ALLOT VARIABLE STACKPOS NEWSTACK STACKPOS ! : XPUSH ( n -- ) STACKPOS @ ! 2 STACKPOS +! ; : XPOP ( -- n ) -2 STACKPOS +! STACKPOS @ @ ; : PUSH ( n -- ) STACKPOS @ NEWSTACK 28 + MIN STACKPOS ! XPUSH ; : POP ( -- n ) STACKPOS @ NEWSTACK 2 + MAX STACKPOS ! XPOP ; ( Когда стек станет пуст, POP выдаст число, которое было занесено туда последним. Аналогично, когда стек заполнен, PUSH перезапишет верхнее число, в то время как XPUSH и XPOP разрушит систему из-за переполнения стека. ) ( 7. ) : NEWDROP POP DROP ; ( Форт в действительности контроли-) : NEWDUP POP PUSH PUSH ; ( рует стек аналогичным образом ) : NEWSWAP POP POP SWAP PUSH PUSH ;
Блок 62 [62 :0] ( Глава 7. Упражнения 1. 01 из 03 ) ( 1. ) : NEW> ( n1 n2 -- f ) SWAP < ; : NEW0< ( n -- f ) 0 < ; : NEW0> ( n -- f ) NEGATE NEW0< ; : NEW= ( n1 n2 -- f ) - 1+ NEW0> ; : NEW= ( n1 n2 -- f ) OVER OVER NEW= AND ; : NEW<> ( n1 n2 -- f ) - DUP NEW0< SWAP NEW0> OR ; : NEW0= ( n -- f ) 0 NEW= ;
Блок 63 [63 :0] ( Глава 7. Упражнения 7. 02 из 03 ) ( 2. ) ( а. = ROT ROT = AND б. ROT ROT = OR в. <> ROT ROT = AND г. <> ROT ROT = OR д. 0 ROT ROT <> AND е. = ROT ROT = XOR ж. < ROT ROT > AND з. OVER = SWAP ROT = AND и. OVER < SWAP ROT < AND ) ( 3. ) : ?REM=0 MOD 0= ; ( 4. ) : ?REM MOD 0= NOT ; ( 5. ) : ?OPPOSITE + 0= ; : NEW= - 0= ;
Блок 64 [64 :0] ( Глава 7. Упражнения 1. 03 из 03 ) ( 6.) : D= D- 0= SWAP 0= AND ; ( 7.) : COMP DUP 0< NEGATE SWAP 0> + ; \ Блок 65 [65 :0] ( Глава 7. Упражнения 2. 01 из 02 ) ( 1.) : NEWABS ( -n -- n ) или n -- n ) ?DUP 0< IF NEGATE THEN ; ( 2.) : /0? ( n --) ?DUP IF / ELSE DROP ( 3. ) ." Divide by 0 error" THEN ; : TYPE IF TYPE ELSE DROP DROP THEN ; (v4.) : 1TASK ." A " ; : 2TASK ." T " ; : 3TASK ." X" ; : ?WHICH-TASK ( -- ) KEY DUP 65 = IF 1TASK ELSE DUP 84 = IF 2TASK ELSE DUP 88 = IF 3TASK THEN THEN THEN DROP ;
Блок 66 [66 :0] ( Глава 7. Упражнения 2. 02 из 02 ] ( 5.) : UPPER-KEY ( -- с) KEY DUP 96 > OVER 123 < AND IF 223 AND THEN ; ( 6.) : NO-CONT-KEY ( -- с ) UPPER-KEY DUP 32 < IF 64 + THEN ; ( 7.) : ALPHA-KEY ( -- с ) NO-CONT-KEY DUP 47 > OVER 58 < AND IF DROP THEN ; ( 8. ) : D->S ( d -- n или d -- d ) ?DUP IF THEN : ( : D->S DUP 0= IF DROP THEN ; ( также работает, но медленнее.)
Блок 67 [67 :0] ( Глава 7. Упражнение 3. 01 и 03 ) ( 1. ) : ?END ." Do you want to quit? (Y/N) " КEY 89 = IF CR ." Do you want to save the stack? (Y/N) " KEY 118 = IF ." OK" CR QUIT ELSE ." OK" CR ABORT THEN THEN ; ( 2. Нет. ) ( 3. ) ( Первое остановит программу, вторые два обеспечат только выход из слова ?223 .) ( 4. Нет. ) ( 5. ) : 0? ( n1 -- n2) ?DUP 0= IF ." Number is zero " ( 6. ) ABORT THEN ; : =IF-ABORT = IF ABORT THEN ;
Блок 68 [68 :0] ( Глава 7. Упражнения 3. 02 из 03 ] ( 7. ) : +RANGE-ABORT ( n1 n2 -- n1 n2 ) OVER ОVER 0 ROT 0 D+ 0= 0= IF ." Add overflow error ? " ABORT THEN ; ( 8.) : +*RANGE-ABORT +RANCE-ABORT ОVER ОVER 0 ROT 0 D+ 0= 0= IF ." Multiply overflow error ? " ABORT THEN ; ( 9.) : STACK-TOO-BIG ( -- ) DEPTH 15 > IF ." Stack too big ?" ABORT THEN ;
Блок 69 [69 :0] ( Глава 7. Упражнения 3. 03 из 03 ) ( 10a. ) : DOTHAT ." That " ; : DOOTHER ." Other " ; : 1TASK ( n -- ) 0= IF DOTHAT THEN ; ( 10b. ) : 2TASK ( n -- ) IF DOTHAT THEN ; ( 10c. ) : 3TASK ( n -- ) 0= IF DOTHAT ELSE DOOTHER THEN ; ( 10d. ) : 4TASK ( n -- ) IF DOTHAT DOOTHER THEN ;
Блок 70 [70 :0] ( Глава 7. Упражнения 4. 01 из 02 ) ( 1.) CREATE МАТH , FIND + , FIND - , FIND * , FIND / , ( В Форт-83 используйте ' вместо FIND ) : ARITH ( n1 n2 n3 -- ) 1- 2* MATH + @ EXECUTE ; : ARITH' ( n1 n2 n3 -- n4 ) DUP 0 > ОVER 5 < AND IF 1- 2* MATH + @ EXECUTE ELSE DROP DROP DROP 0 ТHEN ; ( 2.) : ARITH-' ( n1 n2 n3 -- n4 ) NCASE 1 3 4 " + - * / OTHERWISE DROP DROP 0 CASEND ; ( 3. ) : NEWARITH ( n1 n2 -- n3 ) KEY ACASE +-*/" + - * / OTHERWISE DROP DROP 0 CASEND ;
Блок 71 [71 :0] ( Глава 7. Упражнения 4. 02 из 02 ) ( 4. ) : NEWARITH' KEY DUP 43 = IF DROP + ELSE DUP 45 = IF DROP - ELSE DUP 42 = IF DROP * ELSE 47 = IF / ELSE DROP DROP 0 THEN THEN THEN THEN ; ( 5.) : NEWARITH'' ( --) KEY ACASE +-*/" + - * / OTHERWISE ." Incorrect input " ABORT CASEND ; ( 6. ) ( Если вы хотите изменить задание путем замены содержимого вектора. Векторное исполанениее кроме того быстрее. )
Блок 72 [72 :0] ( Глава 8. Упражнения 1. 01 из 06 ) ( 1. ) : ASCIITAB ( - ) CR 1+ SWAP DO I 4 .R 3 SPACES I EMIT CR LOOP ; ( 2. ) : ASCIICHAR ( -- ) CR 33 9 0 DO 10 0 DO DUP I J 10 * + + 4 .R LOOP CR 10 0 DO DUP I J 10 * + + 3 SPACES EMIT LOOP CR LOOP DROP : ( 3. ) : ZERDIAG ( адр -- ) 5 0 DO DUP I 5 * I + 2 * + 0 SWAP ! LOOP DROP ;
Блок 73 [73 :0] ( Глава 8. Упражнения 1. 01 из 06 ) ( 4.) : SUMCOL ( адр -- n1 n2 n3 n4 n5 ) 5 0 DO 0 SWAP 5 0 DO DUP I J + 2 * + @ ROT + SWAP LOOP LOOP DROP ; ( 5.) : X^5 ( n - n^5 ) DUP 4 0 DO OVER * LOOP ;
Блок 74 [74 :0] ( Глава 8. Упражнения 1. 03 из 06 ) ( 6.) : D** ( n1 n2 -- ) ?DUP 0= IF DROP 1. - ELSE DUP 1 = IF DROP 0 ELSE 0 ROT 0 2SWAP 2OVER 2SWAP DROP 1- 0 DO 2OVER D* LOOP 2SWAP 2DROP THEN THEN ( 7. ) : DUMP ( адр -- ) CR BASE @ SWAP HEX 10 0 DO 16 0 DO DUP I J 16 * + + C@ 3 .R LOOP CR LOOP DROP BASE ! ;
Блок 75 [75 :0] ( Глава 8. Упражнения 1 04 из 06 ) ( 8. ) : DUMP2 CR BASE @ SWAP HEX 10 0 DO DOP I 16 * + 5 .R 16 0 DO DUP I J 16 * + + С@ 3 .R LOOP CR LOOP DROP BASE ! ; ( 9. ) : DUMP3 ( адр -- ) CR BASE @ SWAP HЕХ 5 0 DO DUP I 16 * + 5 U.R 16 0 DO DUP I J 16 * + + С@ 3 .R LOOP CR 5 SPACES 16 0 DO DUP 2 SPACES I J 16 * + + С@ DUP 32 < OVER 127 > OR IF DROP 46 EMIT ELSE EMIT THEN LOOP CR LOOP DROP BASE ! ;
Блок [76 :0] ( Глава 8. Упражнения 1. 05 из 06 ) ( 10. ) VARIABLE SPCS : COUNT-SPCS ( адр --) 1024 0 DO DUP I + С@ 32 = IF 1 SPCS +! THEN LOOP DROP ; ( 11. ) CREATE ALPHA 52 ALLOT : ALPHACOUNT ( адр cw -- ) ALPHA 52 0 FILL ( очистка массива ) 0 DO DUP I + С@ 223 AND DUP 64 > OVER 91 < AND IF 65 - 2 * ALPHA + 1 SWAP +! ELSE DROP THEN LOOP DROP ;
Блок 77 [77 :0] ( Глава 8. Упражнения 1. 06 из 06 ) ( 12. ) : LETTERBAR ( n с --) SWAP 0 DO DUP EMIT LOOP DROP ; : ALPHALLOT ( -- ) ALPHA CR 26 0 DO DUP I 2 * + @ ?DUP 0= 0= IF I 65 @ LETTERBAR CR THEN ; LOOP DROP QUIT ; ( 13. ) : .S ( -- ) DEPTH ?DUP 0= IF ." Stack empty" ELSE 0 DO DEPTH ROLL DUP . LOOP THEN ;
Блок 78 [78 :0] ( Глава 8. Упражнения 2. 01 из 03 ) ( 1. ) : .ARR ( адр n --) 2 * CR 0 DO DUP I + @ . ( 2. ) 2 +LOOP DROP ; : .SQARR ( адр n -- ) 2 * CR DUP @ DO DUP 0 DO OVER I J + + @ . 2 +LOOP CR 2 +LOOP 2DROP ; ( 3. ) : D.ARR ( адр n --) 4 * CR 0 DO DUP I + 2@ D. 4 +LOOP DROP ; : D.SQARR ( адр n -- ) 4 * CR DUP 0 DO DUP 0 DO OVER J + + 2@ D. 4 +LOOP CR 4 +LOOP 2DROP ; ( Может покаэаться более естественным использовать LOOP и 2 * или 4 * для вычисления адреса извлекаемого элемента, но быстрее использовать +LOOP и делать умножение только раз в начале описания. )
Блок 79 [79 :0] ( Глава 1. Упражнения 2. 02 из 03 ) ( 4. ) : F-C ( -- ) СК 201 0 DO I 6 .R I 32 - 5 9 */ 6 .R CR 10 +LOOP ; ( Заметьте, что хотя шаг цикла равен 10, предел цикла должен только на 1 превосходить верхнюю ступеньку. ) ( 5. ) : F-C1 ( -- ) CR 0 200 DO I 6 .R I 32 - 5 9 */ 6 .R CR 10 +LOOP ; ( 6. ) : FINDCHAR ( адр1 с -- адр2 ) 1024 0 DO OVER OVER SWAP 1 + C@ IF DROP I + LEAVE THEN LOOP ;
Блок 80 [80 :0] ( Глава 8. Упражнения 2. 03 из 03 ) ( 7. ) : $= ( адр1 адр2 -- f ) OVER OVER C@ SWAP C@ = 0= IF 0 DROP DROP EXIT THEN 1+ SWAP 1+ DUP 1- С@ 0 DO OVER OVER I + C@ SWAP I + C@ = 0= IF DROP DROP 0 LEAVE THEN LOOP DUP IF DROP DROP 1 ( или -1 для Форт-03) THEN ; ( 8. ) : SEARCH ( адр @адр -- f ) 1+ DUP 1- C@ 0 DO OVER OVER 1 + C@ SWAP I + C@ = 0= IF DROP DROP 0 LEAVE THEN LOОР DUP IF DROP DROP 1 ( или -1 ) THEN ; : $FIND ( адр $адр - адр ) 1024 0 DO SWAP 1+ SWAP OVER OVER SEARCH IF LEAVE THEN LOOP DROP ;
Блок [81 :0] ( Глава 1. Упражнение 3. 01 из 02 ) ( 1. ) : .4PICK ( n1 n2 n3 n4 -- n2 nЗ n4) >R >R >R . R> R> R> ; ( Do-loop нельзя применять, так как там испольэуется стек возвратов ) ( 2.) : DUP1 ( n -- n n ) >R R@ R> ; ( 3. ) : J1 R> R> R> R@ SWAP >R SWAP >R SWAP >R ; ( 4. ) : К R> R> R> R> R> R@ SWAP >R SWAP >R SWAP >R SWAP >R SWAP >R ; ( 5. ) : J' R> R> R> R> R@ SWAP >R SWAP >R SWAP >R SWAP >R ;
Блок 82 [82 :0] ( Глава 8. Упражнения 3. 02 из 02 ) ( 6. ) : NEWLEAVE R> R> DROP R@ >R >R ; ( 7.) ( Выполним R> R> DROP, чтобы записать новое число, а затеи исполним >R >R . ) ( 8.) ( I 10 = IF R> DROP 15 >R THEN ) ( 9. ) : +INDEX ( n -- ) R> SWAP R> + >R >R ; ( 10. ) ( Возникает бесконечный цикл, так как индекс всегда увеличивается до того, как он будет уменшен оператором LOOP. Такям образом индекс никогда не достигнет предела.)
Блок 83 [83 :0] ( Глава 8. Упражнение 4. 01 из 02 ) ( 1.) VARIABLE N 1000 N ! : POPSIZE CR 501 0 DO N @ 200 / N +! I 1+ 50 MOD 0= IF I 1+ ." Day " U. N @ ." Size " U. CR THEN LOOP 1000 N ! ; ' ( Население не может увеличиватся менее чем на 200 ) ( 2. ) 1000 N ! : POPDOUBLE CR N @ 2 * 10000 0 DO N @ 200 / N +! DUP N @ R BEGIN DEPTH ROLL DUP . R> 1- >R R@ 0= UNTIL R> DROP ; ( 2. ) : ST-SUM ( -- ) DEPTH 0= IF 0 EXIT THEN 0 BEGIN + DEPTH 1 = UNTIL ; : ST-SUM1 ( -- ) DEPTH 0= IF 0 EXIT THEN DEPTH 1 = IF EXIT THEN DEPTH 1- 0 DO + LOOP ; ( 3. ) VARIABLE TOTAL 500 TOTAL ! : ?YEAR1 ( -- ) CR BEGIN DUP 4 .R TOTAL @ 10 / DUP 6 .R TOTAL +! 1+ TOTAL @ DUP 6 .R CR 1000 >
UNTIL 500 TOTAL ! ;
Блок 86 [86 :0] ( Глава 8. Упраиенмя 5. 02 из 03) ( 4.) VARIABLE #MICE 1000 #MICE ! : MICE ( -- ) #MICE @ 2 * 0 BEGIN #MICE @ 200 / #MICE +! 1+ OVER #MICE @ 0= IF DROP DROP EXIT ELSE KEY DUP 13 <> TNEN WHILE DUP 8 = ( если backspace ... ) IF NEISPAN @ 0 = ( если NEWSPAN равен 0, игнорируем) IF DROP ELSE -1 NEWSPAN +! EMIT THEN ELSE DUP EMIT OVER NEWSPAN @ + C! 1 NEWSPAN +! THEN REPEAT DROP DROP DROP ; ( Из цикла do-loop не просто осуществить условный переход туда, куда надо и выйти, так как мы это здесь сделали.)
Блок 89 [89 :0] ( Глава 9. Упражнения 1. 02 из 04 ) ( 3.) : .ЕУЧЕ ( адр -- ) 0 BEGIN OVER OVER + С" 0= 0= WHILE 1+ REPEAT 1+ TYPE ; ( В Форт-83 вы можете просто выдать адр SPAN @ TYPE ) ( 4.) CREATE $SPACE 258 ALLOT ( оставляет 2 байта для нулей ...) : GET$ ( -- адр ) $SPACE 1+ 255 OVER OVER BLANK ." ?" OVER OVER EXPECT -TRAILING $SPACE C! 1- ; ( В Форт-83 это описание будет иметь вид: ) : 83GET$ ( - $адр ) $SPACE 1+ 258 ." ?" EXPECT $SPACE DUP SPAN @ SWAP C! ;
Блок 90 [90 :0] ( Глава 9. Упражнения 1. 03 из 04 ) ( 5. ) : ADD$ ( - $адр) $SPACK C@ 255 < IF $SPACE DUP C@ + 255 $SPACE C@ - 1+ OVER OVER BLANK ." ?" OVER OVER EXPECT -TRAILING $SPACE C@ + $SPACE С! DROP $SPACE ELSE ." Not enough room to add string " $SPACE EXIT THEN ; ( 6.) : ADD$1 ( -- $адр ) $SPACE C@ 255 < IF $SPACE DUP C@ + 255 $SPACE C@ - 1+ OVER OVER BLANK ." ?" OVER OVER EXPECT -TRAILING $SPACK C@ + DUP 254 > IF DROP DROP $SPACE EXIT THEN $SPACE C! DROP $SPACE ELSE ." Not enough room to add string! " $SPACE EXIT THEN ;
Блок 91 [91 :0] ( Глава 9. Упражнения 1. 04 из 04 ) ( 7.) : !DOLLAR$ ( d --) SWAP OVER DABS DUP $SPACE C! $SPACE 1+ SWAP CMOVE ; ( 8. ) : LEFT$ ( адр1 n -- адр2 ) OVER C@ MIN DUP ROT 1+ PAD 1+ ROT CMOVE PAD C! PAD ;
Блок 92 [92 :0] ( Глава 9. Упражнения 2. 01 из 02 ) ( 1. ) ( следует ли нам заботиться о начальном обнулении длины ? ) : VARIABLE ( n -- ) CREATE ALLOT ; ( 2. ) : $! ( $адр1 $адр2 -- ) OVER C@ 1+ CMOVE ; ( 3. ) : $GET ( $адр -- ) 34 WORD SWAP OVER C@ 1+ CMOVE ; ( 4. ) : $" ( --$адр ) 34 WORD PAD OVER C@ 1+ CMOVE PAD ; ( 5. ) ( $" входная строка" $SPACE $! , например, решает стоящую задачу.) ( 6. ) CREATE CHOCES $1 , $2 , $3 , $4 , $5 , $6 , $7 . $8 , $9 , $10 , ) : .$CHOISE ( n -- ) 1- 2 * CHOICES + @ COUNT TYPE ;
Блок 93 [93 :0] ( Глава 9. Упражнения 2. 02 из 02 ) ( 7. ) 2 20 $VARIABLE 1STRING 20 $VARIABLE 2STRINC 3 20 $VARIABLE 3STRING 20 $VARIABLE 4STRING CREATE NSTRING 1STRING , 2STRING , 3STRING , 4STRING , : PARSE$ TIB 80 BLANK 0 >IN ! ." ?" QUERY 4 0 DO 35 WORD I 2 * NSTRING + @ $! LOOP TIB 80 BLANK ; ( 8. ) : PARSE$1 TIB 80 BLANK 0 >IN ! ." ?" QUERY 4 0 DO 35 WORD >IN @ .
I 2 * NSTRING + @ #! LOOP TIB 80 BLANK ; ( > IN увеличивается оператором WORD по мере разбора ) ( входного потока . ) : (( 41 WORD DROP ; IMMEDIATE (( Это действительно работает? Если да, то все это будет проигнорирована и не будет дано сообщения об ошибке ) : TEST (( Nor will this. ) ;
Блок 94 [94 :0] ( Глава 9. Упражнения 3. 01 иэ 03 ) ( 1. ) : NEWLEFT$ ( $адр1 n -- $адр2 ) 1 SWAP MID$ ; : NEWRIGHT$ ( $адр1 n - $адр2) ( 2.) OVER C@ OVER - 1+ SWAP MID$ ; : $CHAR ( с -- $адр ) 1 PAD С! PAD 1+ С! PAD ; ( 3.) : 1STCHAR ( $адр -- с) 1+ C@ ; ( 4.) : $SWAP ( $адр1 $адр2 --) DUP DUP С@ 1+ PAD SWAP CMOVE OVER SWAP OVER С@ 1+ CMOVE PAD SWAP OVER C@ 1+ CMOVE ; : $SWAP1 ( $aдр1 $адр2 --) DUP PAD $! OVER SWAP $! PAD SWAP $! ; ( Преимущество MMSFORTH-пакета операторов для работы со строками очевядио. ) ( 5. ) ( LEFT$ RIGHT$ CHR$ ASC $XCHG )
Блок 95 [95 :0] ( Глава 9. Упражнения 3 02 из 03 ) ( 6. ) : BUILD$ ( $адр -- ) >R BEGIN INKEY$ DUP DUP $. $" #" $COMPARE WHILE R@ SWAP $+ R@ $! REPEAT R> DROP ; ( 7.) : BUILD$1 ( $адр -- ) IN$ SWAP $! ; ( 8. ) ( Но здесь не используется # ) ( Опишите 30 CONSTANT SIZE и используйте SIZE всюду, где используется 10 в STOREPHONE , GETPBONE к т.д. Преимущество заключается в легокости изменения размера словаря) ( 9. ) : SHOWPHONES ( -- ) CR 10 ( или SIZE ) 0 DO 1 0 PHONES $. 2 SPACES I 1 PHONES $. I AVAILABLE + C@ 0= IF LEAVE ELSE CR THEN LOOP ;
Блок 96 [96 :0] ( Глава 9. Упражнения 3. 03 из 03 ) ( 10. ) : ERASEALL ( --) ." Are you sure you want to do this? (Y/N)?" KEY 89 IF 0 0 PHONES 600 0 FILL AVAILABLE 10 0 FILL ELSE ." Not done." THEN ;
Блок 97 [97 :0] ( Глава 9. Упражнения 4. 01 из 03 ) ( 1. ) : $IN PAD 1+ 255 OVER OVER BLANK ." ?" OVER OVER EXPECT -TRAILING PAD C! 1- ; ( используется ниже ) : D#IN1 ( -- d ) 0 0 $IN CONVERT DROP ; : D#IN2 ( -- d ) BEGIN $IN DUP 0 0 ROT CONVERT 4 ( 3 в Форт-83 ) ROLL 1+ = WHILE ." REDO " DROP DROP REPEAT ; : D#IN3 BEGIN $IN DUP 1+ C@ 45 = DUP >R IF 2+ THEN DUP 0 0 ROT CONVERT ROT ROT R>
IF DNEGATE THEN 4 ( 3 в Форт-83 ) ROLL 1+ 4 ( 3 в Форт-83 ) ROLL = WHILE ." REDO " DROP DROP REPEAT ;
Блок 98 [98 :0] ( Глава 9, Упражнения 4. 02 из 03 ) (2. ) : #IN. ( -- n ) BEGIN $IN DUP 1+ C@ 45 = DUP >R IF 1+ THEN DUP 0 0 ROT CONVERT ROT ROT R>
IF DNEGATE THEN 4 ( 3 для Форт-83 ) ROLL 1+ 4 ( 3 ) ROLL DUP C@ 46 = 0= >R = WHILE R> DBOP ."REDO " DROP DBOP REPEAT R> IF DROP THEN ;
Блок 99 [99 :0] ( Глава 9. Упражнения 4. 03 из 03 ) ( 3.) : $IN3 ( -- n ) $IN NUMBER DROP ; ( 4. ) : INFIX ( -- n ) 32 WORD NUMBER DROP ; ( Это слово упрощает последующие описания. ) : PLUS ( n1 -- n2 ) INFIX + ; ( 5.) : TIMES ( n1 -- n2 ) INFIX * ; : DIVIDEDBY ( n1 -- n2 ) INFIX / ; : MINUS ( n1 -- n2 ) INFIX - ; : EQUALS ( n --) . ;
Блок 100 [100 :0] ( Глава 10, Упражнения 1. 01 из 01 ) ( 1.) ( Приведенное здесь описание продолжает работу после загрузки следущего блока. Предшествующее описание этого не делает и остаток блока будет проигнорирован. ( 2.) : N--> 0 >IN ! BLK @ ." Block " . ." loaded" CR 1 BLK +! ; ( 3. ) : LISTS ( n1 n2 -- ) OVER + SWAP DO CR CR ." Block " I DUP . LIST CR CR CR CR LOOP ; ( 4.) : ^ ( -- ) CR ." Block " BLK @ . >IN @ 64 /MOD ." Line " . ." Character " 2 - . CR ; IMMEDIATE ( 5. ) ( FORGET TASK 20 LOAD )
Блок 101 [101 :0] ( Глава 10. Упражнения 2. 01 из 02 ) ( 1. ) : SLOAD ( n -- ) DUP 2 MOD IF ." Can't load odd blocks" ABORT THEN LOAD ; ( или ) ( : SLOAD1 ) ( n -- ) ( DUP 2 MOD ABORT" Can't load odd blocks" LOAD ; ) ( 2. ) : SLIST ( n -- ) DUP 2 MOD + LIST ; ( 3. ) : SVIEW ( n -- ) DUP 2 MOD 0= - ( + в Форт-83 ) LIST ; ( 4. ) : SLISTS ( n1 n2 -- ) 2 * SWAP DUP 2 MOD + SWAP OVER + SWAP DO CR CR ." Block " I DUP . LIST CR CR CR CR 2 +LOOP ;
Блок 102 [102 :0] ( Глава 10. Упражнения 2. 02 из 02 ) ( 5. ) : SVIEWS ( n1 n2 ) 2 * SWAP DUP 2 MOD 0= - ( + в Форт-83 ) SWAP OVER + SWAP DO CR CR ." Block " I DUP . LIST CR CR CR CR 2 +LOOP : ( 6.) : S--> 0 >IN ! BLK +! ; IMMEDIATE
Блок 103 [ 103 :0] ( Глава 10. Упражнения 3. 01 из 02 ) ( 1. ) 100 CONSTANT PACFORTH ( 2. ) : GET FIND 2* @ LOAD ; ( В Форт-79 ) : GET1 ' >BODY @ LOAD ; ( В Форт-83 ) ( 3. ) : LOADIT ( адр -- ) DUP @ 0 DO DUP I 2 * + 2 * @ LOAD LOOP DROP ; ( 4. ) : SHOWBLOCKS ( адр -- ) DUP @ 0 DO DUP I 2 * + 2 + @ . LOOP DROP ;
Блок 104 [104 :0] ( Глава 10. Упражнения 3. 02 из 02 ) ( 5.) : ?BLOCKS ( адр -- ) CR DUP @ 0 DO DUP I 2 * + @ SHOWBLOCKS CR LOOP DROP ; ( 6. ) : LOADEM ( адр n -- ) 2 * 2 + @ LOADIT ;
Блок 105 [105 :0] ( Глава 10. Упражнения 4. 01 из 03 ) ( 1. ) : .LINE ( n1 n2 -- ) SWAP BLOCK SWAP 64 * + 64 -TRAILING TYRE ; ( 2.) : NEWINDEX ( n1 n2 -- ) OVER + SWAP DO CR I . I 0 .LINE LOOP ; ( 3.) : NEWLIST ( n -- ) 16 0 DO CR DUP I DUP 2 .R SPACE .LINE LOOP DROP ; ( 4. ) : BLLINE ( n1 n2 -- ) SWAP BLOCK SWAP 64 * + 64 32 FILL UPDATE ; ( 5.) : NEWTL ( n1 n2 -- ) 1+ SWAP DO CR SCR @ I DUP 2 .R SPACE .LINE LOOP ; : NEWLIST1 ( n -- ) SCR ! 0 15 TL ;
Блок 106 [106 :0] ( Глава 10. Упражнения 4. 02 из 03 ) ( 6. ) : CLEAR-BLOCK ( n -- ) BLOCK 1024 32 FILL UPDATE ; ( 7. ) : PP ( n1 n2 -- ) SWAP BLOCK SWAP 64 * + DUP 64 32 FILL 0 WORD 1+ DUP 1- C@ -TRAILING ROT SWAP CMOVE UPDATE ; ( 8. ) : NEWCOPY ( n1 n2 --) SWAP BLOCK SWAP BLOCK 1024 ( 9. ) CMOVE UPDATE ; : ( n1 n2 n3 -- ) 0 DO OVER OVER SWAP I' I - + 1- SWAP I' I - + 1- NEWCOPY LOOP DROP DROP ; ( но I' также не стандартное слово ) ( 11. ) : COPIES ( n1 n2 nЗ -- ) ROT ROT OVER OVER < IF ROT COPIES> ELSE ROT
IF ." Block overflow! " ABORT ELSE STORBLK @ BLOCK SWAP ARRLEN @ * + ARRLEN @ CMOVE UPDATE THEN ; ( 2.) CREATE ARRAY 1 , 2 , 3 , 4 , 5 , CREATE 2ARRAY 6 , 7 , 8 , 9 , 0 : PUTARRAYS ( адр1 адр2 n -- ) DUP 1+ 20 * 1024 >
IF ." Block overflow! " ABORT ELSE 20 * >R SWAP STORBLK @ BLOCK R@ + 10 CMOVE STORBLK @ BLOCK R> + 10 + 10 CMOVER UPDATE THEN ;
Блок 109 [ 109 :0] ( Глава 10. Упражнения 5. 02 из 05 ) ( 3.) 700 CONSTANT PATBLOCK ( Измените это, если нужно : PD ( n1 n2 n3 n4 -- ) DUP 1+ 2 * 1024 >
IF ." Block overrun " ABORT THEN 2 * > R PATBLOCK 2+ BLOCK R@ + ! UPDATE PATBLOCK 1+ BLOCK R@ + ! UPDATE PATBLOCK BLOCK R> + ! UPDATE ; : SD ( - n ) DUP 1+ 2 * 1024 >
IF ." Block overrun" ABORT THEN 2 * >R CR R@ 2 / ." Patient number " CR R@ PATBLOCK BLOCK + @ ." Weight " CR R@ PATBLOCK 1+ BLOCK + @ ." Systolic pressure " CR R@ PATBLOCK 2 + BLOCK + @ ." Diastolic pressure " . CR;
Блок 110 [110 :0] ( Глава 10. Упражнения 5. 03 из 05 ) ( 4.) VARIABLE CNT : SUMBLOCK ( n -- d ) 0 CNT ! BLOCK 0 0 RОТ 512 0 DO DUP I 2 * + @ DUP IF 1 CNT +! ТНEN SWAP >R 0 D+ R>
LOOP DROP : ( 5. ) : AVE ( n1 - n2 ) SUMBLOCK CNT @ 0 D/ DROP ; ( 6. ) : AD ( n -- ) PATBLOCK BLOCK @ 2 * 2+ DUP 1+ 1024 >
IF ." Block overrun" ABORT ELSE PATBLOCK BLOCK DUP >R + ! 1 R> ! UPDATE THEN ;
Блок 111 [111 :0] ( Глава 10. Упражнения 5. 04 из 05 ) ( 7.) : DD ( n -- ) 2 * 2+ PATBLOCK BLOCK DUP >R OVER + DUP 2- ROT 1024 SWAP - CMOVE -1 R> +! UPDATE ; ( 8. ) : SB ( n - d ) BLOCK DUP >R 0 0 ROT R> @ 0 DO DUP I 2 * + 2+ @ SWAP >R 0 D+ R> LOOP DROP ; : AV ( n1 -- n2) DUP SB ROT BLOCK @ 0 D/ DROP ; ( 9.) : SBS ( n -- d ) BLOCK DUP >R 0 0 ROT R> @ 0 DO DUP I 2 * + 6 + @ SWAP >R 0 D+ R> LOOP DROP ; : AVS ( n1 -- n2 ) DUP SBS ROT BLOCK @ 0 D/ DROP ;
Блок 112 [112 :0] ( Глава 10. Упражнения 5. 05 из 05 ) ( 9 продолж. ) : ADS ( n -- ) PATBLOCK BLOCK @ 2 * 6 + DUP 1024 2/ >
IF ." Block overrun" ABORT ELSE PATBLOCK BLOCK DUP >R + ! 1 R@ +! PATBLOCK SBS R> 2+ 2! UPDATE THEN ; : DDS ( n -- ) 2 * 6 + PATBLOCK BLOCK DUP >R OVER + DUP 2- ROT 1024 SWAP - CMOVE -1 R> + PATBLOCK SBS PATBLOCK BLOCK 2+ 2! UPDATE ; ( 10. ) : CHKSUM ( n1 -- n2 ) BLOCK 0 1024 0 DO OVER I + @ + 2 +LOOP SWAP DROP ; : ?BLK= ( n1 n2 -- флаг ) CHKSUM SWAP CHKSUM = ;
Блок 113 [113 :0] ( Глава 10. Упражнения 6. 01 из 02 ) ( 1.) : BLOCKWORD ( n1 n2 n3 -- #addr ) BLK @ >R >IN @ >R ROT BLK ! SWAP >IN ! WORD DUP C@ PAD SWAP 1+ CMOVE PAD R> >IN ! R> BLK ! ; ( 2.) VARIABLE POSITION 0 POSITION ! : BWORD ( n1 n2 -- #addr ) BLK @ >R >IN @ >R SWAP BLK ! POSITION @ >IN ! WORD DUP C@ PAD SWAP 1+ CMOVE >IN @ POSITION ! R> >IN ! R> BLK I PAD ; ( 3. ) : BLOCKNUMBER ( n1 n2 - n3) BWORD NUMBER DROP ;
Блок 114 [114 :0] ( Глава 10. Упражнения 6. 02 из 02 ) ( 4. ) : TOBLOCK ( n1 n2 n3 -- ) >R OVER SWAP BLOCK POSITION @ + >R 1+ OVER C@ R> OVER OVER + >R SWAP CMOVE C@ 1+ POSITION +! R> 1+ R> SWAP 1- С! UPDATE ; ( изменение POSITION полезно, т.к. оно позволяет размещать слова в блоке последовательно с минимальными издержками контроля. )
Блок 115 [115 :0] ( Глава 10. Упражнения 7. 01 из 02 ) ( 1. ) , : DATA-AVE ( первый последний т - средн. ) ROT ROT 1+ SWAP >R >R >R 0 0 R> R> R> OVER OVER - >R DO DUP I METFILE DATALOC @ SWAP >R 0 D+ R>
LOOP .S DROP R> 0 D/ DROP ; ( 2. ) : TEMP-AVE ( первый последний -- средн. ) 1+ SWAP >R >R 0 0 R> R> OVER OVER - >R DO I TEMP @ 0 D+ LOOP R> 0 D/ DROP ; ( 3. ) : CORRECT-TEMP ( начало последний -- ) 1+ SWAP DO I TEMP @ SWAP +! LOOP ;
Блок 116 [116 :0] ( Глава 10. Упражнения 7. 02 из 02 ) ( 4. ) : PUTFILE ( адр-файла адр-данных -- ) DUP @ 1+ 1 DO OVER OVER SWAP I 1- 1024 * + SWAP I 2 * @ BLOCK 1024 CMOVE UPDATE LOOP ; ( 5. ) : SAVEREC ( n1 n2 n3 n4 rec# -- ) DEPTH 5 < IF ." Wrong number of argument" ABORT ELSE METFILE RECLOC >R R@ 6 + ! R@ 4 + ! R@ 2+ ! R> ! THEN ;
Блок 117 [117 :0] ( Глава 10. Упражнения 8. 01 из 02 ) ( 1. ) VARIABLE DELIMITER 32 DELIMITER ! : GETWORD ( адр n -- PAD ) TIB PAD 100 + 80 CMOVE BLK ( Сохранение содержимого буфера) @ >R >IN @ >R TIB 80 0 FILL ( восстановление позднее) + TIB 64 CMOVE 0 BLK ! 0 >IN ! DELIMITER @ WORD DUP С@ 1+ PAD SWAP CMOVE PAD PAD 100 + TIB 80 CMOVE R> >IN ! R> BLK ! ; ( 2.) VARIABLE POSITION 0 POSITION ! : FILEWORD ( адр -- PAD ) TIB PAD 100 + 80 CMOVE BLK @ >R >IN @ >R TIB 80 0 FILL POSITION @ + TIB 64 CMOVE 0 BLK ! 0 >IN ! DELIMITER @ WORD DUP C@ 1+ PAD SWAP CMOVE PAD DUP С@ 1+ POSITION +! PAD 100 + TIB 80 CMOVE R> >IN ! R> BLK ! ;
Блок 118 [118 :0] ( Глава 10. Упражнения 8. 02 из 02 ) ( 3.) : FILENUMBER ( адр - n ) FILEWORD NUMBER DROP ; ( 4.) : TOFILE ( адр1 адр2 -- ) DUP >R POSITION @ + SWAP DUP C@ DUP POSITION +! SWAP 1+ ROT ROT CMOVE DELIMITER @ POSITION @ R> + C! 1 POSITION +! ;
Блок 119 [119 :0] ( Глава 10. Упражнения 8. 01 из 01 ) ( 1.) : NEXTFIELD ( -- ) ADDFILE FILEWORD DROP ; ( 2.) : NEXTREC ( -- ) 4 0 DO NEXTFIELD LOOP ; ( 3.) : FINDPHONE ( -- ) PAD SEARCH$ $! 0 POSITION ! SEARCH-NAME 3 0 DO NEXTFIELD LOOP ADDFILE FILEWORD COUNT TYPE ; ( 4. ) : DELREC ( -- ) POSITION @ ADDFILE + NEXTREC POSITION @ DUP >R ADDFILE + SWAP FINDEOF POSITION @ 4 + R> - CMOVE ;
Блок 120 [120 :0] ( Глава 11. Упражнения 1. 01 из 02 ) : 2VARIABLE ( -- ) CREATE 0 , 0 , ; : 2VARIABLE ( n -- ) CREATE , , @ @ ; ( Последнее описание не является стандартным ) ( 2.) : #CONSTANT ( -- ) CREATE 34 ЦORD DUP C@ 1+ ALLOT ; ( Строка переносится по адресу HERE с помощью WORD и резервируется память для поля параметров производного слова. ) ( 3. ) : RESERVE ( n --) CREATE DUP HERE SWAP ALLOT SWAP 0 FILL ; ( 4.) : BLOCKARRAY ( n -- ) CREATE , 1024 ALLOT ;
Блок 121 [121 :0] ( Глава 11. Упражнения 1. 02 из 02 ) ( 5.) : GETBLOCK ( адр - ) DUP @ BLOCK SWAP 2+ 1024 CMOVE ; ( 2+ необходимо, чтобы обойти откомпилированный номер блока.) : PUTBLOCK ( адр --) DUP @ BLOCK SWAP 2+ SWAP 1024 CMOVE UPDATE ; ( 6.) : B@ ( n1 адр -- n2 ) SWAP 2 * + @ ; : В! ( n1 n2 адр -- ) SWAP 2 * + ! ;
Блок 122 [122 :0] ( Глава 11. Упражнения 2. 01 из 04 ) ( 1. ) : 2CONSTANT CREATE , , DOES> DUP @ SWAP 2+ @ SWAP ; ( 2. ) : MAKEDATE ( месяц день год -- ) CREATE , , , DOES> >R R@ @ 0 TYPE ; ( 3. ) : COUNTER ( n -- ) CREATE , DOES> 1 SWAP +! ; ( Получение значения счетчика командами ' COUNTIT @ в орт-79 иля ' COUNTIT >BODY @ в Форт-83. ) ( 4. ) ( Введите производное слово оператора COUNTER в описание слова; счетчик будет инкрементироваться при каждом обращении. Сброс счетчика должен проводится при каждом запуске программы. )
Блок 123 (123 :t]: ( Глава 11. Упражнения 2. 02 из 04 ) ( 5.) : %COLOR ( n -- ) 100 255 */ 3 .R ." % " ; ( Это слово упрощает следующие три слова. ) : CYAN ( n - ) %COLOR ." Cyan " ; : YELLOW ( n - ) %COLOR ." Yellow " ; : MAGENTA ( n - ) %COLOR ." Magenta " ; : COLOR ( n1 n2 n3 -- ) CREATE ROT , SWAP , , DOES> >R R@ @ CYAN R@ 2+ @ YELLOW R> 4 + @ MAGENTA ; ( CYAN.
YELLOW и MAGENTA компилируются в таком порядке, чтобы упростить возврат при исполнении производных слов. ) ( 6. ) : QUADRATIC ( а b с -- ) CREATE ROT , SWAP , , DOES> >R DUP DUP * R@ @ * SWAP R@ 2+ @ * + R> 4 + @ + ; ( Заметьте, что коэффициенты компилируются в порядке a-b-c. )
Блок 124 [124 :0] ( Глава 11. Упражнения 2. 03 из 04 ) ( 7. ) : M-MENTEM ( n1 n2 -- ) CREATE SWAP , , DOES> >R DUP R@ @ * SWAP R> 2+ @ + / ; ( Для получения большей точности можно применять масштабирование. ) ( 8. ) : ** ( n1 n2 - n3 ) ?DUP 0= IF DROP 1 ELSE DUP 1 = IF DROP ELSE OVER SWAP 1- 0 DO OVER * LOOP SWAP DROP THEN THEN ; ( Это слово было описано в главе 8 и используется для упрощения описания POLYNOM ) ( Продолжеиие в следующем блоке )
Блок 125 [125 :0] ( Глава 11. Упражнения 2. 04 из 04 ) ( 8. продолж. ) : POLYNOM ( n1 n2 ... - ) CREATE DEPTH DUP , 0 DO DEPTH ( 1- в Форт-83 ) ROLL , LOOP DOES> DUP @ SWAP 2+ SWAP >R >R >R 0 R> R> R> 0 DO OVER OVER I 2 * + @ SWAP I ** * SWAP >R SWAP >R + R>
R> LOOP DROP DROP ; ( Коэффициенты компилируются в указанном порядке. "0" заносится на дно стека, чтобы получить результат, который вычислен в цикле do-loop. ) ( 9. ) : ( min max n -- ) CREATE , SWAP , , DOES> >R R@ @ R@ 2+ @ MAX R@ 4 + @ MIN DUP R> ! ; ( Заметьте, что "значение" производного слова скомпили- ровано в первую позицию, позволяя использовать ' или ' >BODY . )
Блок 126 [126 :0] ( Глава 11. Упражнения 3, 01 из 02 ) : DARRAY ( n -- ) CREATE 4 * ALLOT ) DOES> SWAP 4 * + ; ( 2. ) : 1ARRAY ( n - ) CREATE 2 * ALLOT DOES> SWAP 1- 2 * + ; : 1EARRAY ( n -- ) CREATE DUP , 2 * ALLOT DOES> >R 1- DUP 0 < OVER R@ @ 1- > OR IF ." Index error" ABORT ELSE 2 * 2+ R> + THEN ; ( 3. ) : 0CARRAY ( n --) CREATE HERE SWAP DUP ALLOT 0 FILL DOES> + ; ; 0ARRAY ( n -- ) CREATE HERE SWAP 2 * DUP ALLOT 0 FILL DOES> SWAP 2 * + ;
Блок 127 [127 :0] ( Глава 11. Упражнения 3. 02 из 02 ) ( 4.) : PRESERVE ( n1 n2 - ) CREATE DEPTH 0 DO DEPTH ROLL , LOOP ; ( Используйте 1- ROLL в Форт-83) ( 5.) : SAVE-TO-RETURN ( n1 n2 -- ) CREATE DEPTH DUP , 0 DO DEPTH ROLL , LOOP ( Используйте 1- ROLL в Форт-83 ) DOES> DUP @ 0 DO DUP I 2 * 2+ + @ SWAP LOOP DROP ; ( 6. ) : WORD >IN @ >R CREATE R> >IN ! 32 WORD C@ 1+ ALLOT DOES> COUNT TYPE ; ( Занося >IN в стек возвратов, WORD может проводить раэбор слова дважды.
Первый раз формируется заголовок, где имя используется оператором CREATE. Второй раз это же имя пересылается в поле параметров слова. )
Блок 128 [128 :0] ( Глава 13. Упражнения 1. 01 из 02 ) ( 1. ) : TASK ; Позволяет удалить редактор из словаря при отладке. DECIMAL гарантирует, что никая другая система счисления не будет случайно использована. ) ( 2. ) ( Это позволяет при редактировании изменить сразу ряд блоков.) ( 3. ) Таким образом задержки могут быть легко изменены. ) ( 4. ) ( Чтобы позволить с помощью констант определить задержки и сделать програмиу более читаемой ) ( 5. ) : PAGE 27 EMIT 42 EMIT ; ( или 27 42 CONTROL PACE ) : ЗЕС ( ряд столбец -- ) 27 EMIT 61 EMIT SWAP 32 + EMIT 32 + EMIT ;
Блок 129 [129 :0] ( Глава 13. Упражнения 1. 02 из 02 ) ( 6. ) 27 13 CONTROL 27 14 CONTROL 27 15 CONTROL ( Чтобы использовать достаточно убрать скобки) ( 7. ) ( Использование терминальных возможностей, а не их имитации обеспечивает большее быстродействие, более приятную работу и требует меньшей по размеру программы. )
Блок 130 [130 :0] ( Глава 13. Упражнения 2. 01 из 01 ) ( 1. ) Слова в KEYVECTORS предполагаются отлаженными, KEYDO может быть отлажено путем загрузки и исполнения про- граммы через KEYDO. Если оно не работает, нужно ис- пользовать в KEYDO слова-подставки. Блок 10 может быть отлажен при испытании EDITCASE, и затем, в конце концов, редактора. Здесь слова, если надо, могут использоваться слова-подставки. ) ( 2.) : CONTROL-CHAR? ( с -- с f ) DUP 27 < OVER 0 > AND ; : PRINTABLE-CHAR? ( с -- с t) DUP 31 > OVER 127 < AND ; : INSERT-MODE? ( - f ) I/R @ ;
Блок 191 [191 :0] ( Глава 14. Упражнения 01 из 02 ) ( 1. ) ( будет отображено FF FF 00 FF FF 00 10 00 ) ( 2.) ( ЭВМ видает FF FF FF FF 00 00 FF FF 00 00 FF 00 00 10 00 ) ( 3. ) ( WORD производят обычно раэбор по адресу HERE, поэтому область памяти между HERE и следующей используемой зоной, обычно PAD, может использоваться для разбора данных, поступающих с клавиатуры. ) ( 4.) : С, ( с -- ) HERE С! 1 DP +! ; : , ( n - ) HERE ! 2 DP +! ; ( DP, которая хранит указатель словаря, зависит от реализации и может в вашем Форт быть другая. )
Блок 132 [132:0] ( Глава 14. Упражнения 1. 02 из 02 ) ( 5. ) : .MEM ( -- ) SP@ PAD - U. ; ( SP@ зависит от реализации. ) ( 6. ) : NEWPICK ( n1 -- n2) 2 * 'S + @ ; ( 2 * SP@ 2- + @ FORTH-83 ) ( 'S [и SP@] зависят от типа версии. 2- необходимо для описания в Форт-83. так как там индекс PICK начинается с 0) ( 7. ) : NEW.S ( -- ) 'S S0 @ OVER OVER = IF ." Stack empty" DROP DROP ELSE 2- DO I @ -2 +LOOP THEN ; ( 8. ) : ZERО-STACK ( -- ) SP@ S0 @ SP@ - 2- 0 FILL ;
Блок 133 [133 :0] ( Глава 14. Упражнения 2. 01 из 01 ) ( 1. ) : >BODY ( cfa -- pfa) 2+ ; : >NAME ( cfa -- nfa) 6 - ; : >LINK ( cfa -- Ifa) 2- ; : BODY> ( pfa -- cfa) 2 - ; : NAME> ( nfa -- cfa) 4 + ; : LINK> ( lfa -- cfa) 2+ ; : N>LINK ( nfa -- lfa) 4 - ; : L>NANE ( lfa -- nfa) 4 - ; ( Это работает только с версиями Форта, описанными в этой книге. ) ( 2, 3. ) ( Вы должны найти ответы на эти вопросы, используя версию Форта, которой располагаете. ) ( 3. ) : COLONWORDS ( адр1 адр2 -- ) CR 1+ SWAP DO I @ 2526 = ( или другой адрес исполнительной программы "двоеточие" ) IF 1 U. THEN LOOP ;
Блок 134 [134 :0] ( Глава 14. Упражнения 3. 01 из 02 ) ( 1. ) ( Форма использование WORDS, где имя контекстного словаря. Использование полей связи и указателей словарей также обычные слова перед исполнением.) ( ???) ( 2. ) FORTH VOCABULARY A-VOC A-VOC DEFINITIONS : A-FIRST ." The first A-VOC word " ; : A-SECOND ." The second A-VOC word " ; : A-THIRD ." The third A-VOC word " ; : A-LAST ." The last A-VOC word " ; ( 3. ) WORDS лишь выдает список слов в контекстном словаре) ( 4. ) ( Слово из A-VOC не может быть найдено в словаре FORTH )
Блок 135 [135 :0] ( Глава 14. Упрахиеняи 3. 02 из 02 ) ( 5.) A-VOC VOCABULARY B-VOC В-VOC DEFINITIONS : B-FIRST ." The first В-VOC word " ; : B-SECOND ." The second B-VOC word " ; : B-THIRD ." The third B-VOC word " ; : B-LAST ." The last В-VOC word " ; ( Если A-LAST может размещаться в B-VOC, тогда ваши словари связаны.
В противном случае каждый из них связан только с Фортом. ) ( 6. ) В-МЩС DEFINITIONS : A-LAST ." Another В-VOC definition " ; ( Выберите одно из двух описании A-VOC и В-VOC. )
Блок 136 [136 :0] ( Глава 14. Упрахиения 4. 01 из 03 ) ( 2. ) : HELP CONTEXT @ [COMPILE] HELPS FIND ?DUP IF [ FIND HELPS ] LITERAL OVER U< IF EXECUTE ELSE DROP ." not in HELP list" THEN ELSE ." not found. " THEN CONTEXT ! ;
Блок 137 [137 :0] ( Глава 14. Упрахкения 4. 02 из 03 ) ( 2. ) VOCABULARY HELPS HELPS DEFINITIONS BLK @ 2+ CONSTANT BASEBLK ( указание на первый блок) 32 CONSTANT #/BLK ( число статей в блоке ) 32 CONSTANT LENGTH ( длина статьи ) : HELPER ( n -- ) CREATE , ( Создает индекс статей HELP) DOES> DUP #/BLK / BASEBLK + BLOCK SWAP LENGTH * + LENGTH -TRAILING TYPE CR ; 0 HELPER DUP 1 HELPER DROP 2 HELPER SWAP 3 HELPER OVER 4 HELPER ROT 5 HELPER - 6 HELPER + 7 HELPER * 8 HELPER / --> ( Каждое из слов должно соответствовать статье в блоке данных. )
Блок 138 [138 :0] ( Глава 14. Упражнения 4. 03 из 03 В след. блоке данные) ( 2. продолж. ) FORTH DEFINITIONS : HELP [COMPILE] HELPS FIND ?DUP IF [ FIND HELPS ] LITERAL OVER U< IF EXECUTE ELSE DROP ."Not in HELP list." THEN ELSE ." not found" THEN [COMPILE] FORTH ; ( Используйте ['] HELPS вместо [ FIND HELPS ] LITERAL в Форт-83. [COMPILE] необходимо только в Форт, где контекстные словари являются словами немедленного исполнения. ) ( Используйте редактор для запоминания описаний; следующий блок может служить примером. Эта версия HELP воспримет описания из любого числа блоков начиная с BASEBLK. )
Блок 139 [139 :0]
= stack ( n -- n n ) = stack ( n1 n2 -- n1 ) = stack ( n1 n2 -- n2 n1 ) = stack ( n1 n2 -- n1 n2 n1 ) = stack ( n1 n2 n3 -- n2 n3 n1 ) = substract ( n1 n2 -- n3 ) = add ( n1 n2 -- n3 ) = multiply ( n1 n2 -- n3 ) = divide ( n1 n2 -- n3 )
Блок 140 [140 :0]
( Глава 15. Упражнения 1. 01 из 02 ) ( 1.) : ?COMPILE ( CFA -- ) STATE @ IF , ELSE EXECUTE THEN ; ( 2. ) : 83COMPILE ( cfa f --) DUP 1 = IF DROP EXECUTE EXIT THEN STATE @ AND 0= IF EXECUTE ELSE , THEN ; ( В Форт-83 FIND производит поиск в словаре до компиляции или исполнения, т.е.
во время интерпретации. ) ( 3. ) : N' ( --cfa ) 32 WORD FIND 0= IF DROP ." Word net found " ABORT THEN ; ( 4.) : ?COMPILE ( cfa --) STATE @ IF DUP . , ELSE EXECUTE THEN ; ( 5.) ( >IN указывает на точку в тексте. откуда продолжается интерпретация после того, как слово найдено)
Блок 141 [141 :0] ( Глава 15. Упражнения 1. 02 из 02 ) ( 6.) Сброс указателя входного потока вызывает зацикливание) ( 7.) ( Цикл будет продолжаться, так как таковы условия во входном потоке ) ( 8. ) ( Будет отображено только 5, так как 0 во входном потоке остановит интерпретацию. )
Блок 142 [142 :0] ( Глава 15. Упражнения 2. 01 из 02 ) ( 2. ) Исполнительная программа "двоеточие" является одной и той же для всех слов типа двоеточие. Т.о. поле ) ( 3.) ( программы BASE? будет тем же самым. ) ( Используя FIND [ или ' ] в DUMP, вы мохете увидеть, что поля параметров содержат CFA слов описания. Вам следует уметь отслеживать исполнение.) ( 4. ) ( Если содержимое LF в 2DUMMY указывает на 1DUMMY, замените его содержимое так, чтобы оно указывало на то, на что указывает LF слова 1DUMMY. ) ( 5. ) ( Измените CFA в PFA слова 3DUMMY на CFA слова 1DUMMY. Чтобы 3DUMMY ничего не делало, занесите CFA слова EXIT в первую позицию поля параметров 3DUMMY. )
Блок 143 [143 :0] ( Глава 15. Упражнения 2. 02 из 02 ) ( 6. ) ( Выполним эксперимент и поменяем содержимое первой позиции в поле параметров на значение CFA слова, выполнение которого желательно. )
Блок 144 [144 :0l ( Глава 15. Упражнения 3. 01 из 02 ) ( 1.) : .LOC1 ( --) BLK @ . >IN @ . ; IMMEDIATE : .LOC2 ( --) BLK @ . >IN @ 64 / . ; IMMEDIATE ( 2. ) ( Помещаем это между [ и ] . ) ( 3. ) ( Помещаем это между [ ] или описываем ) : .SI .S ; IMMEDIATE ( 4. ) ( Вы выйдете из состояния компиляции и ; приведет к ошибке. ) ( 5. ) ( Да. [COMPILE] может компилировать обычные слова, но это избыточно. ) ( 6. ) ( Вы можете обнаружить в стеке 239, или ваш Форт контролирует при интерпретации ошибки и выдает сообщение об ошибке.)
Блок 145 [145 :0] ( Глава 15.
Упражнения 3. 02 из 02 ) ( 7. ) CREATE OPERATOR ] + - * / [ : MATH ( n1 n2 n3 - ) 1- 2 * OPERATOR + @ EXECUTE ; ( Понятно, что использование [ и ] является более простым способом формирования исполнительных векторов, чем применение FIND или ' .)
Блок 146 [146 :0] ( Глава 15. Упражнения 4. 01 из 01 ) ( 1. ) START-ЦHERE? BLK @ [COMPILE] LITERAL ; IMMEDIATE ( 2. ) : GET/# ( n -- ) PAD DUP 8 EXPECT 1- NUMBER DROP ; : ?RATE ." current rate? " GET# ; IMMEDIATE ( 3. ) : CONVERTS ( n -- ) ?RATE LITERAL 100 */ ; ( 4. ) : ENGLAND [ CR ." Dollars to pounds " ] ?RATE LITERAL 100 */ ; : DENMARK [ CR ." Dollars to kroners " ] ?RATE LITERAL 100 */ ; : GERMANY [ CR ." Dollars tо marks " ] ?RATE LITERAL 100 */ ; ( 6. ) : ?COMP ( -- ) STATE @ 0= IF ." Compile only! " ABORT THEN ; ( 7. ) ( TEST1 выполнит DUP . Выполнение TEST с клавиатуры даст ошибку, так как COMPILE содержат ?COMP . )
Блок 147 [147 :0] ( Глава 15. Упражнения 5. 01 из 03 ) ( 1.) ( Ячейка, предшествующая той, в которой записано чис- ло 3, содержит CFA слова LIT. Первая ячейка в поле параметров будет содержать CFA слова ЁBRANCH. Сразу вслед за ним следует число, абсолютный или относи- тельный адрес слова. Это позволит вам понять, как работает ЁBRANCH [с абсолютными или относительными CFA адресами]. После адреса следует CFA слова, ко- торое заносит в стек 1 и за которым следует CFA слова BRANCH. За числом 3 следует CFA слова EXIT.
Блок 148 [148 :0] ( Глава 15. Упражнения 5. 02 из 03 ) ( 2. ) : .CMP CR ." Here =" HERE U. ." Stack = " .S ; IMMEDIATE ( 3. ) HEX : LOOK-AT-lF ( f --) .CMP IF 1 .CМР ELSE 2 .CМР THEN .СМР 3 ; DECIMAL ( HERE увеличивается по мере компиляции ?BRANCH, LIT, адресов и чисел. Стек содержит число, которое зане сено туда оператором : ( и которое проверяется и удаляется оператором ; с целью проверки сохранности состояния стека]. За этим числом следует абсолютные или относительные адреса передачи управления, ис- пользуемые операторами ELSE и THEN.) ( 4. ) ( TEST выдаст на дисплей 5, так как LIT и 5 были скомпилированы в поле параметров с помощью [ 174 , 5 . ].)
Блок 149 [149 :0] ( Глава 15. Упражнения 5. 03 из 03 ) ( 5. ) ( Ниже предполагается, что 3301 равно CFA слова LIT. ) : NEWLITERAL ?СОМР 3301 , , ; IMMEDIATE : NEWDLITERAL ?COMP SWAP 3301 , , 3301 , , ; IMMEDIATE ( 6. ) ( Ниже предполагается, что 3265 равно CFA слова ?BRANCH и что 3257 равно CFA слова BRANCH. : NEWIF ?СОMР 3265 , HERE 0 , ; IMMEDIATE : NEWELSE ?COMP 3257 , HERE 0 , HERE ROT ! ; IMMEDIATE
Блок 150 [150 :0] ( Глава 15. Упражнения 6. 01 из 02 ) ( 1. ) : TASK ; FIND TASK @ CONSTANT COLON-ADDR ( ' TASK @ в 83 ) COLON-ADDR >R HERE R@ , ] ." Word#0 " EXIT [ CONSTANT 0WORD HERE R> , ] ." Word#1 " EXIT [ CONSTANT 1WORD ( 2. ) : ANYWORD [ 0WORD , 1WORD , ] ; ( 3. ) : MAKEWORD CREATE 1WORD , 0WORD , DOES> SWAP 2 * + @ EXECUTE ; ( 4. ) : GIVE-NAME CREATE , DOES> @ EXECUTE ; ( 5. ) COLON-ADDR HERE SWAP , ] ." Word#2 " EXIT [ : 2WORD [ SWAP , ] ; ( если в стеке хранится число, засланное оператором : . )
Блок 151 [151 :0] ( Глава 15. Упражнения 6. 02 из 02 ) ( 6. ) ( Опишите) : ?BR 3265 , ; : BR 3257 , ; ( или другие адреса ) ( Используется вместо COMPILE ?BRANCH и COMPILE BRANCH в описании IF и ELSE . ) ( 7. ) ( Опишите следующее ниже и используйте вместо COMPILE LIT в описании LITERAL . ) : LT 3301 , ; ( Или другой соответствующий адрес.)
Блок 152 [152 :0] ( Глава 15. Упражнения 7. 01 из 02 ) ( 1. ) ( Адреса являются ячейками в поле параметров, где запоминаются очередные CFA. подлежащие исполнению. ) ( 2. ) ( Осуществляется переход к завершению 3LEVEL. ) ( 3. ) ( Использование R> DROP в 3LEVEL удалит адрес, который определяет куда будет передано управление после выполнения слова, что вызовет сбой в работе внутреннего интерпретатора и разрушение системы. ) ( 4. ) ( WP можно использовать для получения значения константы) ( 5.) ( В обоих случаях EXIT передает управление в точку, откуда было осуществлено обращение к слову. )
Блок 153 [ 153 :0] ( Глава 15. Упражнения 7. 02 из 02 ) ( 6. ) ( LIT увеличивает число в стеке возвратов и ( удаляет из стека откомпилированное число.
Выполнение программы ." делает то же самое для скомпилированных строк. )
Блок 154 [154 :0] ( Глава 15. Упражнения 8. 01 из 01 ) ( 1. ) : FACTORIAL ( n -- ) 1 SWAP 1+ 2 DO I * LOOP ; ( 2. ) : SHOWASCII ( n1 n2 -- ) 1+ SWAP DO I 3 .R I SPACE EMIT 3 SPACES LOOP ; : SHOWASCII ( n1 n2 -- ) SWAP DUP DUP 3 .R SPACE EMIT 3 SPACES 1+ SWAP OVER OVER UNTIL DROP ; : RGENERATIONS ( 0 1 -- n ) SWAP 1+ SWAP DUP + DUP 2000 < IF MYSELF ELSE DROP THEN ;
Блок 155 [155 :0] ( Глава 16. Упражнения 1. 01 из 03 ) ( 1. ) ( Z80 DROP E1 NEXT POP HL NEXT 8088 DROP 5B NEXT POP BX NEXT Z80 DUP E1 E5 E5 NEXT POP HL PUSH HL PUSH HL NEXT 8088 DUP 5B 53 53 NEXT POP BX PUSH BX PUSH BX NEXT Z80 OVER E1 D1 D5 E5 D5 NEXT POP HL POP DE PUSH DE PUSH HL PUSH DE NEXT 8088 OVER 5B 5A 52 53 52 NEXT POP BX POP DX PUSH DX PUSH BX PUSH DX NEXT
Блок 156 [156 :0] ( Глава 16. Упражнения 1. 02 из 03 ) ( 2. ) ( HEX ASSEMBLER ) ( Z80 CREATE TUCK HERE DUP 2- ! E1 C, D1 C, E5 C, D5 С, E5 С, NEXT 8088 CREATE TUCK HERE DUP 2- ! 5В С, 5A C, 53 С, 52 С, 53 C, NEXT ( 3. ) ( Z80 CREATE NIP HERE DUP 2- ! E1 C, D1 C, D5 C, NEXT 8088 CREATE NIP HERE DUP 2- ! 5В С, 5A С, 53 С, NEXT ) ( 4. ) DECIMAL ( ROT = POP HL POP DE EX [SP],HL PUSH DE PUSH HL NEXT SWAP = POP HL EX [SP],HL PUSH HL NEXT
Блок 157 [157 :0] ( Глава 16. Упражнения 1. 03 из 03 ) ( 5. ) ( -ROT = POP HL POP DE EX (SP),HL PUSH HL PUSH DE NEXT -ROT = POP AX POP BX POP CX PUSH BX PUSH CX PUSH AX NEXT ) ( 6.) ( Приращение указателя стека осуществлятся командой INC SР или эквивалентной.)
Блок 158 [158 :0] ( Глава 16. Упражнения 2. 01 из 04 ) ( 1. ) ( Z80 ) CODE DUP HL POP HL PUSH HL PUSH NEXT END-CODE CODE OVER HL POP DE POP DE PUSH HL PUSH DE PUSH NEXT END-CODE CODE ROT DE POP HL POP E3 C, ( HL SP EX ) DE PUSH HL PUSH NEXT END-CODE CODE 2DUP HL POP DE POP DE PUSH HL PUSH DE PUSH HL PUSH NEXT END-CODE CODE TUCK HL POP DE POP HL PUSH DE PUSH HL PUSH NEXT END-CODE CODE NIP HL POP DE POP HL PUSH NEXT END-CODE CODE -ROT HL POP DE POP E3 C, ( HL SP EX ) DE PUSH HL PUSH NEXT END-CODE
Блок 159 [159 :0] ( Глава 16. Упражнения 2. 02 из 04 ) ( 1. продолж. ) ( 8088 ) CODE DUP BX POP BX PUSH BX PUSH NEXT END-CODE CODE OVER BX POP CX POP BX PUSH CX PUSH BX PUSH NEXT END-CODE CODE ROT BX POP CX POP DX POP CX PUSH DX PUSH BX PUSH NEXT END-CODE CODE 2DUP BX POP CX POP BX PUSH CX PUSH BX PUSH CX PUSH NEXT END-CODE CODE NIP BX POP CX POP BX PUSH NEXT END-CODE CODE TUCK BX POP CX POP BX PUSH CX PUSH BX PUSH NEXT END-CODE CODE -ROT BX POP CX POP DX POP BX PUSH CX PUSH DX PUSH NEXT END-CODE
Блок 160 [160 :0] ( Глава 16. Упражнения 2. 03 из 04 ) ( 2. ) ASSEMBLER DEFINITIONS : PSH AX PUSH NEXT END-CODE ; ( 3. ) ASSEMBLER DEFINITIONS : PSH3 BX PUSH DX PUSH AX PUSH NEXT END-CODE ; ( 4. ) ASSEMBLER DEFINITIONS : ;C NEXT END-CODE ; ( 5. ) FORTH DEFINITIONS CODE @REGS DI PUSH SI PUSH SP PUSH DX PUSH CX PUSH BX PUSH AX PUSH NEXT END-CODE : .REGS @REGS 7 0 DO 8 .R LOOP ; ( 6. ) CODE - DX POP AX POP DX AX SUB AX PUSH NEXT END-CODE
Блок 161 [161 :0] ( Глава 11. Упражнения 2. 04 из 04 ) ( 7а. ) : ARRAY CREATE 1+ 2* ALLOT ;CODE AX POP AX AX ADD BX AX ADD 2 # AX ADD AX PUSH NEXT END-CODE ( 7b. ) : DARRAY CREATE 1+ 4 * ALLOT ;CODE AX POP AX AX ADD AX AX ADD BX AX ADD 2 # AX ADD AX PUSH NEXT END-CODE ( 7c. ) ( Это требует лишь 1/3 времени от того. что нужно опнсаниям. в которых использовано DOES> ) : CONSTANT CREATE , ;CODE 2 # BX ADD [BX] PUSH NEXT END-CODE ( 7d. ) : 2CONSTANT CREATE , , ;CODE 4 # BX ADD [BX] PUSH 2 # BX SUB [BX] PUSH NEXT END-CODE ( Эти описания предполагают, что при обращении BX содержит CFA слова и что PFA отстоит от CFA на два байта. Это соответствует требованиям MMSFORTH. )
Блок 162 [162 :0] ( Глава 16. Упражнения 3. 01 из 01 ) ( 1. ) ASSEMBLER DEFINITIONS 0 CONSTANT ВС 2 CONSTANT DE 4 CONSTANT HL 6 CONSTANT AF : 1Z80ARG ( n -- ) CREATE , DOES> @ SWAP 8 * + С, ; 193 1Z80ARG (POP) 187 1Z80ARG (PUSH) FORTH DEFINITIONS ( 2. ) CODE IF=DROP AX POP BX POP AX BX CMP ~ Z IF BX PUSH AX PUSH THEN NEXT END-CODE ( 3. ) ( Следующее слово почти в 3 раза быстрее, чем 2 * .) CODE 2* AX POP AX AX ADD AX PUSH NEXT END-CODE ( 4. ) CODE 10* 0 # BX MOV 0 # CX MOV AX POP 10 # DX MOV BEGIN BX INC DX CX ADD AX BX CMP Z UNTIL CX PUSH NEXT END-CODE
Блок 163 [163 :0] ( Глава 16. Упражнения 4. 01 из 01 ) ( 1. ) LABEL SAVESTACK [ неиспольз. peг.] POP AX PUSH BX PUSH CX PUSH DX PUSH [тот же регистр] PUSH RET END-CODE ( Применяйте неиспользуемый регистр в вашем Форте для хранения адреса возврата, который заносится в стек при обращении к SAVESTACK) ( 2. ) CODE PLOTEMIT ( n1 n2 -- ) DX POP CX POP FF00 CALL NEXT END-CODE ( 3. ) CODE GETDATA ( n1 -- n2 ) AX POP FF00 CALL AX PUSH NEXT END-CODE ( 4. ) CODE CETDATA ( n1 -- n2 ) AX POP BX PUSH SI PUSH FF00 CALL SI POP BX POP AX PUSH NEXT END-CODE
Г. ASCII Коды
Управляющие коды и их значения в базовом телеграфном стандарте представлены ниже в таблице; альтернативные значения даны в скобках. Немногие ЭВМ (если вообще такие существуют) или современные терминалы используют все эти значения, и только некоторые распознают все комбинации "CTRL-клавиш", в особенности коды "CTRL-клавиш" в верхнем регистре. Несмотря на это, многие коды, такие как "BS", перевод строки - "LF", "TAB", и т.д., распознаются, поэтому это руководство будет полезным. Некоторые ЭВМ и терминалы используют также нестандартные символы для некоторых символьных кодов, в частности для [ , \, ],*.-,{, |, } и ~.
Управляющие коды Десятич. Шестнадц. ASCII Примечания 000 000 NUL Нуль, подача ленты. CTRL-SHIFT P в верхнем регистре 001 001 SOH Начало заголовка [SOM, начало сообщения], CTRL-A 002 002 STX Начало текста [ЕОА, конец адреса]; CTRL-B 003 003 ЕТХ Конец текста [ЕОМ, конец сообщения], CTRL-C 004 004 EOT Конец передачи, отбой в системе телетайпной связи. отбой для (TWX) телетайпов, отключение некоторых наборов данных, CTRL-D 005 005 ENQ Запрос [WRU, "Кто вы"].переключатель идентификации ("Здесь...") на удаленной станции,если это предус мотрено; CTRL-E 006 006 ACK Подтверждение [RU,"Вы. . .?"]; CTRL-F 007 007 BEL Звуковой сигнал;CTRL-G 008 008 BS Смещение курсора влево, стирание символа слева от курсора; CTRL-H 009 009 HT Горизонтальная табуляция: CTRL-I 010 00A LF Перевод строки: CTRL-J 011 00B VT Вертикальная табуляция; CTRL-K 012 00C FF Переход на начало следующей страницы; CTRL-L 013 00D CR Возврат каретки на начало строки; CTRL-M 014 00E SO Выход из режима;смена шрифта или цвета ленты; CTRL-O 015 00F SI Вход в режим, возврат к стандартному шрифту или цвету ленты; CTRL-N 016 010 DLE Освобождение канала данных [DCO]; CTRL-P 017 011 DC1 Управление устройством 1; включение перфосчитывателя:(X вкл): CTRL-Q 018 012 DC2 Управление устройством 2; включение ленточного перфоратора (Вспом-вкл.); CTRL-R 019 013 DC3 Управление устройством 3: выключение перфосчитывателя (X выкл.); CTRL-S 020 014 DC4 Управление устройством 4; выключение перфоратора (Вспом.
выкл.); CTRL- T 021 015 NAK Негативное подтверждение [ERR, ошибка]; CTRL-U 022 016 SYN Пассивная синхронизация [SYNC]; CTRL-V 023 017 ETB Конец передачи блока [LEM, логический конец носителя]; CTRL-W 024 018 CAN Отмена [S0]; CTRL-X(Начало сообщения "можно") 025 019 ЕM Конец носителя [S1];CTRL-Y 026 01A SUB Подстановка [S2]; CTRL-Z 027 01В ESC Префикс ESC [S3]; CTRL-K в верхнем регистре или клавиша ESC 028 01С FS Разделитель файлов; CTRL-L в верхнем регистре 029 01D GS Групповой разделитель; CTRL-M в верхнем регистре 030 01Е RS Разделитель записей; CTRL-N в верхнем регистре 031 01F US Разделитель элементов; CTRL-O в верхнем регистре
Таблица КОДОВ Де- Шест- ASCII Де- Шест- ASCII Де- Шест- ASCII сят над- сят над- сят над- цатер цатер цатер 032 020 Пробел 064 040 @ 096 060 ` 033 021 ! 065 041 A 097 061 а 034 022 " 066 042 B 098 062 b 035 023 # 067 043 C 099 063 с 036 024 $ 068 044 D 100 064 d 037 025 % 069 045 Е 101 065 e 038 026 & 070 046 F 102 066 f 039 027 ' 071 047 G 103 067 g 040 028 ( 072 048 H 104 068 h 041 029 ) 073 049 I 105 069 i 042 02A * 074 04A J 106 06A j 043 026 + 075 04В К 107 06В k 044 02С , 076 04С L 108 06С l 045 02D - 077 04D M 109 06D m 046 02Е . 078 04Е N 110 06Е n 047 02F / 079 04F O 111 06F о 048 030 0 080 050 Р 112 070 p 049 031 1 081 051 Q 113 071 q 050 032 2 082 052 R 114 072 r 051 033 3 083 053 S 115 073 s 052 034 4 084 054 Т 116 074 t 053 035 5 085 055 U 117 075 u 054 036 6 086 056 V 118 076 v 055 037 7 087 057 W 119 077 w 056 038 8 088 058 X 120 078 x 057 039 9 089 059 Y 121 079 y 058 03A : 090 05A Z 122 07A z 059 03B ; 091 05В [ 123 07B { 060 03C < 092 05C \ 124 07С | 061 03D = 093 05D ] 125 07D } 062 03Е > 094 05Е ^ 126 07E ~ 063 03F ? 095 05F _ 127 07F DEL
В. Источники информации
Список систем Форта, публикаций и организаций не является исчерпывающим, такой задачи и не ставилось. Скорее,-это список источников, с которыми авторы знакомы и которые они сочли полезными.
Системы Форта
Ниже рассмотрим системы Форта, которые предоставляют по крайней мере минимум средств для разработки программ. Мы не включили в перечень версии Форта, о которых мы не смогли получить достаточно информации для оценки, мы не ввели в список некоторые реализации Форта, которые не сочли отвечающими высоким требованиям. Но мы, вероятно, пренебрегли некоторыми версиями Форта, достойными упоминания. Если мы не упомянули вашего любимца, пожалуйста, простите нас. Информация о конкретной системе может быть также неполной. Например, мы полагаем, что к моменту выхода книги по крайней мере две из нижеупомянутых реализации Форта будут, вероятно, иметь версии, работающие на других ЭВМ. И мы упомянули только те улучшения, которые "выше нормы". Мы предполагаем, любая нормальная версия Форта имеет редактор, ассемблер, библиотеку для работы с числами двойной длины и т.д., хотя эти средства и не являются обязательными в соответствии со стандартами, большинство версий имеют также много полезных средств, которые мы не упомянули, потому что они специализированные, или в силу того. что их нельзя описать достаточно кратко. Таким образом, мы не упомянули об использовании в MMSFORTH операторов QUAN, массивов, условных структур и других сходных программных средств. Аналогично мы не описали слово из F83 VIEW, которое позволяет сразу найти блок с исходным текстом описаний нужного слова, сегментную структуру словаря HS/FORTH и расширенную версию MVPFORTH, комплексную и очень мощную систему разработки программ. Выбор подходящей версии Форт-системы может оказаться обескураживающей задачей, современные системы Форта имеют очень широкий спектр возможностей, и то, что является идеальной системой для одного задания, может оказаться менее удобным для другого. Нужно полагать, что на исследования при выборе системы будет затрачено значительное время.
К сожалению, в журналах не публикуются обзоры по системам Форта, как, скажем, по компиляторам Паскаля. Вам следует изучить литературу и обсудить ваши нужды с несколькими поставщиками. Если поставщик не будет обсуждать ваши проблемы, забудьте об этом, вы, вероятно не получите поддержки при решении ваших проблем после покупки. В некоторых случаях вы можете купить "голую" версию языка и расширять систему по мере необходимости, а в других случаях вы сможете купить копию документации, чтобы выяснить, имеет ли система то, что вам надо. Наконец, вы должны знать, что цена - не всегда мера ценности для Форта. F83 за 25 долл. или даже бесплатно в свободном доступе имеет некоторые возможности, которых нет в некоторых форт-системах ценой более 100 долл. Мы не упомянули одну систему с ценой более 200 долл.. так как нам кажется, что она не соответствует своей цене. В то время как наиболее продвинутая система polyFORTH II стоимостью несколько тысяч долларов предлагает фантастические возможности, потребности большинства программистов можно удовлетворить много более дешевой версией. Рекомендуется просмотреть следующий список в качестве введения, чтобы помочь вам получить больше информации.
FORTH, Inc. 2309 Pacific Coast Highway Hermosa Beach. CA 90254 (213) 372-8493 polyFORTH II. Нестандартный, но близок к Форт-79. Оборудование: слишком широкий список микро- и мини-ЭВМ, чтобы приводить его целиком. Продается по различным ценам с различным диапазоном возможностей и сервиса для пользователя. Особенности - очень широкий спектр возможностей, лишь немногие здесь описаны. Работает с ДОС или автономно, имеются многозадачный и многопользовательский режимы; поддержка баз данных; интерактивная графика; плавающая арифметика 8087. Замечания: это прямой потомок Форта Мура, разработанный компанией, которая была им основана. Хотя polyFORTH не является стандартным и в некотором смысле консервативным, не имеющим некоторых "фантастических" черт других версий, он, пожалуй, представляет собой наиболее профессиональную систему и используется для более сложных и изощренных задач, чем какая-то другая версия.
FORTH Interest Group (FIG) P.O. BOX 8231 Sen Jose, CA 95115 (408) 277-0668 FIGFORTH. Нестандартный, но фактически сам по себе стандарт. Оборудование: 1802, 6502, 6800, 6809, 68000, 8080. 8086/8, 9900. Alfa Micro, Apple II. Eclipse, IBM PC Nova, Pace, PDP-11, VAX, Z80. Для всех этих ЭВМ имеются тексты ассемблеров. Различные рабочие версии имеются в свободном доступе. Особенности: никакие усовершенствования FIG не поставляет. Существует множество усовершенствований в свободном доступе и много опубликовано и периодике FIG, "FORTH Dimensions". Замечания: это, пожалуй, самая распространенная Форт-система, на которой базируются многие коммерческие версии. Несмотря на распространение, он вряд ли пригоден для серьезного применения. FIGFORTH стал де-факто стандартом и усовершенствован многими пользователями.
Harvard Softworks P.O.Box 2579 Springfield, OH 45501 (513) 748-0390 HS/FORTH. Комбинация Форт-79 и Форт-83. Работает под операционной системой. Оборудование: IBM PC и совместимые с ней. Особенности: Исходные тексты в безблочных ДОС-файлах (возможна работа с файлами); средства отслеживания; быстродействующий оптимизатор (быстродействие близкое к машинному); графика; звуковое сопровождение; слова без заголовков; непосредственное пpoграммирование в машинных кодах; плавающая арифметика 8087; неограниченная возможность использования расширенной памяти. Замечания: HS/FORTH очень необычно (но эффективно) использует память, имеет необычную структуру словаря и некоторые другие уникальные черты.
Laboratory Microsystems lnc. P.O.Box 19430 Marina del Rey, CA 90295 (213) 306-7412 Следующие версии являются 16-битовыми: 68066 FORTH, 8080 FORTH, 8086 FORTH, Z80 FORTH, PC/POBTH. Следующие версии являются 32-битовыми: 6800Й FORTH+, 8086 FORTH+, PC/FORTH+. Все работают под ДОС и отвечают требованиям стандарта Форт-83. Оборудование: 68000, 8080, 8086/8, Z-80, CP/M, СР/М-86, СР/М- 68К, MS-DOS, 1MB PC и совместимые. Особенности: отладчик; возможность перекрестных ссылок; использование расширенной памяти; целевой компилятор; средства для работы с файлами; программы для плавающей арифметики; поддержка AMD 9511; графика; любые наборы символов; телекоммуникация; оверлеи словаря.
Micromotion 12077 Wilshire Boulevard Los Angeles, CA 90025 (213) 821-4340 MasterFORTH Форт-83. Работает под ДОС. Оборудование: Macintosh, IBM PC и совместимые, IBM PCjr, APPLE II, серии-СР/М, Commodore 64. Особенности: отладчик; декомпилятор; работа с файлами; описания без заголовков; перемещаемая область компиляции; графика; программы для плавающей арифметики; система перемещения модулей.
Miller Microcomputer Services 61 Lake Shore Roed Natick, MA 01760 (617) 653-6136 MMSFORTH Форт-79. Автономная версия. Возможна работа и с ДОС. Оборудование: TRS-80 модели I, III, 4; IBM PC и совместимые. Особенности: строки; графика; программы для работы с числами с плавающей точкой; арифметика с плавающей точкой 8087; возможность перекрестных ссылок; средства поиска; слова без заголовков; перемещаемая компиляция; адресация к расширенной памяти; произвольный доступ к диску; дисковые форматы по выбору пользователя; буферизатор вывода на принтер; поддержка баз данных; экспертные системы, система управления базами данных; процессор слов; возможность последовательной передачи данных.
Mountain View Press, Inc. P.O.Box 4656 Mountain View. CA 94040 (415) 961-4103 MVP-FORTH Форт-79. Версии для ДОС и автономного использования. Основная система в свободном доступе. Оборудование: CP/M, СР/М-86, MS-DOS, Apple II серия. Macintosh, IBM PC и совместимые. Commodore 64, NEC 8201, TRS- 80/100, HP 110. HP 150. Особенности: не все доступны для всех реализации. Кросскомпилятор; целевой компилятор; программа переноса; отладчик; средства отслеживания; декомпилятор; поддержка расширенной памяти; MS-DOS файл-интерфейс в автономном режиме; описания без заголовков; графика; программы для операций над числами с плавающей точкой; арифметика с плавающей точкой 8087: плавающая арифметика 9511; окна, поддержка системного ПЗУ; экспертная система; процессор слов. Замечания: базовый MVP-FORTH находится в свободном доступе и может быть получен через одну из многих групп пользователей. Фирма Mountain View Press является поставщиком других коммерческих Форт-систем, включая некоторые не упомянутые здесь.
Они являются хорошим источником информации о Форт-версиях, доступных на различных ЭВМ.
Next Generation Systems P.O. Box 2987 Santa Clara, CA 95035 (408) 241-5909 NGS FORTH Форт-79. Работает под ДОС. Оборудование: IBM PC и совместимые. Особенности: режим работы сходен с FIG-FORTH; адресация к расширенной памяти, отладчик; средство отслеживания; декомпилятор; графика.
No Visible Support Software Box 1344 2000 Center Street Berkeley, CA 94704 F83 Форт-83. Работает под ДОС. Оборудование: 8080 CP/M, 8086 CP/M, 68000 CP/M (все на 8- дюймовом диске), IBM PC и совместимые (5-дюймовый диск). Особенности: отладчик; декомпилятор; метакомпилятор; многозадачный режим; строки; теневые блоки. Замечания: свободный доступ; от пользователей можно получить различные реализации в разных дисковых форматах. Хотя и находится в свободном доступе, он является намного более полным, чем FIGFORTH или базовый пакет MVPFORTH (впрочем, он не столь всеобъемлющ, как "развитый" MVPFORTH, который доступен от Mountain View Press). "No Visible Support Software" (" Программа без какой-либо видимой поддержки") - как раз то, что подразумевается именем. Здесь нет какой-либо поддержки пользователя или документации, кроме того, что имеется в коротком текстовом 'файле и в теневых блоках на диске. Теневые блоки, однако, весьма исчерпывающи.
Раrsеc Research Drawer 1776 Fremont, CA 94538 Dealer, Mountain View Рress SuperFORTH 64+AI Форт-79. Работает под ДОС. Оборудование: Commodore 64. Особенности: арифметика с плавающей точкой; графика; строки; отладчик; средство отслеживания; декомпилятор; генерация программ, загружаемых в ПЗУ.
Quest Research Inc. P.O.Box 2553 Huntsville. AL. 35804 (204) 539-8086 FORTH-32 Форт-79. Работает под ДОС. Оборудование: IBM PC и совместимые. Особенности; декомпилятор; отладчик; графика; программа перемещения; полномасштабное применение 32-разрядного адресного пространства памяти; арифметика с плавающей точкой 8087; целевая компиляция.
Shaw Laboralories), Ltd. 24301 Southland Drive, *216 Hayward, CA 94543 (415) 276-5953 TaskFORTH Форт-79, Форт-83 с перекрытием.
Работает под ДОС. Оборудование: СР/М в различных форматах, MS-DOS. Особенности: многозадачный и многопользовательский режимы; отладчик; средства отслеживания; декомпилятор; управление базами данных; иерархическая система файлов; строки; улучшенное управление дисплеем и принтером; целевой компилятор; кросскомпилятор; адресация к расширенной памяти.
Ubiquitous Systems 13333 Belevue-Redmond Road, N.E. Bellcvue. WA 98005 (206) 641-8030 u4th Форт-83 (с ограничениями). Работает под ДОС. Оборудование: различные UNIX и XENIX системы. Plexus. IBM- XT/AT, Intel 286/310, SUN. Tendy 6000. TRS-80 16В, VAX. Особенности: написано на Си, новые примитивы можно написать на Си; целевая компиляция; передача команд в систему UNIX; компиляция в Си-коды; поддержка, где нужно, 32-разрядной адресации; строки; работа в верхнем и нижнем регистрах; компиляция файлов и блоков; динамическое перераспределение памяти; исходные тексты для дополнений, ориентированных на объектные коды.
WL Computer Sytems 1910 Newman Road West Lafayette. IN 47906 (017) 494-2564 WL FORTH Форт-79. Работает под ДОС. Оборудование: IBM PC и совместимые. Особенности: арифметика с плавающей точкой 8087.
Публикации
Мы полагаем, что мы включили все основные книги и периодические издания, которые были к моменту написания книги и которые посвящены Форту. Мы также включили публикации, которые сочли полезными в качестве справочных пособий при работе с Фортом или которые включают материалы по Форту Многие из материалов можно получить от FORTH Interest Group (Группа пользователей Форта), фирм Miller Microcomputer Services и Mountain View Press, а также от других поставщиков Форт-систем (адреса приведены выше).
Книги
1. Anon. 1980. FORTH-79. Публикация группы по стандартам Форта. FORTH Interest Group, Sant Carlos, Сalif. Тексты стандартов для Форт-79. 2. Anon. 1983a. FORTH-83 Standard. Публикация группы по стандартам Форта. Mountain View Press, Mountain View, Calif. Тексты стандартов для Форт-83. 3. Anon. 1983b. MVP-FORTH Source Listing.
Mountain View Press, Mountain View, Calif. Исходный текст ассемблера для базовых MVP-FORTH систем для 8080, IВМ PC и Apple II. 4. Anon. 1980. [без заголовка] FORTH Interest Group, Sant Carlos, Calif. Собрание информационных перепечаток из журнала "BYTE", включая выпуск, посвященный языку Форт. 5. Anderson A., Tracy M. 1984. FORTH Tools. Vol. 1 .Micromotion. Los Angeles, Calif. Вводный текст, рассматривающий только Форт-83. Не предполагает какого-либо знания ЭВМ. Хорошие упражнения и примеры. Не обсуждаются более сложные темы, такие как ассемблер, работа внешнего и внутреннего интерпретаторов и т.д.. но в остальном довольно полное изложение предмета. 6. Brodie L. 1981. Starting FORTH. Prentice-Hall. Englewood Cliffs N.J. Введение в Полифорт с некоторыми упоминаниями отличий от FIGFORTH и Форт-79. Не предполагает предварительного знания ЭВМ. Легко читается, стиль весьма живой. Сложные темы рассмотрены не слишком подробно. Ограниченное число примеров и упражнений. Указатель неполный. Первая достаточно общая книга по Форту и поэтому наиболее популярная. Переведена на русский язык. 7. Brodie L. 1984. Thinking FORTH. Prentice-Hall, Englewood Cliffs N.J. Философия и способ мышления при решении проблем на Форте. Обсуждение составления программ со многими примерами, советами и программными процедурами. Способствует размышлению. 8. Cassady J.J. 1981. MelaFORTH. Распространяется фирмами Mountain View Press, Mountain View, Calif. Исходные тексты метакомпилятора (целевой и кросскомпилятор), написанные на FIGFORTH. 9. Chirlian P. 1983. Beginning FORTH. Matrix. Beaverton, Oreg. Введение, которое не предполагает какого-либо знания в области ЭВМ. Элементарный материал изложен хорошо, с примерами и упражнениями, но наложение тем промежуточного уровня, таких как компиляция и интерпретация, а также слов типа IMMEDIATE, [COMPILE] и COMPILE, недостаточно. Не обсуждаются темы высокого уровня, такие как структура словаря, работа Форта или ассемблера. Хороший указатель. 10. Derick M.
and Baker L. 1982. FORTH Encyclopedia. Mountain View Press, Mountain View, Calif. Детальное описание всех слов FIGFORTH с диаграммами. Очень полезно для понимания того, как работают слова Форта. 11. Edmunds R. 1985. The Prentice-Hall Standard Glossary of Computer Terminology. Prentice-Hall, Englewood Cliffs N.J. Даются общие определения и обсуждается терминология вычислительной техники, включая многие малоизвестные термины. Терминология Форта не рассмотрена. 12. Feierbach G., Thomas P. 1985. FORTH Tools and Applications. Reston, Reston.Va. Краткое, но полезное обсуждение и примеры разработки программ Форта, отладка и приемы программирования. Полезные программы. 13. Haydon G. 1983. All about FORTH. Mountain View Press. Montain View, Calif. Описание, обсуждение и примеры использования всех слов MVP-FORTH. Сравнение слов MVP-FORTH со словами Форт-79 и FIGFORTH. Очень полезно для понимания того, как работает язык. 14. Hofert D. 1985. A Bibliography of FORTH Referances. 2nd ed. The Institute for Applied FORTH Research. Inc.. Rochester. N.Y. Очень полезный, практически полный список перекрестных ссылок на когда-либо опубликованные статьи по Форту. 15. Huang Т. 1983. And So FORTH. Central Book Co., Taipei. Taiwan. Странное, но полезное и очаровательное собрание материалов по истории форта, примеры программ, приложения языка и т.д. Хотя рассматривается как учебник для колледжей, его изложение слишком фрагментарно для этих целей. Пригоден для опытных пользователей Форта. 16. Knecht К. 1982. Introduction to FORTH. Howard W. Sams, Indianapolis, Ind. Краткое введение, основанное на теперь уже устаревшей и нестандартной версии MMSFORTH. Полезные и интересные примеры, но мало или совсем нет материалов по темам промежуточного и высокого уровня сложности. 17. Lipschutz S. 1982. Essential Computer Mathematics. Schaum's Outline Series, McGraw-Hill, New York. Сжатый, но очень полезный краткий курс практической математики в приложении к ЭВМ, где рассмотрены системы счисления, двоичная арифметика, кодирование чисел и букв, булева алгебра, а также векторы и матрицы. 18.
Loeliger R. 1981. Threaded Interpretive Languages. Byte books, Peterborough, N.H. Таинственное, трудночитаемое, перегруженное жаргоном, но очень ценное описание применения цепных интерпретивных языков, в частности Форта. 19. McCabe C.K. 1983- FORTH Fundamentals. Dilithiuro Press, Beaverton, Oreg. Введение, предполагающее небольшое знание ЭВМ, охватывает FIGFORTH и Форт-79. Изложение примерно на уровне книги Броуди с недостаточным изложением продвинутых тем. Плохой указатель делает книгу непригодной для поиска дополнительных материалов. 20. Morgan C. Waite M. 1982. 8086/8088 16-Bit Microprocessor Primer. Byte/McGraw-Hill, Peterborough. N.H. Превосходное изложение архитектуры и набора команд Intel 8088, которое может помочь пониманию нашего описания ассемблера, в гл. 16. 21. Scanlon L. 1982. FORTH Programming. Howard W. Sams, Indianapolis, Ind. Введение в FIGFORTH и Форт-79, которое предполагает некоторое знание вычислительной техники. Рассмотрены основы и некоторые темы промежуточного уровня, совсем оставлены без внимания такие темы, как структура словаря, интерпретаторы или программирование на ассемблере. 22. Ragsdale W. 1980 FIGFORTH Installation Manual. FORTH Interest Group, San Carlos, Calif. Исходные тексты FIGFORTH. Очень полезна для понимания того, как работает Форт. 23. Reymann J. 1983. Understanding FORTH. Alfred Publishing Co., Sherman Oaks, Calif. Короткая брошюра, дающая представление об основных особенностях форта для тех, кто не знаком с языком. 24. Stevens W. 1979. A FORTH Primer. Distributed by the FORTH Interest Group, San Carlos, Calif. Книга извеестна под названием "Kilt Peak Primer", это описание форта, история его создания Чарльзом Муром в Национальной обсерватории Kin Peak. Хотя оно и несколько устарело, в нем содержатся интересные мысли и рассмотрена перспективы развития языка. 25. Ting С. 1983. FORTH Notebook. Offete Enterprises, San Maleo, Calif. Собрание необычных и интересных программ на Форте. 26. Winfield A. 1983. The Complete FORTH.
Sigma/Wiley, New York. Введение, охватывающее Форт- 79 вплоть до промежуточного уровня сложности. Прекрасные примеры и объяснения. Изложение более сложных тем, касающихся того, как работает Форт, ограниченно или отсутствует вовсе. 27. Zaks К. 1980. How to Program ihe Z80. SYBEX, Berkeley, Calif. Превосходное изложение архитектуры и набора команд Z-80, которое поможет в понимании нашего описания ассемблера в гл. 16.
Периодика
Существуют два периодических издания, целиком посвященные языку Форт. "FORTH Dimensions" - журнал, выпускаемый ежемесячно объединением FORTH Interest Group (FIG см. ниже). В нем содержится широкий круг публикаций - от вводных учебных материалов до исходных текстов ассемблеров, метакомпиляторов и т,д. Здесь достигнут прекрасный компромисс между материалами для начинающих и довольно серьезными статьями. Старые, весьма полезные номера можно получить от FIG. Институт прикладных исследований Форта (см. ниже) ежеквартально выпускает профессиональный журнал "The Journal of FORTH Applications and Research". Он включает в себя присылаемые статьи обычно высокого уровня по основополагающим и теоретическим темам. Существуют ежегодные публикации материалов профессиональных конференцийFORTH Interest Group публикует журнал FORML Conference Proceedings", где содержатся статьи, представленные на ежегодное собрание FORTH Modification Laboratory. Статьи имеют тот же уровень, что и в "FORTH Dimensions". Материалы ежегодной Рочестерской конференции по Форту публикуются институтом прикладных исследований по Форту. Хотя трудно точно оценить, статьи близки по уровню "Journal of FORTH Applications and Research". Два универсальных журнала часто содержат материалы по Форту. Журналы "Dr, Dobbs Journal" и "Computer Language" дают некоторое число публикаций по Форту в большинстве номеров, и оба обещают публиковать ежегодно один номер, целиком посвященный Форту. Организации Существуют две организации программистов на Форте.Их адреса: FORTH Interest Group (FIG) P.O. Box 8231 San Josу. CA 95115 и The Insliliite for Applied FORTH Research, Inc. 70 Elmwood Avenue Rochester, NY 14611 Их деятельность описана во введении. Короче говоря, общество FIG является, скорее, любительской организацией. Оно ответственно за распространение FIGFORTH, публикует "FORTH Dimensions", организует встречи, такие как FORML, существую' отделения или группы любителей по всему миру. "The Institute" ставит целью повысить качество применения Форта. Он организует Рочестерские конференции и публикует "Journal of FORTH Applications and Research".
Слова для манипуляций в стеке
Каждое из слов, приведенных в , рассматривается в этом разделе самостоятельно. В конце раздела мы приводим несколько задач на употребление этих слов, которые будут полезны для совершенствования ваших навыков в их использовании.
Прежде чем продолжить описание приведенных в таблице слов, обратим внимание на обозначения в скобках. Как вы уже видели в , в Форте принято применять такие обозначения (они называются диаграммой состояния стека), чтобы показать состояние стека до и после применения какого-либо слова. Правило хорошего тона -- помещать такую диаграмму сразу после имени определяемого слова. Поскольку все, что заключено с двух сторон в скобки (если только после открывающей скобки стоит пробел). Форт при вводе игнорирует, скобки можно использовать для помещения комментариев к Форт-словам. Вот, например, определение слова для сложения двух чисел и умножения на третье число:
: +* (n1 n2 n3 -- п) + * :
Таблица 2.1. Перечень слов для манипуляций в стеке
Слово | Состояние стека ( до - после ) | Действие |
DROP | ( n - ) | Очищает вершину стека |
DUP | ( n - n n ) | Делает копию числа на вершине стека |
SWAP | ( n1 n2 - n2 n1 ) | Переставляет местами два числа |
OVER | ( n1 n2 - n1 n2 n1 ) | Копирует второе число на вершину |
ROT | ( n1 n2 n3 - n2 n3 n1 ) | Перекладывает третье число на вершину |
n PICK | ( n1 ... - n1 ... n1 ) | Кладет на вершину копию п-го элемента |
n ROLL | ( n1 ... - ... n1) | Перекладывает п-й элемент на вершину |
?DUP | ( n - n n ) или ( 0 - 0 ) | Выполняет операцию DUP, если n == 0 |
DEPTH | ( ... - n ) | Возвращает в стек n -- число элементов |
Если мы вводим 3 4 5 + *, то до того, как слово будет исполнено, n1=3, n2=4, n3=5. После операции умножения в стеке находится n, которое имеет значение 27. Перечень принятых обозначений для содержимого стека приведен в .
Таблица 2.2. Обозначения для содержимого стека
Символ | Значение |
n, n1 , | 16-разрядное целое число одинарной длины |
d,d1, . . . | 32-разрядное целое число двойной длины |
U | 16-разрядное число без знака одинарной длины |
ud | 32-разрядное число без знака двойной длины |
char или с | 7-разрядное представление кода символа ASCII |
byte или Ь | 8-разрядное число, байт |
флаг или f | 1 или 0 - булев флаг |
адр, адр1 | Адреса |
$ или $адр | Адрес, где находится строка символов |
Если вы пока еще не усвоили эти обозначения, не огорчайтесь: они станут вам понятнее в последующих главах и мы привели их для использования в последующих ссылках. Обычно ход программы становится более понятным, если вы применяете более содержательные описатели в диаграммах состояния стека. Например, скорость можно обозначить как "скор.", а адрес переменной, содержащей значение скорости, -- как "адр.скор." и т.д. Другой более полный набор символов приведен в стандарте Форт-83, но лучше всего все-таки использовать содержательные обозначения.
А теперь вернемся к рассмотрению каждого из слов для манипуляций в стеке. DROP -- это самое простое слово; оно просто очищает вершину стека, например, после ввода
1 2 3 DROP .S
мы получим
1 2 Ok
Помимо того, что слово DROP полезно для уничтожения неправильно введенных данных при вычислениях (что-то вроде клавиши очистки регистра в калькуляторе), оно чаще всего используется для того, чтобы убрать какие-либо числа из стека во время выполнения программы. Очевидно, при пустом стеке мы получим
хххх DROP ? Stack EMPTY ! (стек пуст!)
или аналогичное сообщение об ошибке. Вас может удивлять, почему Форт не знает о том, что стек пуст, и почему он не игнорирует слово DROP в этом случае. Дело в том, что проверка на наличие ошибок и принятие решения, игнорировать их или не игнорировать, занимает немало времени. В отличие от большинства других языков программирования Форт состоит из полуавтономных процедур -- (слов языка Форт), каждое из которых оптимизировано с точки зрения быстродействия. Если бы в каждое из них было включено принятие решений об ошибках, исполнение слов происходило бы с более низкой скоростью. В Форте принято, что программист, а не язык несет ответственность за предотвращение ошибок. Форт дает вам полный контроль над компьютером, но в то же время и всю полноту ответственности. С другой стороны, разрабатывая программу, вы будете отлаживать каждое ее слово, легко обнаруживая ошибки. И поэтому Форт не нуждается в сложных и требующих больших затрат времени методах контроля ошибок, необходимых другим языкам.
Нетрудно догадаться по названию, что слово DUP (по-англ. "DUPlicate " -- копировать) делает копию верхнего элемента стека.
9 DUP .S
приводит к тому, что в стеке окажется
9 9 ok
Слово DUP, пожалуй, одно из наиболее часто употребляемых слов для манипуляций в стеке. Вы встречались с ним в одном из упражнений . Часто программе требуется одно и то же значение несколько раз. Слово SWAP также, судя по названию (от swap -- обменивать), переставляет местами два верхних элемента стека. Если ввести
3 18 .S
вы получите на экране
18 3 ok
что особенно полезно, если нужно сделать операцию вычитания или деления, но операнды стоят в неправильном порядке. После слова DUP оно применяется наиболее часто. Однако не допускайте, чтобы это сделало вас ленивым. Иногда проще применить слово SWAP перед операцией деления или вычитания вместо того, чтобы заранее предусмотреть в программе требуемый порядок следования чисел в стеке. Использование SWAP может ускорить составление программы, но на этапе исполнения увеличит время работы программы.
Действие слова OVER не очевидно из его названия (через). Попробуйте ввести
1 2 OVER .S
и вы увидите
1 2 1 ok
Можно понять, что второе число в стеке было скопировано на вершину стека. Другими словами, OVER как бы заставляет второй элемент стека "перепрыгнуть" через первый элемент на вершину. Оно очень похоже на слово SWAP, но в отличие от него не удаляет второй элемент стека. Слово может быть полезно во многих случаях, когда какое-либо число должно быть использовано несколько раз. В следующем примере дублируются два верхних элемента стека:
1 2 OVER OVER .S
при этом получается
1 2 1 2 ok
Дублирование двух верхних элементов стека очень полезно, когда в стеке нужно оставить для последующего использования два числа. Предположим, что вам нужно вывести на экран одновременно и сумму, и произведение чисел 5 и 7.
5 7 OVER OVER + . *
выдает в результате
12 35 ok
Конструкция OVER OVER полезна также для сравнения двух чисел.
Дальше мы узнаем, что существует слово 2DUP, которое выполняет ту же функцию, что и OVER OVER. Имеется целое семейство слов, которые оперируют в стеке парами чисел, но, так как они используются главным образом для операций с так называемыми числами двойной длины, мы их рассмотрим в .
Слово ROT (по-англ. "rotate" -- поворачивать) производит ротацию трех верхних чисел стека, т.е. перекладывает третье сверху число в стеке на его вершину, так что
1 2 3 ROT .8
приводит к
2 3 1 Ok
Третье сверху число в стеке перемещается на вершину стека, а следующие два числа продвигаются на одну позицию в глубь стека. Применения слова ROT поначалу не очевидны, но они также важны. Предположим, что вы хотите определить значение выражения (5+2) х (7+3), если в стеке находится 5 2 7 3.
Для решения введите
+ ROT ROT + х .
и вы получите
70 ok
Действие некоторых комбинаций слов, вроде приведенных в этом примере, достаточно трудно понять даже опытному программисту. Поэтому проследить, что происходит в стеке в последнем примере, вам поможет следующая таблица:
Операция | Содержимое стека | Содержимое стека | Операция |
(стек в начале) | (до - после) | (до - после) | |
(5 2 7 3 --) | + | (- 10 7) | |
+ | (-- 5 2 10) | х | (- 70). |
ROT | (- 2 10 5) | (- стек пуст) | |
ROT | (- 10 5 2) |
В отличие от предыдущих слов PICK требует аргумента -- числа, которое указывает, какое по счету число сверху вы хотите скопировать на вершину стека. Аргументом является номер числа, за начало принимается вершина стека, а счет ведется по направлению в глубь стека. Так, например, в стандарте Форт-79 операции
1 2 3 4 5 6 4 PICK .S
приводят к результату
1 2 3 4 5 6 3 ok
Но в стандарте Форт-83 вы увидели бы
1 2 3 4 5 б 2 ok
Это принципиальное и зачастую очень неудобное различие стандартов Форт-79 и Форт-83.
В Форт- 79 принято, что верхний элемент стека имеет номер 1, а в Форт-83 -- номер 0. Таким образом, в стандарте Форт-83 выражение
0 PICK
приводит к такому же результату, что и DUP, в то же время для Форт-79 стандартное слово DUP эквивалентно
1 PICK
Если ввести 0 PICK, в стеке окажется какая-нибудь чушь. Таким образом, PICK, доставая число из глубины стека, не производит в нем других изменений.
Слово ROLL похоже на PICK, но в отличие от него вынимаемое число при перемещении его на вершину на старом месте удаляется. Например, в стандарте Форт-79
1 2 3 4 5 6 5 ROLL .S
приведет к
1 3 4 5 6 2 Ok
в то же время та же операция в стандарте Форт-83 приведет к другому результату:
2 3 4 5 6 1 ok
Нумерация элементов в стеке в стандартах Форт-79 и Форт-83 отличается для оператора ROLL так же, как и для PICK. Эти различия в стандартах важно учитывать при переносе программ из одной версии в другую. Слова ROLL и PICK следует применять, если невозможно использовать ничего другого, так как они работают значительно медленнее, чем DUP, OVER и ROT (эти три слова определены не с помощью слов PICK и ROLL, а непосредственно в машинных кодах). К тому же слово ROLL работает значительно медленнее, чем PICK. Чтобы избежать путаницы, нужно держать в стеке не более четырех чисел, которые используются в данном слове, и, если вы будете придерживаться этого правила, вам редко потребуются слова PICK и ROLL.
А сейчас будет уместно сделать небольшой экскурс в стандарты языка Форт. Как уже указывалось во введении, существуют два известных стандарта -- Форт-79 и Форт-83. Ссылки на основные документы, описывающие стандарты, приведены в приложении В. Различия между стандартами зачастую невелики, однако имеют значение, как, например, в случае ROLL и PICK, и мы обратим на это ваше внимание, когда будем встречаться с этими различиями. Версия, с которой вы работаете, должна соответствовать одному из стандартов, и вы можете определить, какому именно, если введете 79-STANDARD или FORTH-83. Если без ошибки будет принято первое слово, то ваша версия совместима с Форт-79, если же без ошибки будет принято последнее слово, ваша версия соответствует стандарту Форт-83.
Слово ?DUP представляет собой специальный вариант слова DUP. Оно делает копию числа, находящегося на вершине стека, если оно не равно нулю, и не копирует число, если оно равно нулю, Например,
1 4 5 ?DUP .S
дает в стеке
1 4 5 5 ok,
в то время как
1 4 0 ?DUP .S
приводит в результате к
1 4 0 ok
Таким образом, в последнем случае слово ?DUP не производит никаких действий. Оно особенно полезно вместе с конструкцией IF...THEN, примеры этого будут приведены в последующих главах.
Последнее слово в , DEPTH, не производит никаких перестановок в стеке. Вы уже встречали его в . Оно подсчитывает количество чисел в стеке и выдает его на вершину стека. Если ввести
21 131 56 7 89 DEPTH
мы получим
5 ok
где 5 -- это число элементов, находившихся в стеке перед исполнением слова DEPTH. Мы увидим еще применение слова DEPTH в последующих упражнениях.
Слово для просмотра содержимого стека
В некоторых версиях языка Форт имеется служебное слово для представления содержимого стека без разрушения. Будучи полезным для программирования, оно может быть просто необходимым для обучения пользования стеком. Приведенное ниже описание слова .S (печатать_стек) предназначено для тех, у кого его нет в их версии Форт. Попробуйте ввести его (как оно работает, вы поймете к концу этой главы). В стандарте Форт-79 слово .S определяется как
: .S DEPTH ?DUP 0= IF ." Stack empty" (стек пуст) ELSE 0 DO DEPTH ROLL DUP . LOOP THEN ;
в то время как в Форт-83 :
: .S DEPTH ?DUP 0= IF ." Stack empty" ELSE 0 DO DEPTH 1- ROLL DUP . LOOP THEN ;
(Взгляните, чтобы понять различие между этими двумя определениями, на различие в определении слова ROLL.)
Теперь, если вы введете
1 2 3 .S
то увидите на экране
1 2 3 ok
Введите теперь:
. . .
и вы увидите
3 2 1
т.е. убедитесь, что слово .S действительно ничего не изменяет в стеке. Если Вы введете .S, когда стек пуст, то будет напечатано сообщение об ошибке, которое является частью определения этого слова. Буква S часто используется в словах, относящихся к стеку. Поскольку . (точка) означает "напечатать", слово .S имеет вполне логичное имя.
Стек в арифметических операциях
Как вы уже видели, помещение чисел в стек означает попросту ввод их с клавиатуры через пробел или несколько пробелов. Но ради простого помещения чисел в стек и его просмотра не стоит использовать компьютер. Основная часть работы на компьютере связана с операциями над числами, поэтому давайте попробуем проделать некоторые арифметические действия (если вам покажется, что мы повторяем , пожалуйста, перетерпите это вместе с нами). Введите
3 + 5 .
и вы получите бессмысленный ответ. Форт не любит таких выражений. Для него нужно сначала поместить оба числа в стек, прежде чем произвести сложение. Попробуйте ввести
3 5 + .
теперь вы получите
8 ok
т.е. правильный результат. Как вы уже знаете из , Форт использует не такую математическую нотацию, как другие языки. Существуют три наиболее распространенные нотации для представления действий с числами. Префиксная нотация записывается так: " + 3 5 ". Хотя она не получила распространения в арифметике, фактически это самая обычная нотация, поскольку ее применяют в повседневной речи. Когда вы говорите "сложите 3 и 5", вы фактически применяете префиксную нотацию. При префиксной, нотации оператор стоит перед числами (операндами). (Оператор -- это символ или инструкция, которая определяет операцию над одним или более числами, например, +, -, х, "сложить", sin и log -- это все операторы.)
Инфиксная нотация записывается так: " 3 + 5 ". Это наиболее употребительная алгебраическая нотация, при которой оператор располагается между числами-операндами. В языке Форт используется постфиксная нотация. Например, в выражении " 3 5 + " оператор стоит на последнем месте после чисел-операндов. Префиксная нотация называется иногда польской, в честь польского математика Лукашевича, который предложил ее для формальной логики. Постфиксная нотация обычно называется обратной польской записью (поскольку она обратив префиксной нотации). Она используется в калькуляторах фирмы Hewlett-Packard и некоторых других.
Инженеры и ученые обычно предпочитают такие калькуляторы, потому что, как мы далее увидим, не нужно беспокоиться о скобках, как при инфиксной нотации. Если вы привыкли к алгебре, постфиксная нотация поначалу вам покажется странной. На самом деле в ней нет ничего странного. В школе вас, наверное, приучили к решению задач на сложение в такой форме:
3 5 + --- 8
Но ведь это то же самое, что
3 5 + . 8 ok
Хотя учитель, возможно, читал это выражение как "три плюс пять равно восемь", запись говорит вам другое: возьми 3 и 5, сложи их, получишь 8. Действительно это одна из форм стековой нотации, причем числа 3 и 5 заменяются на 8. Стековая природа становится еще более очевидной для скользящего итога, например:
5 2 + ----- 7 3 - ----- 4
где горизонтальная черта служит для того, чтобы показать изменяющееся состояние стека, это что-то вроде смены кадров в кино. Совсем не случайно детей приучают к такой форме, она проще воспринимается, поэтому арифметика на языке Форт оказывается простой как для нас, так и для компьютера.
Может быть, это и очевидно, но вот что происходит в примере со скользящим итогом на языке Форт. Когда вы ввели
5 2 + 3 - .
интерпретатор поместил 5 и 2 в стек. Знак + снимает оба числа из стека, вычисляет их сумму и помещает в стек 7. Затем число 3 из стека помещается сверху числа 7, а оператор - вынимает из стека числа 7 и 3, производит вычитание и помещает в стек 4. Наконец оператор . (точка) вынимает из стека число 4 и представляет его на экране. (Отметьте себе, что в дальнейшем мы не будем говорить вам, когда нажать клавишу , означающую ввод, если это очевидно.) Другой способ выполнить последний пример состоит в том, чтобы ввести
5 2 3 - +
Вы должны проделать все, что делает интерпретатор, и проследить, что получится в стеке, чтобы понять, почему в обоих случаях получается одинаковый результат. Можете ли вы перестроить числа и операторы в стеке по-другому, чтобы получился тот же самый результат ?
Какой бы ни была простой и изящной постфиксная запись на языке Форт, она может использоваться в контексте с алгебраической записью.
Невозможно отрицать, что алгебраическая запись полезна для выражения сложных формул, почему же тогда мы выступаем против нее в компьютерном языке и применяем постфиксную запись ? По двум причинам. Алгебраическая запись избыточна, а для постфиксной требуется меньше места в памяти, кроме того, она также экономит и время компьютера.
Экономия места и памяти переходят в мощность ЭВМ. Вот пример неопределенности в алгебраической записи. Пусть имеется такая запись :
2х3+4х5=?
Возможно несколько ответов в зависимости от порядка, в котором выполняются операции умножения и сложения. Можно избежать неопределенности двумя способами: используя скобки или приписывая операторам порядок следования. На бумаге можно использовать скобки, например:
(2 х 3) + (4 х 5 ) = 26
или
(2 x 3 + 4 ) x 5 = 50
Если Вы программируете на Бейсике, то наверняка знаете, что в нем разрешается пользоваться скобками. Если скобок нет, то и Бейсик, и большинство других языков программирования во избежание двусмысленности приписывают операторам определенный порядок следования, в данном случае первыми производятся операции умножения, а затем операции сложения. Таким образом, если не применять скобок, то результат приведенного примера на Бейсике будет равен 26. Необходимость в скобках или порядке следования операции приводит к тому, что алгебраическая нотация снижает скорость операций на ЭВМ. Чтобы сам компьютер решил, как интерпретировать выражение, ему требуется немалое дополнительное время, а для более подробного указания компьютеру порядка его действий требуется дополнительная память для размещения кода программы. В интерпретирующих языках типа Бейсика это время затрачивается при исполнении программы. В компилирующих языках типа Фортрана или Паскаля это время тратится во время компиляции. Если вы все еще не убедились в том, что постфиксная запись не приводит к неопределенности, вам помогут несколько упражнений.
Учимся на практике
Так же как сложно научиться иностранному языку без собеседника, трудно изучить язык программирования без компьютера. Как тот, так и другой язык лучше всего изучается на практике. Вы можете многое узнать о языке Форт, пользуясь этой книгой, и без компьютера, но хорошо программировать на нем вы не сможете. Мы посвятим первую часть этой главы тому, чтобы вы, проэкспериментировав с языком, почувствовали бы себя увереннее. Во второй части мы рассмотрим Форт более абстрактно, в том числе познакомимся с тем, как он устроен. Итак, попробуем поработать на Форте.
Очевидно, для начала вам надо включить компьютер и загрузить Форт в машину, но компьютеров и версий языка так много, что сделать это нужно, пользуясь руководством для вашей машины.
Если вы готовы, напечатайте на клавиатуре
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). Комментарий о стеке необходим для всех, кроме самых коротких слов. Без него очень легко забыть, как работает программа.
В следующем разделе мы напишем нетривиальную программу, которая будет строить на экране столбиковую диаграмму, или так называемую гистограмму, но сначала вам нужно, чтобы идеи, приведенные в этом разделе, усвоились, а для этого проделайте несколько упражнений.
в этой книге, не являются
Упражнения, которые будут приведены в этой книге, не являются дополнительным приложением к тексту. Они составляют его неотъемлемую часть и должны стать неотъемлемой частью процесса освоения языка. Упражнения составлены так, чтобы служить четырем целям:
тренировке, углублению понимания принципов, изложенных в этой книге, развитию техники программирования, иногда определению слов широкого практического применения.
Вы должны попытаться проделать все упражнения, но, если у вас возникнут затруднения, не стесняйтесь заглянуть в ответы : некоторые задачи бросают вам вызов. Упражнения также помогут вам продвигаться в изучении языка. Мы предлагаем серию упражнений после часа-двух интенсивного изучения текста. Наконец, попробуйте сами придумать собственные упражнения, связанные с вашими личными интересами. Один из лучших способов изучения какого-либо языка программирования -- писать собственные упражнения и программы.
Определите в уме, что будет выведено на экран следующими операциями:
20 2 / . 2 20 / . 1 2 3 * * . 3 2 1 + / . 100 5 DUP * / .
Преобразуйте следующие выражения в обратную постфиксную форму:
1 * 2 1 * 2 / 2 1 + 2 / 3 (1 + 2) / 3 3 / (2 + 1) (3 + 4) / (2 + 1)
Опишите слово POWER4 для возведения числа в четвертую степень, используя слово CUBE. Опишите слово NEWPOWER4 (возведение_в_четвертую_степень) используя слово SQUARE вместо CUBE. Согласно теореме Пифагора квадрат гипотенузы прямоугольного треугольника равен сумме квадратов прилежащих сторон. Определите слово PYTHAGORUS для определения квадрата гипотенузы по заданным в стеке длинам его сторон. Вам может потребоваться слово SWAP (переставить), которое переставляет между собой два числа, находящиеся на верху стека. Так, например,
4 5 SWAP
оставит два верхних числа:
5 4
Определите слово AREA (площадь), которое должно вычислять площадь круга, помноженную на 100, если задан радиус. Используйте число 314 вместо значения числа Пи, помноженного на 100. Используя слово AREA, определите слово VOLUME (объем) для вычисления объема цилиндра, помноженного на 100. В стеке должны лежать значения радиуса -- на вершине и значение высоты цилиндра вторым сверху. Переделайте VOLUME в XVOLUME, которое ожидает данные из стека в обратном порядке (высота цилиндра -- на вершине, радиус -- вторым сверху). Какая программа имеет большую эффективность (с точки зрения быстродействия) ?
Мы собираемся предложить вам модифицировать нашу графическую программу. Проще всего заниматься этим, если вы запишете ее на диск, а затем отредактируете, чтобы внести изменения по условиям упражнения. Форт-система обычно сохраняет программы на дискетах в нумерованных блоках емкостью 1024 символа в каждом, что соответствует размеру экрана (16 строк по 64 символа). Поскольку разные версии Форта отличаются способами хранения и редактирования блоков на диске, рекомендуем обратиться к документации на вашу Форт-систему, чтобы узнать, как сохранить программу на диске. Для того чтобы ввести копию программы на диск, вы будете набирать ее на клавиатуре и пользоваться редактором. Затем программу можно будет загрузить, если ввести номер блока и после него слово LOAD (загрузить), например
68 LOAD
Эта команда вызовет интерпретацию слов, которые с помощью редактора были записаны на диск, так же, как если бы их вводили с клавиатуры. Компьютер не знает и ему безразлично, откуда производится ввод, с клавиатуры или из блока на диске. Большое преимущество этого состоит в том, что можно модифицировать или редактировать программу на диске, не вводя ее каждый раз целиком с клавиатуры. Старую скомпилированную программу можно забыть (т.е. удалить ее из памяти ЭВМ), если ввести FORGET TASK перед вводом измененной программы словом LOAD. Если вы пока не хотите обременять себя изучением редактора, можете каждый раз вводить программу с клавиатуры. Но нельзя просто ввести скорректированное определение какого-либо слова с клавиатуры, если оно входило в определение какого-либо последующего слова. Дело в том, что это последующее слово было скомпилировано раньше совместно со старым определением скорректированного вами слова. В мы подробно обсудим разные редакторы и ввиду того, что многие редакторы, поставляемые с Форт-системами, достаточно примитивны, мы предложим вам редактор, который, возможно, понравится больше. Однако вам все же придется научиться пользоваться редактором вашей Форт-системы хотя бы только для того, чтобы ввести редактор, описанный в .
Прежде чем двигаться дальше, вы должны освоить применение Форта в качестве калькулятора. И не столько для того, чтобы освоить арифметические операции, сколько для того, чтобы научиться прослеживать состояние стека в уме.
Переведите следующие выражения из алгебраической нотации в постфиксную и найдите ответы с помощью компьютера. Нужно быть уверенным, что вы вводите числа в правильной последовательности, и в некоторых случаях вы не сможете ввести все числа, не выполнив сначала некоторых операций.
Зафиксируйте ваши ответы на бумаге по мере выполнения упражнений (записи потребуются для упражнения 2).
5 + 5 + 5 5 4 (5 + 5) х 5 (5 + 5) / 5 0.5 х (5 + 5) 10 / (5 + 5) (наши числа целые ... найдите выход) (5 + 4) / (5 + 5) 5х5+5х4+4х4 (5 + 4) х (5 + 4) (5 + 4)^2
Проделайте примеры из упражнения 1 по-другому, т.е. перестроив числа и операторы. Раскрывая алгебраическое выражение, нужно начать с выражения в скобках, которое находится в самой глубине этого выражения. Опишите последовательность, в которой вы будете делать вычисление следующего выражения:
16 х (2 х ((3 + 5) / 4)) = ?
Например, первой операцией должно быть сложение 3 и 5. Теперь переведите вашу последовательность действий в постфиксную форму и найдите решение на Форте. Вы убедитесь, что постфиксная форма не приводит к неопределенности. Оцените значение следующих выражений, как вы это делали в упражнении 3.
(2 + (5 х (9 + 3) / 6)) 32 =? (32 х (2 х (3 х (5 + 6) х 3))) = ? 2 х ((22 х (5 + 4)) + (2 + 5 х 10))) = ?
Рассмотрим пример из упражнений 1 и 2. Скорее всего, вы решали его следующим образом:
5 4 + 5 4 + *
Как вы уже знаете, имеется слово DUP, которое делает копию числа, находящегося на вершине стека, т.е.
4 3 DUP
приводит к тому, что в стеке останется
4 3 3
Можете ли вы сделать упражнение, используя DUP и вводя только по одному разу числа 5 и 4 ? Можете ли вы использовать слово DUP в остальных упражнениях ? Слова для манипуляций в стеке очень полезны, они упрощают операции, экономя время и память.
Они могут показаться вам вначале очень простыми, но потом будут усложняться. Если даже они покажутся вам скучными, пожалуйста, проделайте их. Одной из самых важных компонент изучения Форта является освоение работы со стеком настолько, чтобы вы чувствовали себя с ним комфортно, а слова, связанные с манипуляциями в стеке, стали бы вашей второй натурой. Затраченное вами время сторицей окупится впоследствии.
Напишите слово или слова, с помощью которых содержимое стека изменялось бы в соответствии с заданием. Стараи тесь обойтись минимумом слов. (Мы пользуемся здесь буквами вместо чисел, чтобы у вас возникла уверенность, что эти при меры пригодятся и в более общих ситуациях.)
До После До После До После (а) а b b а (б) а b а b b (в) а b а b а (г) а b а а b (д) а b b b а (е) а b с b с а (ж) а b с а с b (з) а b c с b а (и) а b с b а с (к) а b c с а b (л) а b c а b b c (м) а b с а а b с (н) а b а а b b (о) а b c а а b b с с
Принимая содержимое стека таким, как показано, напишите слово или слова для вычисления выражений. Снова ста райтесь обойтись минимальным количеством слов.
Стек Выражение Стек Выражение (а) а b ab (б) а b ab^2 (в) а b2 а + b (г) а b а b (д) а b a^2b^3 (е) а b а(а + b) (ж) a b a^2+2ab+b^2 (указание: разложите на множители) (з) а b с (а + b)/с (и) а b с (a+b)/(b+c) (к) а b с (а+с)/(b+с) (л) а b c (a+b)/(2c) (м) а b c а/(2с)+Ь/(2с) (н) а b с (b-a)(b-c) (о) а b c d ab+ac+ad (п) a b c d ab+abcd
Не применяйте ROLL и PICK ! Напишите новое определение слова OVER (NEWOVER), используя другие слова. Слово 2DUP выполняет следующие операции в стеке :
( n1 n2 - n1 n2 n1 n2 )
Оно применяется для чисел двойной длины. Напишите определение этого слова под именем NEW2DUP, используя для этого только два слова. Определите слова DUP и OVER, используя PICK. Проделайте это для обоих стандартов. Дайте этим словам новые имена во избежание путаницы. Определите ROT, используя слово ROLL. Проделайте это для стандартов Форт-79 и Форт-83. Дайте этому слову новое имя. Слово 2SWAP выполняет в стеке следующие операции:
( n1 n2 nЗ n4 - nЗ n4 n1 n2).
Определите это слово на Форт-79 и Форт-83. Определите слово ROTSTACK, которое производило бы ротацию элементов стека независимо от его длины. Если в стеке находится а Ь с d e f, то после исполнения ROTSTACK в нем должно быть Ь с d e f а. Используйте для этого только два слова. Проделайте это на Форт-79 и Форт-83. Объем сферы выражается формулой 4/ЗПи * r^3. Напишите слово для определения объема, умноженного на 100, если в стеке задано значение r. (Указание: используйте число Пи = 3.14, умножив его на 100.) Определите слово, помещающее в стек произведение двух самых нижних чисел в стеке, не разрушая содержимого стека. Все, что вам известно : в стеке находятся два или более числа. (На практике вы не должны допускать разрастание стека, чтобы не приходилось делать что-либо подобное.) Слово MOD дает остаток от деления нацело, т.е. 11 3 MOD выдает в результате 2. Дайте определение слова MOD.
Используйте .NUMS со следующими числами: 1,3,7,15,31,63,127 и 255. Подметили ли вы общий рисунок ? Какая зависимость существует между числом 2, возведенным в целую степень, и двоичным представлением ? Теперь проделайте то же самое с числами 2,4,8,16,31,64,128 и 256. Видите ли вы, почему шестнадцатеричное представление удобно для работы с байтами ? Перейдите в двоичную систему и введите восьмиразрядное число с единицами во всех разрядах. Используйте .NUMS. Вы снова сможете убедиться в удобстве шестнадцатеричной системы. Проделайте это упражнение для 16-разрядного числа. Вернитесь к десятичному основанию. Перейдите к основанию 16 и введите 1 плюс шестнадцатеричное число, которое эквивалентно байту со всеми единицами в разрядах. Возведите это число в квадрат и выведите его словом .NUMS. Сколько используется разрядов ? Почему ? Подумайте еще раз, почему удобна шестнадцатеричная система ? Определите слова HEX, OCTAL и BINARY. Понятно ли вам, почему, если вы хотите использовать шестнадцатеричные числа, недопустимо давать имена такого типa: АА, А4, FF и т.д. и в то же время имя GG будет приемлемым ?
Некоторые программисты, которые много работают с числами, представленными в двоичной, шестнадцатеричной или восьмеричной системах, действительно могут думать и выполнять арифметические действия в этих системах, однако большинство из нас на это неспособны. Одной из приятных особенностей, которую мы не найдем в других языках, является возможность производить преобразование систем счисления. Программист может думать только в одной наиболее удобной системе счисления, обычно десятичной. (По мере приобретения опыта вы убедитесь, что наиболее удобным основанием для работы с адресами памяти является шестнадцатеричная система.)
Подберите маску и подходящее слово для того, чтобы изменить приведенные числа, как показано в таблице. Не используйте XOR, если есть более простое решение.
Исходное Преобразованное Исходное Преобразованное число число число число (а) 10101011 10100011 (е) 10101111 00001111 (б) 10100011 10100111 (ж) 10100000 00001111 (в) 10100011 00000000 (з) 10101010 01010101 (г) 10100011 11111111 (и) 11110000 00001111 (д) 10101111 10100000
Опишите слово для преобразования любого слова, находящегося на вершине стека, в "О". Слово = (во всех версиях, кроме Форт-83) возвращает единицу, если два верхних числа в стеке равны. Иначе оно возвращает "0". Определите слово =. (Совет: нужно дважды использовать XOR, один раз с маской и также /.) В некоторых версиях Форта слово о возвращает 1, если два верхних числа не равны, и 0 в противном случае. Определите слово о двумя способами: с использованием слова - и без него. Опишите в Форт-83 слово NOT под именем NOT1, используя XOR. Опишите его, используя -. Опишите слово, которое, если дана маска с определенными установленными в "1" разрядами, возвращает 1 в соответствующих разрядах второго сверху числа в стеке, если их значение равно 1 и 0 в противном случае. (Совет: используйте слово = из упражнения 3). Опишите слово, которое, если задана маска с определенными разрядами, установленными в "I", будет возвращать 1 соответствующих разрядах второго сверху числа, если они равны 0, и 0 в противном случае.
Приемы, использованные в упражнениях 6 и 7, могут быть полезны для проверки состояния разрядов памяти, например для проверки того, включен ли принтер.
Убедитесь в том, что слово .BIN находится в вашей системе. Если это не так, снова введите ею (см. выше). Определи те новое слово, которое печатает двоичные числа без знака следующим образом :
: U.BIN DUP BASE @> 2 BASE ! SWAP U. BASE ! ;
(В чем различие между .BIN и U.BIN?)
Напишите одно слово, которое показывает число, находящееся на вершине стека в виде десятичного со знаком, десятичного без знака, двоичного со знаком и двоичного без знака. Используйте слово U.BIN для того, чтобы подготовить на экране таблицу приведенных ниже чисел, показывая их и виде чисел со знаком и без знака в двоичной и десятичной системе 1, 2, 3, 32766, 32767, 32768, 32769, 65533, 65534, 65535. Глядя на таблицу из упражнения 2 (и если нужно, проведя дополнительные эксперименты), напишите алгебраической выражение для преобразования отрицательных чисел в диапазоне -1 - 32768 в положительные числа, которые выводятся с помощью слова U. Еще раз, просматривая таблицу из упражнения 2, напишите слово, которое будет менять знак числа, находящегося и стеке, не используя -, а с помощью операций над битами (вы уже описали слово NEGATE). Как это связано с дополнением исходного числа по модулю два? Используя результаты упражнения 4 и операцию +, напишите определение слова - для выполнения вычитания.
Определите слово . LSB для печати младшего байта числа, находящегося в стеке. Не используйте PAD и С@. (Подсказка: какое значение старших восьми разрядов должно иметь число в стеке перед операцией . ? Как установить эти разряды в 0 ?) Определите слово .MSB для печати старшего байта положительного числа, находящегося в стеке. (Совет: вспомните, что к старшему байту числа добавляется 1 каждый раз, когда к нему прибавляется 256, и что оператор / производит округление с уменьшением.) Переопределите .LSB, пользуясь методом определения .MSB. (Указание: вы должны применить DUP к числу, находящемуся в стеке, и, кроме того, SWAP и -.) Дайте новое определение .LSB и .MSB под именами .LSB2 и .MSB2, используя PAD и С@. Очень часто одно и то же можно на Форте сделать разными способами. Наилучший метод -- это обычно компромисс между требуемыми ресурсами памяти и временем исполнения. Какое из определений .LSB и .MSB будет самым быстрым ? Напишите слово для деления числа без знака, находящегося на вершине стека, на 256, не используя для этого никаких чисел. Напишите слово для добавления числа 256 к числу на вершине стека путем прибавления 1 к чему-то.
Наиболее удобно ( и быстро) коды ASCII преобразуются с помощью операций над отдельными битами, с которыми вы уже знакомы. Обратитесь к и для справки о значениях разрядов, которые нужно преобразовать в приводимых заданиях.
Напишите слово, которое меняет любой код больше 127 на код меньше 127, но не влияет на код меньше 127. (Совет: измените один разряд из "1" в "0".) Напишите слово для преобразования любого управляющего кода в печатный символ. Сделайте это двумя способами: с помощью поразрядных операций и с помощью сложения. Напишите слово для преобразования символов нижнего регистра в символы верхнего регистра. Напишите слово, которое делает обратное преобразование. Напишите слово, которое позволяет выдать в стек адрес памяти, а затем печатает символ ASCII, который находится по этому адресу. Напишите слово, которое снимает символ с клавиатуры и помещает его по адресу, который выдает в стек слово PAD.
В этом разделе содержится важная
В этом разделе содержится важная информация | |
о том, как пользоваться книгой. | |
Мы надеемся, что вы его обязательно прочтете. |
Форт (FORTH) -- это мощный язык программирования, который обеспечивает высокую производительность ЭВМ. Предлагаемая книга является одновременно учебником и справочником, позволяющим овладеть языком Форт независимо от того, начинающий вы программист или опытный. Вы можете пользоваться этой книгой как учебником для классных или индивидуальных занятий, при этом не предполагается знание основ ЭВМ или программирования. Книга содержит полное описание языка, начинающееся с упрощенного изложения принципов работы компьютеров. Постепенно осуществляется переход к более сложным понятиям, не описанным в других книгах. Вы сами можете выбрать материал и скорость изучения с учетом своего уровня подготовки. В книге приводится множество примеров, показывающих стиль программирования на языке Форт, включая полный текст программы редактора, большое количество упражнений для приобретения опыта, уверенности и, что более важно, полезных технических навыков. В даны ответы к упражнениям. Излагаются обе версии языка Форт в соответствии со стандартами 1979 и 1983 гг. Кроме того, изложены вопросы, не освещаемые в стандартах, в том числе организация файлов данных, обработка алфавитно-цифровых текстов, арифметика с плавающей запятой, а также различные инструментальные программные средства, что поможет вам расширить сферу применения языка Форт для ваших нужд. Даны примеры функций усовершенствованной реализации языка MMSFORTH.
Материал книги построен для использования ее в качестве справочника так, чтобы охватить весь набор средств и приемов и полный перечень слов и функций языка. Подробное содержание каждой главы дается в разделе содержания и в начале каждой главы и кроме того, имеется сводка перекрестных ссылок для облегчения поиска нужной информации. Приведены также два очень подробных глоссария: слов языка программирования Форт (включая стандартные, а также расширяющие слова и слова, определенные в книге) и терминологии компьютеров и понятий, относящихся к языку Форт.
Приводимый материал и его организация должны сделать эту книгу подручным средством для программирующих на языке Форт.
Что же представляет собой язык Форт ? Основная его часть -- это набор слов, или словарь, из которого слово вызывается по имени для выполнения специфических функций. Слова языка Форт , , , , соответственно складывают, вычитают, умножают и делят два числа. Программа на Форте пишется путем определения новых слов с использованием слов, ранее уже определенных в словаре. Как только новые слова скомпилированы в словарь, они не отличаются по форме от тех слов, которые в нем уже имеются. Программа на Форте -- это не более чем расширение самого языка, это резко отличает его от таких языков программирования, как BASIC, FORTRAN или PASCAL, в которых язык транслирует всю программу в закодированную форму, понятную компьютеру, не меняя самого языка. И вследствие того, что Форт использует словарь, новые слова и программы требуют гораздо меньше памяти и могут выполняться так же быстро, как эквивалентные им программы на других языках.
Кроме того, языком Форт очень легко пользоваться. Подобно Бейсику, он сразу же реагирует на любую команду (слово), введенную с клавиатуры. Однако новые слова Форта и программы компилируются в словарь, поэтому они могут выполняться с той же скоростью или быстрее, чем, например, на Фортране, который к тому же при трансляции программ порождает большие объемы машинного кода. Компиляция программы на языке Форт делается значительно быстрее и проще, чем на Фортране, Коболе, Паскале и других языках.
Есть у форта и другие своеобразные черты. Почти все языки программирования используют средства операционной системы (например, СР/М /си-пи-эм/, MS-DOS) для обеспечения ввода информации с клавиатуры, вывода ее на экран дисплея, сохранения программы на диске и других функций. В противоположность этому многие версии языка Форт служат сами себе и операционной системой, или, иначе говоря, все функции операционной системы могут быть написаны на языке Форт и включены в качестве части его словаря.
И в то время как другие языки для сохранения программы и данных пользуются именованными файлами на дисках, Форт сохраняет такую же информацию в нумерованных блоках емкостью 1024 байта (1 Кб) каждый. Хотя и в языке Форт могут использоваться файлы, а сам он может работать с верхним уровнем операционной системы, Форт выполняет функции операционной системы специфическим и необычным образом.
В большинстве языков программирования требуется, чтобы числа хранились в виде переменных. В Форте также есть именованные переменные, но для хранения чисел, так же как и для передачи их из одного слова в другое, в основном используется стек, позволяющий экономить много времени (числа не приходится выбирать из памяти, но при условии что стек реализован аппаратно на кристалле или находится в быстрой кэш-памяти). Применение стека является как раз той новинкой (точнее особенностью), которую нужно прежде всего освоить в языке Форт.
Форт -- структурированный язык. Такие языки, как Фортран и Бейсик, допускают написание программы с переходами из одного места в другое, что потенциально может привести к путанице и беспорядку. Некоторые структурные языки, например Паскаль, заставляют разрабатывать программу в логической последовательности, но делается это с помощью очень строгих правил, которые ограничивают программиста более жестко, чем на языке Форт. Разработка программ на Форте и их организация производятся, обычно одновременно на двух уровнях. На верхнем уровне программист разрабатывает план того, что программа должна делать, пользуясь часто логической блок-схемой программы. На нижнем уровне программа пишется с помощью определения слов, необходимых для выполнения задач верхнего уровня. Каждое определяемое слово может быть проверено и отлажено отдельно или в сочетании с другими словами, что приводит к существенному сокращению времени разработки и тестирования программы.
Именно возможность писать короткие определения слов и программ и делает язык Форт легким для изучения. Новое определение может быть введено с клавиатуры и немедленно проверено.
Поэтому форт можно и нужно изучать на практике методом "проб и ошибок". И хотя Форт заключает в себе некоторые тонкости и абстракции, можно изучить лишь небольшую их часть, чтобы писать полезные программы. Вы сможете писать программы и экспериментировать с ними раньше, чем дойдете до середины первой главы. Для облегчения обучения очень важны немедленная реакция и подтверждение, и только два языка -- Бейсик и Лого приближаются к Форту в этом отношении. На протяжении всей книги мы будем разбирать небольшие примеры и делать упражнения. Вам следует все их попробовать решить, но еще большему вы научитесь, если будете сами ставить и решать свои собственные задачи.
И все же многие утверждают, что Форт труден для изучения. Для этого имеется несколько причин. Опытным программистам Форт зачастую дается труднее, чем новичкам, потому что он отличается от других языков программирования по самой своей природе. Хотя в языке Форт нет каких-либо присущих только ему сложностей, программисты с трудом отвыкают от переменных, подпрограмм, многословного текста на исходном языке, алгебраических обозначений и прочих атрибутов привычных им языков. Если вы знаете другие языки программирования, попробуйте к языку Форт подойти с полной отдачей. Освойте понятия стека и определения слов, прежде чем переходить к более сложным вопросам. Забудьте всякие предубеждения, которые у вас могут возникнуть, вроде того, что для хорошего языка программирования обязательно нужна операционная система и файловая поддержка. И не беспокойтесь о блок-схеме, начните с небольших задач, ваш опыт будет накапливаться постепенно. Форт может показаться трудным, так как это достаточно мощное средство программирования.
Действительно, все возможности языка изучить трудно, но все они и не потребуются, чтобы писать очень полезные программы. На Форте можно научиться писать программы на уровне хорошего программиста, пользующегося языками Бейсик и Фортран, быстрее, чем на любом другом языке. Так же несложно программирование на Форт-ассемблере (определение слов Форта в машинных кодах).
Можно описать слова, которые будут создавать в словаре совершенно новые типы данных, использовать Форт для модификации самого языка, для операций с большими объемами данных в памяти компьютера и даже для того, чтобы реализовать новые языки программирования. Конечно, изучение этих вопросов может быть трудным. И, хотя мы осветим большую их часть, вы сможете хорошо программировать на языке Форт раньше, чем овладеете ими всеми. Форт предоставляет вам мощные средства для управления работой компьютера, присущие другим языкам программирования, включая машинный язык, но вам эти мощные средства скорее всего не потребуются.
Существует одна причина, из-за которой Форт иногда оказывается действительно трудным. Дело в том, что в стандартах языка и в поставляемых потребителям реализациях языка отсутствуют некоторые слова для выполнения основных или важных функций, предусмотренных другими языками. В таких случаях программист вынужден сам написать слова, которые должны выполнять эти важные функции. Например, стандартный (ANS'83) Форт не содержит операций над числами с плавающей запятой, в нем нет трансцендентных функций (тригонометрических, логарифмической); не определены стандартами операции с символами и символьными строками (например, извлечение отдельных слов из текста), работа с файлами данных, графические возможности. Нет в стандарте и слова, позволяющего вводить числа в процессе исполнения программы. К счастью, во многих поставляемых реализациях Форта предусмотрены слова, позволяющие преодолеть эти ограничения, а Форт настолько мощный, что позволяет самому написать такие слова, если знать, как это сделать. И мы вас этому научим.
Подводя итог, можно сказать, что Форт -- это в то же время мощный и неразвитый язык. Мощный он потому, что программы, написанные на нем, занимают мало места в памяти и исполняются с такой же скоростью или быстрее, чем на других языках, он дает потенциально неограниченные возможности управления компьютером, и писать и отлаживать программы довольно несложно.В то же время стандартный Форт неразвит, ввиду того что не предусматривает выполнения некоторых важных функций, которые являются неотъемлемой частью других языков или операционной системы и доступны для программиста. Введение этих функций предоставлено программисту или предусматривается в некоторых версиях Форта. Почему же стандартный Форт так бедно определен ? Чтобы понять это, надо немного познакомиться с его создания.
При изучении языка Форт, возможно,
При изучении языка Форт, возможно, наиболее важным является умение легко и быстро работать со стеком. К данному моменту вы должны хорошо понимать, как работает стек и как его можно перестроить, если это необходимо. После овладения операциями в стеке вам легче будет освоить материал последующих глав. Если вы чувствуете, что вам нужно попрактиковаться еще, вернитесь к разбору предыдущих упражнений или придумайте свои собственные задачи и решите их. Конечно, у вас еще будет много практической работы со стеком в нескольких следующих главах. Вскоре вы обнаружите, что сможете инстинктивно писать разумные программы, едва ли задумываясь о состоянии стека.
Теперь вы должны хорошо представлять себе, как хранятся числа в памяти, что такое двоичные, десятичные и шестнадцатеричные числа, как пользоваться словом BASE, чтобы посмотреть числа в различных системах счисления и как обращаться с отдельными разрядами чисел. Если вы разобрались в этих вопросах достаточно хорошо, то вы уже знаете больше о работе компьютера, чем многие программирующие на Бейсике, Фортране и Паскале. Мы изложили эти вопросы в начале, чтобы заложить прочный фундамент. Но никто, кроме программиста, который постоянно работает на уровне битов и байтов, не может точно сказать, что делают операторы типа XOR и AND. Почти все мы вынуждены заглянуть в таблицу или ввести что-то с клавиатуры, чтобы вспомнить, чему равен шестнадцатеричный эквивалент числа 245, а большинство из нас не смогли бы даже вспомнить, как хранится знак числа, если бы не было этого краткого обзора. Важно то, что если вы однажды поняли этот материал, то вам будет легко вспомнить его, если потребуется. Поэтому не пытайтесь запомнить все детали этой главы. Вы можете подумать, что, хотя вы поняли представление алфавит-но-цифровой информации кодами ASCII, вам это не принесло практической пользы. Вы правы. Но уже скоро мы узнаем о том, что возможности Форта в обработке символьной информации очень велики.
Наконец, в этом месте вы можете задать вопрос: должны ли мы работать только с целыми числами ? Сам по себе Форт, определенный в соответствии со стандартами, не применяет арифметики с плавающей запятой (т.е. арифметики, которая учитывает положение десятичной запятой в числах). Некоторые считают, что целочисленной арифметики вполне достаточно, но для того, кто занимается решением научных и технических задач, ясно, что это бессмыслица. Хотя действия с целыми числами выполняются быстрее, да и в других языках программирования использованием чисел с плавающей запятой иногда чрезмерно увлекаются, все же бывает, что целые числа при решении практических задач оказываются неудобными. В мы узнаем, как работать с числами с плавающей запятой. И, кроме, того узнаем значительно больше о других мощных арифметических операциях в языке Форт.