Американский Национальный Стандарт для Информационных Систем -- Языки Программирования --- Forth Секретариат Компьютерная и Деловая Ассоциация Изготовителей Оборудования Одобренный: 24 марта 1994 American National Standards Institute, Inc. 1 ____________________________________________________________________________ Copyright ( c ) 1994 Техническим Комитетом X3J14. Все права зарезервированы. Это - рабочий документ Технического Комитета (ТК) X3J14, который представляет последний проект ANS Forth представленный в ANSI для публикации. Настоящим предоставляются права копировать этот документ при условии, что он скопирован полностью без изменений или изменен посредством: (1) добавления текста, который ясно отмечен как вставка; (2) затенения или выделения существующего текста; и/или (3) удаления примеров. В частности, предоставляются права использовать этот рабочий документ как основу для учебников, системных руководств, и диалоговой документации, если выполнены требования предыдущего параграфа, и результирующий продукт отвечает техническим потребностям, не удовлетворенным официальным ANS. ПРИМЕЧАНИЕ: Этот файл предоставлен как рабочий документ TК для общественного обсуждения и комментирования а также для использования в документации, описанной выше. Он не предназначен как замена Официального ANS Forth документа, опубликованного ANSI. В случае конфликта, только напечатанный документ X3.215- 1994 представляет официальный ANS Forth. Для получения официального стандарта, пожалуйста, свяжитесь с American National Standards Institute Sales Department, в (212) 642-4900 или ФАКС (212) 302-1286, или Global Engineering Documents, в (800) 854-7179 или ФАКС (303) 843-9880, и запросите Документ X3.215-1994. Большое спасибо за ваш интерес. 2 __________ СОДЕРЖАНИЕ Предисловие ......................................................... 6 Х3 состав ........................................................... 7 X3J14 состав ........................................................ 9 1. Введение .........................................................11 1.1 Цель ........................................................... 11 1.2 Назначение ..................................................... 11 1.2.1 Включение .................................................... 11 1.2.2 Исключение ................................................... 11 1.3 Организация Документа .......................................... 12 1.3.1 Наборы слов .................................................. 12 1.3.2 Дополнения ................................................... 12 1.4 Будущие направления ............................................ 13 1.4.1 Новая технология ............................................. 13 1.4.2 Устаревшие функции............................................ 13 2. Термины, нотации, и ссылки ...................................... 14 2.1 Определения терминов ........................................... 14 2.2 Нотации ........................................................ 17 2.2.1 Числовые нотации ............................................. 17 2.2.2 Стековые нотации ............................................. 17 2.2.3 Нотации анализа текста ....................................... 18 2.2.4 Словарные нотации ............................................ 18 2.3 Ссылки ......................................................... 19 3. Условия применения .............................................. 20 3.1 Типы данных .................................................... 20 3.1.1 Отношения типов данных ....................................... 20 3.1.2 Символьные типы .............................................. 21 3.1.3 Типы одна-ячейка ............................................. 23 3.1.4 Типы пара-ячеек .............................................. 24 3.1.5 Системные типы ............................................... 24 3.2 Среда выполнения ............................................... 25 3.2.1 Числа ........................................................ 25 3.2.2 Арифметика ................................................... 26 3.2.3 Стеки ........................................................ 27 3.2.4 Терминал оператора ........................................... 28 3.2.5 Запоминающие устройства большой емкости ...................... 28 3.2.6 Запросы к окружению ......................................... 28 3.3 Словарь Forth .................................................. 29 3.3.1 Область имени ................................................ 29 3.3.2 Область кода ................................................. 30 3.3.3 Область данных ............................................... 30 3.4 Интерпретатор текста Forth ..................................... 32 3.4.1 Синтаксический анализ ........................................ 33 3.4.2 Поиск определений имен ....................................... 34 3.4.3 Семантика .................................................... 34 3.4.4 Возможное действие на неопределенную ситуацию ................ 35 3.4.5 Компиляция ................................................... 35 4. Документационные требования ..................................... 36 4.1 Системная документация ......................................... 36 4.1.1 Опции определяемые реализацией ............................... 36 3 4.1.2 Неоднозначные условия ........................................ 37 4.1.3 Другая системная документация ................................ 38 4.2 Программная документация ....................................... 38 4.2.1 Зависимости окружения ........................................ 38 4.2.2 Другая программная документация .............................. 38 5. Соглашение и наименование ....................................... 40 5.1 ANS Forth системы .............................................. 40 5.1.1 Системное соглашение ......................................... 40 5.1.2 Системное наименование ....................................... 40 5.2 ANS Forth программы ............................................ 40 5.2.1 Программное соглашение ....................................... 40 5.2.2 Программное наименование ..................................... 40 6. Словарь ......................................................... 41 6.1 Основные слова ................................................. 41 6.2 Расширения основных слов ....................................... 64 7. Дополнительный Блочный набор слов ............................... 73 8. Дополнительный набор слов двойных чисел ......................... 79 9. Дополнительный набор слов исключений ............................ 84 10. Дополнительный сервисный набор слов ............................ 89 11. Дополнительный набор слов доступа к файлам ..................... 93 12. Дополнительный набор слов для плавающей точки ................. 102 13. Дополнительный Locals набор слов .............................. 119 14. Дополнительный набор слов распределения памяти ................ 124 15. Дополнительный набор слов утилит .............................. 127 16. Дополнительный набор слов порядка поиска ...................... 134 17. Дополнительный строковый набор слов ........................... 139 A. Разъяснения (информационное приложение) ........................ 142 A.1 Введение ...................................................... 142 А.2 Термины и нотации ............................................. 144 А.3 Условия применения ............................................ 145 А.4 Документационные требования ................................... 159 A.5 Соглашения и наименования ..................................... 159 A.6 Словарь ....................................................... 161 A.7 Дополнительный Блочный набор слов ............................. 182 A.8 Дополнительный набор слов двойных чисел ....................... 183 A.9 Дополнительный набор слов исключений .......................... 184 A.10 Дополнительный сервисный набор слов .......................... 188 A.11 Дополнительный набор слов доступа к файлам ................... 191 A.12 Дополнительный набор слов для плавающей точки ................ 194 A.13 Дополнительный Locals набор слов ............................. 198 A.14 Дополнительный набор слов распределения памяти ............... 202 A.15 Дополнительный набор слов утилит ............................. 202 A.16 Дополнительный набор слов порядка поиска ..................... 205 A.17 Дополнительный строковый набор слов .......................... 208 B. Библиография (информационное приложение) ....................... 209 C. Перспектива (информационное приложение) ........................ 212 C.1 Расширения Forth .............................................. 212 C.2 Хронология Forth .............................................. 213 C.3 Аппаратные реализации Forth ................................... 213 C.4 Попытки стандартизации ........................................ 214 C.5 Программирование в Forth ...................................... 214 4 C.6 Мультипрограммные системы ..................................... 222 C.7 Конструкционные и организационные соображения ................. 223 C.8 Заключение .................................................... 223 D. Анализ совместимости ANS Forth (информационное приложение) ..... 224 D.1 FIG Forth (приблизительно 1978) ............................... 224 D.2 Forth 79 ...................................................... 224 D.3 Forth 83 ...................................................... 224 D.4 Недавние разработки ........................................... 225 D.5 ANS Forth подход .............................................. 226 D.6 Отличия от Forth 83 ........................................... 226 D.6.1 Ширина стека ................................................ 226 D.6.2 Представление числа ......................................... 227 D.6.3 Адресуемые элементы ......................................... 227 D.6.4 Приращение адреса для ячейки больше не два .................. 228 D.6.5 Выравнивание адреса ......................................... 229 D.'.' Направление округления Division/modulus ..................... 230 D.6.7 Immediate-ности ............................................. 231 D.6.8 Входной набор символов ...................................... 233 D.6.9 Сдвиги с UM/MOD ............................................. 233 D.6.10 Словари / списки слов ...................................... 234 D.6.11 Воздействие мультипрограммирования ......................... 235 D.6.12 Слова, не представленные в исполняемой форме ............... 235 E. Руководство по переносимости ANS Forth (информац. приложение) .. 237 E.1 Введение ...................................................... 237 E.2 Аппаратные особенности ........................................ 237 E.2.1 Data/memory абстракция ...................................... 237 E.2.2 Определения ................................................. 237 E.2.3 Адресация памяти ............................................ 238 E.2.4 Проблемы выравнивания ....................................... 239 E.3 Представление числа ........................................... 240 E.3.1 Обратный порядок байт против прямого порядка байт ........... 240 E.3.2 Организация ALU ............................................. 240 E.4 Реализация Forth системы ...................................... 241 E.4.1 Определения ................................................. 241 E.4.2 Стек ........................................................ 242 E.5 Дисциплины соглашения ROM приложений .......................... 242 E.6 Резюме ........................................................ 243 F. Алфавитный список слов (информационное приложение) ............. 244 5 ____________ Предисловие ( Это предисловие - не часть Американского Национального Стандарта X3.215-1994) Forth - язык для непосредственной связи между людьми и машинами. Используя стиль естественного языка и машинно-ориентированный синтаксис, Forth обеспечивает экономичную, производительную среду для интерактивной трансляции и выполнения программ. Forth также обеспечивает низкоуровневый доступ к управляемым компьютером аппаратным средствам, и возможность расширять язык непосредственно. Эта расширяемость позволяет быстро расширять язык и приспосабливать его к специфичным потребностям и различным аппаратным системам. Forth был изобретен г. Чарльзом Муром, чтобы увеличить производительность программиста без принесения в жертву машинной эффективности. Forth - многоуровневая среда, содержащая элементы машинного языка, а также операционную систему и машинный монитор. Эта расширяемая, многоуровневая среда предусмотрена для высоко интерактивной разработки и отладки программ. В интересах переносимости прикладного программного обеспечения, написанного в Forth, работы по стандартизации начались в середине 1970-ых международной группой пользователей и разработчиков, принявших название "Forth Standards Team". Эти работы завершились стандартом Forth-77. Поскольку язык продолжил развиваться, "Forth Standards Team" был издан промежуточный стандарт Forth-78. Следующая встреча "Forth Standards Team" была в 1979, а Forth-79 стандарт был издан в 1980. Главные изменения были сделаны "Forth Standards Team" в Forth-83 стандарте, который был издан в 1983. Первая встреча Technical Committee по системам программирования на Forth была созвана Оргкомитетом X3J14 Forth Technical Committee 3 августа 1987, с последующими встречами 11-12 ноября 1987, 10-12 февраля 1988, 25-28 мая 1988, 10-13 августа 1988, 26-29 октября 1988, 25-28 января 1989, 3-6 мая, 1989, 26- 29 июля 1989, 25-28 октября 1989, 24-27 января 1990, 22-26 мая 1990, 21-25 августа 1990, 6-10 ноября 1990, с 29 января по 2 февраля 1991, 3-4 мая 1991, 16-19 июня 1991, с 30 июля по 3 августа 1991, 17-21 марта 1992, 13-17 октября 1992, 26-30 января 1993, 28-30 июня 1993, и 21 июня 1994. Запросы об интерпретации, предложения по исправлениям и дополнениям, или отчеты об ошибках принимаются. Они должны быть посланы в X3 Секретариат, Computer and Business Equipment Manufacturers Association, 1250 Eye Street, NW, Suite 200, Washington, DC 20005. 6 _________ X3 Состав Этот стандарт был разработан и одобрен для представления в ANSI при Accredited Standards Committee on Information Processing Systems,X3. Одобрение комитетом этого стандарта не подразумевает обязательно, что все члены комитета голосовали за его одобрение. Во время одобрения этого стандарта, X3 Комитет имел следующий состав: James D. Converse, Chair Donald C. Loughry, Vice-Chair Joanne Flanagan, Secretary Producer Group Name of Representative AMP Incorporated ............................. Edward Kelly Charles Brill (Alt.) AT&T/NCR Corporation ......................... Thomas W. Kern Thomas F. Frost (Alt.) Apple Computer, Inc .......................... Karen Higginbottom Compaq Computers ............................. James Barnes Digital Equipment Corporation ................ Delbert Shoemaker Kevin Lewis Hitachi America Ltd .......................... John Neumann Kei Yamashita (Alt.) Hewlett Packard .............................. Donald C. Loughry Bull HN Information Systems Inc .............. William George IBM Corporation .............................. Joel Urman Mary Anne Lawler (Alt.) Unisys Corporation ........................... John Hill Stephen P. Oksala (Alt.) Sony Corporation of America .................. Michael Deese Storage Technology Corporation ............... Joseph S. Zajaczkowski Samuel D. Cheatham (Alt.) Sun Microsystems, Inc ........................ Scott Jameson Gary S. Robinson (Alt.) * Xerox Corporation ............................ Dwight McBain Roy Pierce (Alt.) 3M Company ................................... Edie T. Morioka Paul D. Jahnke (Alt. Consumers Group Boeing Company ............................... Catherine Howells Andrea Vanosdoll (Alt.) Eastman Kodak Company ........................ James Converse Michael Nier (Alt.) General Services Administration .............. Douglas Arai Larry L. Jackson (Alt.) Guide International Inc ...................... Frank Kirshenbaum Harold Kuneke (Alt.) ** Hughes Aircraft Company ...................... Harold Zebrack National Communications Systems .............. Dennis Bodson 7 Northern Telecom Inc ......................... Mel Woinsky Subhash Patel (Alt.) ** Recognition Tech Users Association ........... Herbert P. Schantz G. Edwin Hale (Alt.) Share Inc .................................... Gary Ainsworth David Thewis (Alt.) U. S. Department of Defense .................. William Rinehuls C. J. Pasquariello (Alt.) U. S. Department of Energy ................... Alton Cox Lawrence A. Wasson (Alt.) Wintergreen Information Services ............. John Wheeler General Interest Group American Nuclear Society ..................... Geraldine C. Main Sally Hartzell (Alt.) Assn. of the Institute for Certification of Computer Professionals .................... Kenneth Zemrowski Nat'l Institute of Standards and Technology .. Robert E. Rountree Micharl Hogan (Alt.) Neville & Associates ......................... Carlton Neville -------------------------------- * Воздержался ** Нет данных 8 ____________ X3J14 Состав Во время одобрения этого проекта предложенного American National Standard, Technical Committee X3J14 по зыку программирования Forth имел следующий состав: Elizabeth Rather, Chair Mitch Bradley, acting Vice-Chair Don Colburn, Secretary John Rible, Technical Editor Len Zettel, Vocabulary Representative Greg Bailey, Technical Subcommittee Chair Organization Represented Name of Representative ATHENA Programming, Inc ...................... Greg Bailey Howe Fong (Alt.) Bradley Forthware ............................ Mitch Bradley Creative Solutions, Inc ...................... Don Colburn Ford Motor Company ........................... Leonard F. Zettel, Jr. FORTH, Inc ................................... Elizabeth Rather Dennis Ruffer (Alt.) Institute for Applied Forth Research ......... Lawrence Forsley Horace Simmons (Alt.) Johns Hopkins University, Applied Physics Lab. John Hayes Mephistopheles Systems ....................... Dave Harralson NASA/Goddard Space Flight Center ............. James Rash Nomadic Software ............................. John K. Stevenson Unisyn, Inc .................................. Gary Betts Stephen Egbert (Alt.) Up and Running ............................... Martin Tracy Vesta Technology ............................. Jack Woehr Individual Members Loring Craymer John Rible J. E. (Jet) Thomas X3 Liasons Clyde R. Camp Kathleen McMillan Следующие организации и частные лица также участвовали в этом проекте как члены Technical Committee, заместители, или наблюдатели. Technical Committee ценит и уважает их вклад: Organizations British Columbia Inst. of Tech. MCI Telecommunications Corp. Computer Cowboys Micromotion Computer Sciences Corp. MicroProcessor Engineering Ltd. Computer Strategies, Inc. National Institute of Standards & Technology 9 Digalog Corp. NCR Medical Systems Group Embedded Sys. Programming Mag. Performance Packages, Inc. Forth Interest Group (FIG) Purdue University H.B. Pascal & Co., Inc. Robert Berkey Services Harris Semiconductor Shaw Laboratories IBM Corporation Social Security Administration IEEE Software Engineering Kelly Enterprises Texas Instruments Laboratory Microsystems, Inc. The Dickens Company Maxtor Corp. Individuals David J. Angel Ray Duncan Charles Moore Dean Sanderson Wil Baden Douglas Fishman Mike Nemeth George Shaw Robert Berkey Tom Hand Harry Pascal Gerald Shifrin Ron Braithwaite Gregory Ilg Stephen Pelc Robert Smith Jack Brown Charles Keane Dean Perrine Tyler Sperry Chris Colburn Guy M. Kelly David C. Petty Tom Zimmer Ted Dickens Andrew Kobziar Bill Ragsdale John Dorband Martin Lascelles James Ryland 10 AMERICAN NATIONAL STANDARD ANSI X3.215-1994 Американский Национальный стандарт для Информационных Систем -- Языки Программирования --- Forth Forth Forth 1. ________ Введение 1.1 ____ Цель Цель этого Стандарта состоит в том, чтобы способствовать переносимости Forth программ для использования на большом разнообразии вычислительных систем, чтобы облегчить обмен программами, методами программирования, и идеями среди программистов Forth, и служить как основание будущего развития языка Forth. 1.2 __________ Назначение Этот Стандарт устанавливает интерфейс между Forth системой и Forth программой определением слов, предусмотренных Стандартной Системой. 1.2.1 _________ Включения Этот Стандарт определяет: - формы, которые может иметь программа, написанная на языке Forth; - правила для интерпретации смысла программы и ее данных. 1.2.2 __________ Исключения Этот Стандарт не определяет: - механизм, которым программы преобразованы для использования на вычислительных системах; - операции, требуемые для установки и контроля за выполнением программ на вычислительных системах; - метод переноса программ или их входных/выходных данных на носитель или из носителя данных; - поведение программы и Forth системы, в случаях не установленных правилами этого Стандарта; - размер или сложность программы и ее данных, которые способны превысить вместимость какой либо вычислительной системы или возможности конкретной Forth системы; 11 - физические свойства записей ввода/вывода, файлов, и модулей; - физические свойства и реализация памяти. 1.3 _____________________ Организация документа 1.3.1 ___________ Наборы слов Этот Стандарт группирует Forth слова и свойства в наборы слов под именами указывающими на некоторые общие свойства, типично их общая область функционирования. Каждый набор слов может иметь расширение, содержащее слова, которые предлагают дополнительные функциональные возможности. Эти слова - не требуются в реализации набора слов. "Основной" набор слов, определенный в разделах с 1 по 6, содержит требуемые слова и свойства стандартной Системы. Другие наборы слов, определенные в разделах с 7 по 17, являются дополнительными, делая возможным расширение стандартной Системы дополнительными уровнями функциональности. 1.3.1.1 _________________ Текстовые разделы В пределах каждого набора слов, раздел 1 содержит вводный и объяснительный материал, а раздел 2 представляет термины и нотацию, используемые в Стандарте. Нет никаких требований в этих разделах. Разделы 3 и 4 содержат требования использования и документации, соответственно, для стандартных Систем и программ, в то время как раздел 5 определяет их наименование. 1.3.1.2 _______________ Разделы словаря Раздел 6 каждого набора слов определяет требуемое поведение определений в наборе слов и наборе слов расширений. 1.3.2 __________ Дополнения Дополнения не содержат никакого требуемого материала. Приложение A предоставляет некоторые разъяснения вслед за решениями комитета в создании этого Стандарта, а также примеры реализации. Та же самая нумерация раздела, что и в теле Стандарта, облегчает связь каждого раздела требований с его разделом объяснений. Приложение B - короткая библиография Forth. Приложение C предоставляет введение в Forth. Приложение D обсуждает совместимость ANS Forth с более ранними Forth, подчеркивая различия с Forth 83. Приложение E представляет некоторые методы для создания переносимых программ в ANS Forth. 12 Приложение F включает слова из всех наборов слов в одном списке, и служит как индекс ANS Forth слов. 1.4 ___________________ Будущие направления 1.4.1 ________________ Новая технология Этот Стандарт принимает некоторые слова и практики, которые все более и более находятся в общей практике. Также были приняты новые слова для облегчения создания переносимых программ. 1.4.2 __________________ Устаревшие функции Этот Стандарт принимает некоторые слова и практики, которые делают некоторых ранее используемые слова устаревшими. Хотя они сохранены здесь из-за их широкого распространения, их использование в новых реализациях или новых программах не рекомендуется, потому что они могут быть изъяты из будущих редакций Стандарта. Этот Стандарт определяет следующие слова как устаревшие: 6.2.0060 #TIB 15.6.2.1580 FORGET 6.2.2240 SPAN 6.2.0970 CONVERT 6.2.2040 QUERY 6.2.2290 TIB 6.2.1390 EXPECT 13 2. __________________________ Термины, нотация, и ссылки Фраза "Смотри:" используется в этом Стандарте для направления читателя к другим разделам Стандарта, которые имеют прямое отношение к текущему разделу. В этом Стандарте, "следует" устанавливает требование к системе или программе; наоборот, "не следует" является запрещением; "не требуется" означает "не требуется для"; "желательно" описывает рекомендации Стандарта; и "возможно", в зависимости от контекста, означает "разрешено" или "может случаться". Повсюду в Стандарте, шрифты используются следующим способом: - этот пропорциональный Serif шрифт используется для текста, с курсивом, используется для символов и первого появления новых терминов; - полужирный пропорциональный sans-serif шрифт используется для заголовков; - полужирный Serif шрифт фиксированной ширины используется для текста языка- Forth. 2.1 ____________________ Определения терминов Термины, определенные в этом разделе используются вообще повсюду в этом Стандарте. Дополнительные термины специфичные для определенных наборов слов, определены в этих наборах слов. Другие термины, определенные при их первом появлении, обозначены курсивом. Термины, не определенные в этом Стандарте, рассматриваются согласно Словарю для Информационных Систем, ANSI X3.172-1990. адресуемый элемент: В зависимости от контекста: 1) элементы, на которые разделено адресное пространство Forth с целью размещения объектов данных типа символов и переменных; 2) физические запоминающие элементы памяти, соответствующие этим элементам; 3) содержание такого запоминающего элемента памяти; 4) или элементы, в которых непосредственно указана длина области памяти. выровненный адрес: Адрес местоположения в памяти, к которому можно обращаться как к символу, ячейке, паре ячеек, или целым числам две-ячейки. неопределенная ситуация: Обстоятельство, для которого этот Стандарт не предписывает определенного поведения для Forth систем и программ. Неопределенные ситуации включают такие вещи как отсутствие необходимого разделителя во время синтаксического анализа, попытку доступа к несуществующему файлу, или попытку использования несуществующего слова. Неопределенная ситуация также существует, когда Стандартное слово получает значения, которые являются неподходящими или выходящими из диапазона. ячейка: Первичный элемент информации в архитектуре Forth системы. пара ячеек: Две ячейки, которые рассматриваются как один элемент. символ: В зависимости от контекста: 1) элемент памяти, способный хранить символ; или 2) элемент набора символов. 14 символьно-выровненный адрес: Адрес местоположения в памяти, к которому можно обратиться как к символу. символьная строка: Область данных, которая связана с непрерывной последовательностью символьно-выровненных адресов. Символьные строки обычно содержат текст. Если иначе не обозначено, термин "строка" обозначает "символьную строку". область кода: Логическая область словаря, в котором реализована семантика слова. компилировать: Преобразовать исходный текст в определения словаря. семантика компиляции: Поведение Forth определения, когда его имя встречает текстовый интерпретатор в состоянии компиляции. строка со счетчиком: Структура данных, состоящая из одного символа, содержащего длину следующей за ним нулевой или более непрерывной последовательности символьных данных. Обычно, строки со счетчиком содержат текст. кросс компилятор: Система, которая компилирует программу для последующего выполнения в среде, которая возможно, будет физически и логически отличной от среды компилирования. В кросс компиляторе, термин "host" применяется к среде компиляции, а термин "target" применяется к среде времени-выполнения. текущее определение: Определение, чья компиляция была начата, но еще не закончена. поле данных: Область данных связанная со словом, определенным через, CREATE. область данных: Логическая область словаря, к которой можно обращаться. указатель области данных: Адрес местоположения следующей доступной области данных, то есть, значение, возвращенное HERE. стек данных: Стек, который можно использовать для передачи параметров между определениями. Когда не возможна путаница, стек данных упомянут как "стек". В отличие от стека возвратов. тип данных: Идентификатор для набора значений, который может иметь объект данных. определяющее слово: Forth слово, которое создает новое определение при выполнении. определение: Forth выполняемая процедура, откомпилированная в словарь. словарь: Расширяемая структура, которая содержит определения и связанные области данных. отобразить: Послать один или более символов на устройство вывода пользователя. зависимости от окружения: Неявные программные предположения об опциях реализации Forth системы или используемого оборудования. Например, программы, которые принимают размер ячейки больший, чем 16 бит, считаются зависимыми от окружения. семантика выполнения: Поведение Forth определения, когда оно выполняется. 15 маркер выполнения: Значение, которое идентифицирует семантику выполнения определения. искать: Просмотреть словарь для имени определения, соответствующего данной строке. слово немедленного исполнения: Forth слово, чья семантика компиляции должна выполнить его семантику выполнения. определяемое реализацией: Обозначает системное поведение или особенности, которые должны быть обеспечены и документированы системой, но которые более детально не определены этим Стандартом. зависящее от реализации: Обозначает системное поведение или особенности, которые должны быть обеспечены системой, но которые более детально не определены этим Стандартом. входной буфер: Область памяти, содержащей последовательность символов из входного источника, которая настоящее время доступна для программы. входной источник: Устройство, файл, блок, или другой источник, который поставляет символы для пополнения входного буфера. спецификация входного источника: Набор информации, описывающей подробное состояние входного источника, входного буфера, и области анализа. Этой информации достаточно, для корректного сохранения и восстановления для обеспечения операций вложенного синтаксического анализа в том же или другом входном источнике. семантика интерпретации: Поведение Forth определения, когда его имя встречает текстовый интерпретатор в состоянии интерпретации. событие клавиатуры: Значение, полученное системой, обозначающее пользовательское действие на пользовательском входном устройстве. Термин "клавиатура" в этом документе не исключает другие типы пользовательских входных устройств. строка: Последовательность символов, с последующим фактическим или подразумеваемым признаком конца строки. область имен: Логическая область словаря, в которой сохранены имена определений. число: В этом Стандарте, "число" используемое без других оговорок, означает "целое число". Аналогично "двойное число" означает "целое число две-ячейки". анализ: Выбрать и исключить символьную строку из области анализа, используя заданный набор символов разделителей, называемых разделителями. область анализа: Часть входного буфера, которая еще не анализировалась, и таким образом доступна системе для последующей обработки текстовым интерпретатором или другими операциями синтаксического анализа. вывод отображаемого числа: Формат числового вывода, в который преобразовано число, используя Forth слова, который напоминает символическое "изображение" желаемого вывода. программа: Законченная спецификация выполнения, для выполнения определенной функции (прикладной задачи) выраженная в форме исходного текста Forth. 16 принять: Получить символы из пользовательского входного устройства. стек возвратов: Стек, который можно использовать для вложенного выполнения программ, выполнения do-loop, временной памяти, и других целей. стандартное слово: Именованная Forth процедура, формально определенная в этом Стандарте. пользовательское входное устройство: Устройство ввода данных, в настоящее время выбранное как источник получаемых данных, обычно клавиатура. пользовательское выходное устройство: Устройство вывода, в настоящее время выбранное как адресат выводимых данных. переменная: Именованная область данных расположенная и доступная по ее адресу памяти. слово: В зависимости от контекста: 1) имя Forth определения; или 2) анализируемая непрерывная последовательность символов, которая могла быть именем Forth определения. список слов: Список связанных имен Forth определений, который может быть исследован во время поиска в словаре. набор слов: Набор определений Forth, сгруппированных вместе в этом Стандарте под именем, указывающим на некоторые общие свойства, типично их общая область функционирования. 2.2 _______ Нотация 2.2.1 ________________ Числовая Нотация Если иначе не определено, все ссылки к числам относятся к знаковым целым числам одна-ячейка. Диапазон значений величин показывается как {от... до}. Допустимый диапазон для содержимого адреса показывается в двойных фигурных скобках, особенно для содержимого переменных, например, BASE {{2... 36}}. 2.2.2 ________________ Стековая нотация Входные и выходные параметры стековых определений описаны, с использованием следующей нотации: ( stack-id before -- after ) Где stack-id определяет, какой стек описывается, before представляет типы данных параметров стека перед выполнением определения и after представляет их после выполнения. Символы, используемые в before и after показаны в таблице 3.1. Stack-id стека потока-управления - "C:", stack-id стека данных - "S:", и stack- id стека возвратов - "R:". В случае отсутствия противоречий, stack-id стека данных, может быть опущен. Когда есть альтернативные варианты представления after, они описаны как "after1 | after2". Вершина стека - справа. Показываются только те элементы, которые требуются для выполнения или предоставляются в результате выполнения определения. 17 2.2.3 ______________________ Нотации анализа текста Если, кроме использования параметров стека, определение анализирует текст, то этот текст обозначенный сокращением из таблицы 2.1, показывается окруженным двойными кавычками и помещается между before параметрами и "-" разделителем в первом описанном стеке, Например: (S: before "аббревиатура анализируемого текста" - after). ___________________________________________ Таблица 2.1 - сокращения анализатора текста Сокращение Описание ------------------------------------------------------------------------ символ ограничитель, отмечающий конец анализируемой строки ноль или более последовательно расположенных символов char символ ограничитель - пробел ноль или более последовательно расположенных символов space символ ограничитель - двойная кавычка символ ограничитель - правая круглая скобка подразумеваемый ограничитель, отмечающий конец строки ccc анализируемая последовательность произвольных символов, исключая символ ограничитель name обозначение ограниченное пробелом, эквивалент ccc или ccc ------------------------------------------------------------------------ 2.2.4 _________________ Словарные нотации Словарные входы для каждого набора слов представлены стандартными ASCII последовательностями. Каждый вход словаря определяет ANS Forth слово и состоит из двух частей: индексной строки и семантического описания определения. 2.2.4.1 ________________________ Индексная строка словаря Индексная строка - однострочный вход содержащий, слева направо: - Номер раздела, последние четыре цифры которого определяют уникальный последовательный номер для всех слов, включенных в этот Стандарт; - ИМЯ-ОПРЕДЕЛЕНИЯ в верхнем регистре, фиксированной ширины, символы жирного начертания; - Произношение на естественном языке в кавычках, если оно отличается от Английского языка; - Обозначение набора слов из таблицы 2.2. Обозначение для расширения набора слов включает "EXT". ______________________________________ Таблица 2.2 - Обозначения наборов слов 18 Набор слов Обозначение ------------------------------------------- Базовый набор слов CORE Блочный набор слов BLOCK Набор слов двойных чисел DOUBLE Набор слов исключений EXCEPTION Сервисный набор слов FACILITY Набор слов доступа к файлу FILE Набор слов для плавающей точки FLOATING Locals набор слов LOCALS Набор слов распределения памяти MEMORY Набор слов утилит TOOLS Набор слов порядка поиска SEARCH Набор слов обработки строк STRING ------------------------------------------- 2.2.4.2 ______________________________ Семантическое описание словаря Первый параграф семантического описания содержит стековую нотацию для каждого стека, задействованного выполняемым словом. Остальные параграфы содержат текстовое описание семантики. Смотри 3.4.3 Семантика. 2.3 ______ Ссылки Следующие национальные и международные стандарты упомянуты в этом Стандарте: ANSI X3.172-1990, Dictionary for information systems (2.1 Определения терминов); ANSI X3.4-1974, American Standard Code for Information Interchange (ASCII) (3.1.2.1 Графические символы); ISO 646-1983, ISO 7-bit coded characterset for information interchange, International Reference Version (IRV) (3.1.2.1 Графические символы); ANSI/IEEE 754-1985, Floating-point standard (12.2.1 Определения терминов). 19 3. __________________ Условия применения Система должна предоставлять все слова, определенные в 6.1 Основные слова. Она также может предоставлять любые слова, определенные в дополнительных и расширенных наборах слов. Никакое стандартное слово предоставленное системой не должно изменять состояние системы способом, изменяющим эффект выполнения любого другого стандартного слова, иным чем предусмотрено в этом Стандарте. Система может содержать не стандартные расширения предусмотренного здесь, при условии, что они совместимы с требованиями этого Стандарта. Реализация слов и методов могущих использоваться в системе вне области рассмотрения этого Стандарта. Система не требует предоставления всех слов в выполняемой форме. Реализация может предоставлять определения, включая определения Основного набора слов, только в исходной форме. Если так, то механизм для добавления определений в словарь - определяемый реализацией. Программа, которая требует, чтобы система предоставила слова или методы, не определенные в этом Стандарте является зависимой от окружения. 3.1 ___________ Типы данных Тип данных идентифицирует набор допустимых значений для объекта данных. Это - не свойство конкретного местоположения в памяти или позиции на стеке. Перемещение объекта данных не будет затрагивать его тип. Система не требует никакой проверки типа данных. Неопределенная ситуация существует, если встречается неправильно определенный тип объекта данных. Таблица 3.1 суммирует типы данных, используемые везде в этом Стандарте. Множественные варианты одного и того же типа данных, в обозначении определения обозначены последовательными цифровыми сносками, для их различения. 3.1.1 ______________________ Отношения типов данных Некоторые из типов данных - подтипы других типов данных. Тип данных i - подтип типа j, если и только если члены i - подмножество членов j. Следующий список представляет отношения подтипов, используя фразу "i = > j" чтобы обозначить, что "i является подтипом j". Отношения подтипа транзитивны; если i = > j и j = > k , тогда i = > k: +n => u => x; +n => n => x; char => +n; a-addr => c-addr => addr => u; flag => x; 20 xt => x; +d => d => xd; +d => ud => xd. Любое определение Forth, которое принимает параметр типа i должно также принять параметр являющийся подтипом i. 3.1.2 _______________ Символьные типы Символы должны быть, по крайней мере, шириной в один адресуемый элемент, содержать по крайней мере восемь бит, и иметь размер меньше чем или равный размеру ячейки. Символы, предоставленные системой должны включать графические символы {32..126}, которые представляют графические формы, показанные в таблице 3.2. 3.1.2.1 ___________________ Графические символы Графический символ является обычным отображаемым символом (например, A, #, &, 6). Эти значения и графические формы, показанные в таблице 3.2, приняты непосредственно от ANS X3.4-1974 (ASCII) и ISO 646-1983, International Reference Version (IRV). Графические формы символов вне hex диапазона {20.. 7E} - зависящие от реализации. Программы, использующие графический символ hex 24 (знак валюты) имеют зависимость от окружения. Графическое представление символов не ограничено специфическим типом или стилем шрифта. Графика здесь это пример. 3.1.2.2 ___________________ Управляющие символы Все неграфические символы, включенные в определенный-реализацией набор символов определены в этом Стандарт как управляющие символы. В частности символы {0.. 31}, которые могли быть включены в определенный-реализацией набор символов - управляющие символы. Программы, которые требуют возможность посылать, или принимать управляющие символы имеют зависимость от окружения. _________________________ Таблица 3.1 - Типы данных Символ Тип данных Размер на стеке ------------------------------------------------------------------------- flag флаг 1 ячейка true флаг истина 1 ячейка false флаг ложь 1 ячейка char символ 1 ячейка n число со знаком 1 ячейка +n не отрицательное число 1 ячейка u без знаковое число 1 ячейка 21 n|u (1) число 1 ячейка x любая ячейка 1 ячейка xt идентификатор исполнения 1 ячейка addr адрес 1 ячейка a-addr выровненный адрес 1 ячейка c-addr символьно-выровненный адрес 1 ячейка d число со знаком две-ячейки 2 ячейки +d не отрицат. число две-ячейки 2 ячейки ud беззнаковое число две-ячейки 2 ячейки d|ud (2) число две-ячейки 2 ячейки xd любая пара ячеек 2 ячейки colon-sys компиляция определения определяемое реализацией do-sys do-loop структуры определяемое реализацией case-sys CASE структуры определяемое реализацией of-sys OF структуры определяемое реализацией orig источник потока-управления определяемое реализацией dest назначение потока-управления определяемое реализацией loop-sys loop-control параметры определяемое реализацией nest-sys вызовы определения определяемое реализацией i*x, j*x, k*x (3) любой тип данных 0 или более ячеек ------------------------------------------------------------------------- (1) Может быть число со знаком или без знака в зависимости от контекста. (2) Может быть две-ячейки число со знаком или две-ячейки число без знака в зависимости от контекста. (3) Может быть неопределенное число входов стека неопределенного типа. Для примеров использования, см. 6.1.1370 EXECUTE, 6.1.2050 QUIT. _____________________________________________ Таблица 3.2 - Стандартные графические символы Hex IRV ASCI Hex IRV ASCI Hex IRV ASCI Hex IRV ASCI Hex IRV ASCI Hex IRV ASCI --- --- ---- --- --- ---- --- --- ---- --- --- ---- --- --- ---- --- --- ---- 20 30 0 0 40 @ @ 50 P P 60 ` ` 70 p p 21 ! ! 31 1 1 41 A A 51 Q Q 61 a a 71 q q 22 " " 32 2 2 42 B B 52 R R 62 b b 72 r r 23 # # 33 3 3 43 C C 53 S S 63 c c 73 s s 24 - $ 34 4 4 44 D D 54 T T 64 d d 74 t t 25 % % 35 5 5 45 E E 55 U U 65 e e 75 u u 26 & & 36 6 6 46 F F 56 V V 66 f f 76 v v 27 ' ' 37 7 7 47 G G 57 W W 67 g g 77 w w 28 ( ( 38 8 8 48 H H 58 X X 68 h h 78 x x 29 ) ) 39 9 9 49 I I 59 Y Y 69 i i 79 y y 2A * * 3A : : 4A J J 5A Z Z 6A j j 7A z z 2B + + 3B ; ; 4B K K 5B [ [ 6B k k 7B { { 2C , , 3C < < 4C L L 5C \ \ 6C l l 7C | | 2D - - 3D = = 4D M M 5D ] ] 6D m m 7D } } 2E . . 3E > > 4E N N 5E ^ ^ 6E n n 7E ~ ~ 2F / / 3F ? ? 4F O O 5F _ _ 6F o o ----------------------------------------------------------------------------- 22 Определенный-реализацией фиксированный размер ячейки определен адресуемыми элементами и соответствующим количеством бит. См. E.2 Аппаратные особенности. Ячейки должны быть, по крайней мере, размером в один адресуемый элемент, и содержать, по крайней мере, 16-бит. Размер ячейки должен быть кратным целым размера символа. Элементы стека данных, элементы стека возвратов, адреса, идентификаторы исполнения, флаги, и целые числа - размером в одну ячейку. 3.1.3.1 _____ Флаги Флаги могут иметь одно из двух логических значений: true или false. Программы, которые используют флаги как арифметические операнды, имеют зависимость от окружения. True флаг, возвращенный стандартным словом должен иметь значение одна-ячейка со всеми установленными битами. A false флаг, возвращенный стандартным словом должен иметь значение одна-ячейка со всеми сброшенными битами. 3.1.3.2 ___________ Целые числа Определенный реализацией диапазон целых чисел со знаком должен включать {- 32767.. +32767}. Определенный реализацией диапазон неотрицательных целых чисел должен включать {0.. 32767}. Определенный реализацией диапазон целых чисел без знака должен включать {0.. 65535}. 3.1.3.3 ______ Адреса Адрес идентифицирует местоположение в области данных с размером одного адресуемого элемента, который программа может выбирать из памяти или заносить в память, кроме ограничений, установленных в этом Стандарте. Размер адресуемого элемента определен в битах. Каждое отличное значение адреса идентифицирует точно один такой запоминающий элемент. См. 3.3.3 Область данных. Набор символьно-выровненных адресов, адреса которыми можно обращаться к символу - определенное-реализацией подмножество всех адресов. Добавление размера символа к символьно-выровненному адресу должно произвести другой символьно- выровненный адрес. Набор выровненных адресов - определенное-реализацией подмножество символьно- выровненных адресов. Добавление размера ячейки к выровненному адресу должно произвести другой выровненный адрес. 3.1.3.4 ___________________ Строки со счетчиком Строка со счетчиком в памяти идентифицирована адресом (c-addr)символа её длины. Символ длины строки со счетчиком должен содержать число символов данных двоичного представления, между нулем и определенной-реализацией максимальной длиной для строки со счетчиком. Максимальная длина строки со счетчиком должна быть, по крайней мере, 255. 23 3.1.3.5 _________________________ Идентификаторы исполнения Различные определения могут иметь один и тот же идентификатор исполнения, если определения эквивалентны. 3.1.4 _______________ Типы пара-ячеек Пара-ячеек в памяти состоит из последовательности двух непрерывных ячеек. Ячейка с меньшим адресом - первая ячейка, и её адрес используется, для идентификации пары ячеек. Если иначе не определено, пара ячеек на стеке состоит из первой ячейки непосредственно выше второй ячейки. 3.1.4.1 ______________________ Целые числа две-ячейки На стеке, ячейка содержащая самую старшую часть целого числа две-ячейки должна быть выше ячейки содержащей самую младшую часть. Определенный-реализацией диапазон целых чисел две-ячейки со знаком должен включать {-2147483647..+2147483647}. Определенный-реализацией диапазон не отрицательных целых две-ячейки чисел должен включать {0..2147483647}. Определенный-реализацией диапазон без знаковых целых чисел две-ячейки должен включать {0..4294967295}. Размещение нулевого целого числа одна-ячейка на стеке выше целого числа одна-ячейка без знака производит целое число две-ячейки без знака с тем же самым значением. См. 3.2.1.1 Внутреннее представление числа. 3.1.4.2 _________________ Символьные строки Строка определенная как пара ячеек (c-addr u) представляет её стартовый адрес и длину в символах. 3.1.5 ______________ Системные типы Системные типы данных определяют допустимые комбинации слов в течение компиляции и выполнения. 3.1.5.1 _________________________ Системные типы компиляции Эти типы данных обозначают нуль или большее количество элементов на стеке потока-управления (см. 3.2.3.2). Возможное присутствие таких элементов на стеке данных означает, что любые элементы уже там находящиеся должны быть недоступны программе, пока не использованы элементы стека потока-управления. Зависящие-от-реализации данные, сгенерированные после начала компиляции определения и использованные при его завершении обозначены символом colon-sys повсюду этом Стандарте. Зависящие-от-реализации данные, сгенерированные после начала компиляции do-loop структуры типа DO ... LOOP и использованные при её завершении обозначены символом do-sys повсюду этом Стандарте. 24 Зависящие-от-реализации данные, сгенерированные после начала компиляции CASE ... ENDCASE структуры и использованные при её завершении обозначены символом case-sys повсюду этом Стандарте. Зависящие-от-реализации данные, сгенерированные после начала компиляции OF ... ENDOF структуры и использованные при её завершении обозначены символом of-sys повсюду этом Стандарте. Зависящие-от-реализации данные, сгенерированные и использованные при выполнении другого стандартного слова потока-управления обозначены символами orig и dest повсюду в этом Стандарте. 3.1.5.2 _________________________ Системные типы выполнения Эти типы данных обозначают нуль или большее количество элементов на стеке возвратов. Их возможное присутствие означает, что любые элементы на стеке возвратов уже должны быть недоступны программе, пока элементы системных типов выполнения не использованы. Зависящие-от-реализации данные, сгенерированные после начала выполнения определения и использованные после выхода из него обозначены символом nest-sys повсюду в этом Стандарте. Зависящие-от-реализации параметры loop-control используемые для управления выполнением do-loops обозначены символом loop-sys повсюду в этом Стандарте. Loop-control параметры должны быть доступны внутри do-loop для слов, которые используют или изменяют эти параметры, слова типа I, J, LEAVE и UNLOOP. 3.2 ________________ Среда выполнения 3.2.1 _____ Числа 3.2.1.1 ______________________________ Внутреннее представление числа Этот Стандарт допускает представления чисел и арифметические операции с обратным кодом (дополнение до единицы), с дополнительным кодом (дополнение до двух), или величин со знаком. Арифметический нуль представлен как значение одна-ячейка со всеми сброшенными битами. Представление числа как скомпилированного литерала или в памяти - зависящее от реализации. 3.2.1.2 ___________________ Преобразование цифр Числа должны быть представлены внешне с использованием символов из стандартного набора символов. Преобразование между внутренними и внешними формами цифры должно производиться следующим образом: Значение в BASE - основание системы счисления для преобразования чисел. Цифра имеет значение в пределах от нуля до на единицу меньшего содержимого BASE. Цифра с нулевым значением соответствует символу "0". Это представление цифр продолжается по набору символов до десятичного значения девять соответствующему символу "9". Для цифр начинающихся с десятичного значения десять используются графические символы начинающиеся с символа "A". 25 Это соответствие продолжается вплоть до, и включая цифру с десятичным значением тридцать пять, которая представляется символом "Z". Преобразование цифр вне этого диапазона - определенное реализацией. 3.2.1.3 __________________________________ Изображение чисел в свободном поле Изображение чисел в свободном поле использует символы, описанные в Преобразовании цифр, без предшествующих нулей, в поле точно по размеру преобразованной строки плюс конечный пробел. Если число нулевое, наименьшая значащая цифра не рассматривается как начальный ноль. Если число отрицательное, отображается ведущий знак "минус". Изображение чисел может использовать буфер выходной строки отображаемого числа, для хранения частично преобразованных строк (см. 3.3.3.6 Другие временные области). 3.2.2 __________ Арифметика 3.2.2.1 _____________________ Целочисленное деление Деление производит частное q и остаток r, деля операнд a на операнд b. Операции деления возвращают q, r, или оба. Тождество b * q + r = a должно сохраняться для всех a и b. Когда делятся целые числа без знака, и остаток - не нулевой, q - самое большее целое число меньше чем истинное частное. Когда делятся целые числа со знаком, и остаток - не нулевой, и a и b имеют одинаковый знак, q - самое большее целое число меньше чем истинное частное. Если только один операнд отрицательный, округлено ли q к отрицательной бесконечности (минимальное деление) или округлено к нулю (симметричное деление) - определенное реализацией. Минимальное деление - целочисленное деление, в котором остаток имеет знак делителя или нулевой, и частное округлено к его арифметическому минимуму. Симметричное деление - целочисленное деление, в котором остаток имеет знак делимого или нуль и частное - математическое частное "округленное к нулю" или "обрезанное". Примеры каждого показаны в таблицах 3.3 и 3.4. В случаях, где операнды отличаются по знаку и в вопросе направления округления, программа должна или включать код, генерирующий желательную форму деления, не полагаясь на результат по умолчанию определенный реализацией, или иметь зависимость от окружения желательного направления округления. _________________________________________ Таблица 3.3 - Пример минимального деления Делимое Делитель Остаток Частное ---------------------------------------- 10 7 3 1 -10 7 4 -2 10 -7 -4 -2 -10 -7 -3 1 ---------------------------------------- 26 __________________________________________ Таблица 3.4 - Пример симметричного деления Делимое Делитель Остаток Частное ---------------------------------------- 10 7 3 1 -10 7 -3 -1 10 -7 3 -1 -10 -7 -3 1 ---------------------------------------- 3.2.2.2 _____________________________ Другие целочисленные операции Во всех целочисленных арифметических операциях переполнение и антипереполнение должны игнорироваться. Возвращаемое значение, когда происходит переполнение или антипереполнение - определенное реализацией. 3.2.3 _____ Стеки 3.2.3.1 ___________ Стек Данных Объекты на стеке данных должны быть шириной в одну ячейку. 3.2.3.2 ____________________ Стек потока-управления Стек потока-управления - это список типа "последним пришел", "первым вышел", чьи элементы определяют допустимые соответствия слов потока-управления и ограничения, наложенные на использование стека данных в течение компиляции управляющих структур. Элементы стека потока-управления - системные типы данных компиляции. Стек потока-управления, может, но не обязательно, физически существовать в реализации. Если он существует, то может быть, но не обязательно, реализован с использованием стека данных. Формат стека потока-управления - определяется реализацией. Так как стек потока-управления может быть реализован с использованием стека данных, элементы, помещенные на стек данных недоступны для программ после помещения элементов на стек потока-управления, и остаются недоступным до удаления элементов стека потока-управления. 3.2.3.3 ______________ Стек возвратов Элементы на стеке возвратов должны состоять из одной или более ячеек. Система может использовать стек возвратов зависящим от реализации способом в течение компиляции определений, в течение выполнения do-loops, и для сохранения вложенной информации во время выполнения. Программа может использовать стек возвратов как временную память в течение выполнения определения, подчиняясь следующим ограничениям: - Программа не должна обращаться к значениям на стеке возвратов (используя R@, R>, 2R@ или 2R>) для элементов, не размещенных туда с помощью >R или 2>R; - Программа не должна обращаться изнутри do-loop к значениям, помещенным на стек возвратов прежде, чем был открыт цикл; 27 - Все значения, помещенные на стек возвратов в пределах do-loop должны быть удалены прежде, чем будут выполнены I, J, LOOP, +LOOP, UNLOOP, или LEAVE; - Все значения, помещенные на стек возвратов в пределах определения должны быть удалены перед тем, как определение будет закончено или прежде, чем будет выполнен EXIT. 3.2.4 __________________ Терминал Оператора См. 1.2.2 Исключения. 3.2.4.1 _________________________________ Пользовательское устройство ввода Метод выбора пользовательского устройства ввода данных - определенный реализацией. Метод индикации конца входной строки текста - определенный реализацией. 3.2.4.2 __________________________________ Пользовательское устройство вывода Метод выбора пользовательского устройства вывода - определенный реализацией. 3.2.5 _______________________________________ Запоминающее устройство большой емкости Система не предусматривает какие либо стандартные слова для доступа к запоминающему устройству большой емкости. Если система предоставляет какое либо стандартное слово для доступа к запоминающему устройству большой емкости, она должна также дополнить Блочный набор слов. 3.2.6 ___________________ Запросы к окружению Пространства имен для ENVIRONMENT? и определений непересекающиеся. Названия определений являющиеся такими же как ENVIRONMENT? строки не должны мешать операции ENVIRONMENT?. Таблица 3.5 содержит допустимые входные строки и соответствующие возвращаемые значения для запросов к программной среде с помощью ENVIRONMENT?. _________________________________________ Таблица 3.5 - Строки запросов к окружению Строка Тип Константа Значение --------------------------------------------------------------------------- /COUNTED-STRING n yes максимальный размер строки со счетчиком, в символах /HOLD n yes размер буфера выходной строки отображаемого числа, в символах /PAD n yes размер рабочей области, указываемой PAD, в символах ADDRESS-UNIT-BITS n yes размер одного адресуемого элемента, в битах CORE flag no true если присутствует полный основной набор слов (то есть, не подмножество как определено в 5.1.1) CORE-EXT flag no true если присутствует расширенный набор слов FLOORED flag yes true если минимальное деление по умолчанию MAX-CHAR u yes максимальное значение какого либо символа в наборе символов определенном реализацией 28 MAX-D d yes наибольшее используемое знаковое двойное число MAX-N n yes наибольшее используемое знаковое число MAX-U u yes наибольшее используемое без знаковое число MAX-UD ud yes наибольшее используемое без знаковое двойное число RETURN-STACK-CELLS n yes максимальный размер стека возвратов, в ячейках STACK-CELLS n yes максимальный размер стека данных, в ячейках --------------------------------------------------------------------------- Если запрос к окружению (с помощью ENVIRONMENT?) возвращает false (то есть, неизвестное) в ответ на строку, последующие запросы, использующие ту же самую строку могут возвратить true. Если запрос возвращает true (то есть, известный) в ответ на строку, последующие запросы с той же самой строкой должны также возвращать true. Если запрос, обозначенный как константа в вышеупомянутой таблице, возвращает true и значение в ответ на строку, последующие запросы с той же самой строкой должны возвратить true и то же самое значение. 3.3 _____________ Словарь Forth Слова Forth организованы в структуру называемую словарем. В то время как форма этой структуры не определена Стандартом, она может быть описана как состоящая из тех логических частей: области имени, области кода, и области данных. Логическое разделение этих частей не требует их физического разделения. Программа не должна брать или сохранять данные в место вне области данных. Неоднозначное условие существует, если программа адресует область имени или область кода. 3.3.1 _____________ Область имени Отношения между областью имени и областью данных - зависящие от реализации. Структура списка слов - зависящая от реализации. Когда в списке слов существуют дубликаты имен, в процессе поиска имени должен быть найден последний определенный дубликат. 3.3.1.2 _________________ Имена определений Имена определений должны содержать {1.. 31} символов. Система может позволять или запрещать создание имен определений, содержащих не стандартные символы. Программы, которые используют строчные буквы для стандартных имен определений или зависят от регистро-чувствительных свойств системы - имеют зависимость от окружения. Программа не должна создавать имена определений, содержащие неграфические символы. 3.3.2 ____________ Область кода Отношения между областью кода и областью данных - зависящие от реализации. 29 3.3.3 ______________ Область данных Область данных - единственная логическая область словаря, для которой предусмотрены стандартные слова, для того чтобы распределять и обращаться к областям памяти. Этими областями являются: непрерывные области, переменные, области текстовых констант, буферы ввода, и другие временные области, каждая из которых описана в следующих разделах. Программа может читать из или записывать в эти области, если иначе не определено. 3.3.3.1 ___________________ Выравнивание адреса Большинство адресов, используемых в ANS Forth это выровненные адреса (обозначены - a-addr) или символьно-выровненные (обозначены c-addr). ALIGNED, CHAR+, и арифметические операции могут изменять состояние выравнивания адреса на стеке. CHAR+ применяемое к выровненным адресам возвращает символьно- выровненные адреса, которые могут использоваться только, для обращения к символам. Применение CHAR+ к символьно-выровненному адресу производит следующий символьно-выровненный адрес. Добавление или вычитание произвольного числа к адресу может производить не выровненный адрес, который не может быть использован для выборки или сохранения чего-нибудь. Единственный путь найти следующий выровненный адреса - это ALIGNED. Неопределенная ситуация существует когда @, !, , (запятая), +!, 2@, or 2! используется с адресом, который не выровнен, или когда C@, C!, или C, используется с адресом, который не символьно-выровненный. Определения 6.1.1000 CREATE и 6.1.2410 VARIABLE требуют, чтобы определения созданные ими возвращали выровненные адреса. После того, как определения откомпилированы, или выполнено слово ALIGN, указатель области данных гарантировано будет выровненным. 3.3.3.2 ___________________ Непрерывные области Система гарантирует, что зона области данных распределенная с использованием ALLOT, , (запятая) , C, (c-запятая) , и ALIGN, будет неразрывна с предыдущей зоной, распределенной одним из вышеупомянутых слов, если не применяются ограничения из следующих параграфов. Указатель области данных HERE всегда идентифицирует начало следующей зоны области данных, которая будет распределена. Как только последовательные распределения сделаны, увеличивается указатель области данных. Программа может исполнять адресную арифметику в пределах непрерывно распределенной области. Последняя зона области данных распределенная с использованием вышеупомянутых операторов может быть освобождена, распределением соответствующей зоны отрицательного размера, используя ALLOT, с соблюдением ограничений следующих параграфов. CREATE устанавливает начало непрерывной зоны области данных, чей стартовый адрес возвращен созданным CREATE определением. Эта зона заканчивается, компиляцией следующего определения. Так как реализация не накладывает ограничений на распределение области данных для использования кодом, вышеупомянутые операторы не обязаны производить непрерывные зоны области данных, если между распределениями были добавлены или удаленны из словаря определения. Неопределенная ситуация существует если освобожденная память содержит определения. 3.3.3.3 __________ Переменные 30 Область, распределенная для переменной может состоять из нескольких несмежных участков с областями впоследствии распределенными с помощью , (запятая) или ALLOT. Например, в: VARIABLE X 1 CELLS ALLOT зона X и распределенная ALLOT зона могут быть несмежными. Некоторые поставляемые-системой переменные, типа STATE, ограничены доступом только для чтения. 3.3.3.4 __________________________ Области текстовых констант Области текстовых констант, заданные строками, откомпилированными с помощью S" и C", могут быть только-для-чтения. Программа не должна сохранять в областях текстовых констант созданных с помощью S" и C", ни в другие только-для-чтения системные переменные или только-для- чтения временные области. Неопределенная ситуация существует когда программа пытается сохранять в области только-для-чтения. 3.3.3.5 ______________ Входные буферы Адрес, длина, и содержание входного буфера могут быть временными. Программа не должна записывать во входной буфер. В отсутствии каких либо дополнительных наборов слов предусматривающих альтернативные входные источники, входной буфер - это либо входной буфер терминала, используемый QUIT для хранения одной строки из пользовательского устройства ввода данных, либо буфер определяемый EVALUATE. Во всех случаях SOURCE возвращает начальный адрес и длину в символах текущего входного буфера. Минимальный размер входного буфера терминала должен быть 80 символов. Адрес и длина возвращенная SOURCE, строки возвращенной PARSE, и непосредственно вычисленный адрес входного буфера имеют силу только пока текстовый интерпретатор не делает ввод-вывод для наполнения входного буфера, или не изменен входной источник. Программа может изменять размер области анализа, изменяя содержимое >IN в пределах ограничений, наложенных этим Стандартом. Например, если содержимое >IN сохранено перед операцией анализа и восстановлено впоследствии, текст, который анализировался, будет доступен снова для последующих операций синтаксического анализа. Степень допустимого повторного позиционирования с использованием этого метода зависит от входного источника (см. 7.3.3 Области Блочного буфера и 11.3.4 Входной источник). Программа может непосредственно исследовать входной буфер, используя его адрес и длину возвращенную SOURCE; начало области анализа в пределах входного буфера индексировано числом в >IN. Значения имеют силу на ограниченный срок. Неопределенная ситуация существует если программа изменяет содержимое входного буфера. 3.3.3.6 ________________________ Другие временные области Зоны области данных, идентифицированные PAD, WORD, и #> (буфер выходной строки отображаемого числа) могут быть временными. Их адреса и содержание могут стать недействительными после того, как: - создано определение через определяющее слово; 31 - определения скомпилированы с помощью : или :NONAME; - область данных выделена, с помощью ALLOT, , (запятая), C, (c-запятая), или ALIGN. Предыдущее содержание областей, идентифицированных WORD и #> , может быть недействительно после каждого использования этих слов. Кроме того, области, возвращенные WORD и #> , могут накладываться в памяти. Следовательно, использование одного из этих слов может разрушать область, возвращенную ранее другим словом. Другие слова, которые создают выходную строку отображаемого числа (<#, #, #S, и HOLD) могут также изменять содержание этих областей. Слова, которые выводят числа, могут быть реализованы с использованием слов вывода отображаемых чисел. Следовательно . (точка), .R, .S, ?, D., D.R, U., и U.R могут также разрушать области. Размер рабочей области, чей адрес возвращен PAD, должен быть, по крайней мере, 84 символа. Содержание области адресованной PAD предназначено, для того чтобы быть под полным контролем пользователя: никакие слова, определенные в этом Стандарте не помещают что-либо в эту область, также при изменении распределения области данных как описано в 3.3.3.2 непрерывная область может изменять адрес возвращаемый PAD. Нестандартные слова, предусмотренные реализацией, могут использовать PAD, но такое использование должно быть документировано. Размер области, идентифицированной WORD должен быть, по крайней мере, 33 символа. Размер буфера строки отображаемого числового вывода должен быть, по крайней мере, (2*n) + 2 символов, где n - число бит в ячейке. Программы, которые рассматривают её фиксированной областью с не изменяющимися параметрами доступа - имеют зависимость от окружения. 3.4 __________________________ Интерпретатор текста Forth После запуска система должна иметь возможность интерпретировать, как описано в 6.1.2050 QUIT, Forth исходный текст полученный в интерактивном режиме из пользовательского устройства ввода данных. Такие интерактивные системы обычно предоставляют "приглашение", указывающее, что они принимают пользовательский запрос и действуют в соответствии с ним. Определенное реализацией приглашение Forth должно содержать слово "OK" в некоторой комбинации верхних или строчных букв. Текстовая интерпретация (см. 6.1.1360 EVALUATE и 6.1.2050 QUIT) должна повторять последовательные шаги до опустения области анализа, или возникновения неопределенной ситуации: а) Пропустить ведущие пробелы и выделить имя (см. 3.4.1); б) Просмотреть область имен словаря (см. 3.4.2). Если имя определения, соответствующее строке найдено: 1) при интерпретации, исполнить семантику интерпретации определения (см. 3.4.3.2), и продолжить с а); 2) при компиляции, исполнить семантику компиляции определения (см. 3.4.3.3), и продолжить с а). в) Если имя определения, соответствующее строке не найдено, пытаться преобразовать строку в число (см. 3.4.1.3). Если успешно: 32 1) при интерпретации, положить число на стек данных, и продолжить с а); 2) при компиляции, скомпилировать код, который при выполнении положит число на стек (см. 6.1.1780 LITERAL), и продолжить с а); г) Если неудачно, существует неопределенная ситуация (см. 3.4.4). 3.4.1 _____________________ Синтаксический анализ Если иначе не отмечено, число анализируемых символов может быть от нуля до определенной реализацией максимальной длины строки со счетчиком. Если область анализа пуста, то есть когда число в >IN равно длине входного буфера, или не содержит других символов кроме разделителей, то выбранная строка пуста. Иначе, выбранная строка начинается со следующего символа в области анализа, который является символом, индексированным содержимым >IN. Неопределенная ситуация существует если число в >IN больше чем размер входного буфера. Если символы-разделители присутствуют в области анализа после начала выбранной строки, строка продолжается вплоть до символа как раз перед первым таким разделителем, и число в >IN изменяется, так чтобы указывать непосредственно после этого разделителя, таким способом удаляются анализируемые символы и разделитель из области анализа. Иначе, строка продолжается вплоть до последнего символа в области анализа, и число в >IN изменяется на длину входного буфера, таким способом освобождая область анализа. Синтаксический анализ может изменять содержимое >IN, но не должен затрагивать содержимое буфера ввода. В частности, если значение в >IN сохранено перед стартом анализа, возврат >IN к этому значению немедленно после анализа, должен восстановить область анализа без потери данных. 3.4.1.1 ___________ Разделители Если разделитель - пробел (hex 20 (BL)) управляющие символы могут быть интерпретированы как разделители. Набор условий, если таковые вообще имеются, согласно которым разделитель "пробел" соответствует управляющим символам - определенное реализацией. Для пропуска ведущих разделителей необходимо пропустить ноль или более смежных разделителей в области анализа перед синтаксическим анализом. 3.4.1.2 _________ Синтаксис Forth имеет простой, операторно-упорядоченный синтаксис. Фраза A B C возвращает значения, как будто A было выполнено первым, затем B и наконец C. Слова, которые вызывают отклонения от этого линейного потока-управления, называются словами потока-управления. Структуры потока-управления - комбинации слов потока-управления, чьи стековые эффекты являются совместимой формой. Примеры типичного использования даны для каждого слова потока-управления в Приложении A. Синтаксис Forth расширяем; например, в терминах существующих могут быть определены новые слова потока-управления. Этот Стандарт не требует синтаксиса или средств проверки структуры программы. 33 3.4.1.3 ______________________________________________________ Преобразование входных чисел текстового интерпретатора При преобразовании входных чисел, текстовый интерпретатор должен распознавать положительные и отрицательные числа; отрицательные числа, представленные отдельным знаком "минус" (символом "-") предшествующим цифрам. Значение в BASE - основание системы счисления для преобразования чисел. 3.4.2 ______________________ Поиск имен определений Строка соответствует имени определения, если каждый символ в строке соответствует соответствующему символу в строке, используемой как имя определения, когда определение было создано. Регистровая чувствительность (действительно ли символы верхнего регистра соответствуют символам нижнего регистра) - определенная реализацией. Система может быть либо чувствительной к регистру и трактовать символы верхнего - и нижнего регистра как различные и не соответствующие, либо нечувствительной к регистру, игнорируя различия в регистре при поиске. Соответствие символов верхнего - и нижнего регистра с алфавитными символами в расширенном наборе символов типа интернациональных символов с диакритическим знаком - определенное реализацией. Система должна быть способна к нахождению имен определений, определенных в этом Стандарте, когда они записаны символами в верхнем регистре. 3.4.3 _________ Семантика Семантика определения Forth реализована машинным кодом или последовательностью идентификаторов исполнения или другими представлениями. Они в значительной степени определены стековой нотацией в словарных входах, которые показывают какие значения должны быть использованы и произведены. Проза в каждом входе словаря далее определяет поведение определения. Каждое определение Forth может иметь несколько поведений, описанных в следующих разделах. Термины "семантика инициации" и "семантика времени-выполнения" относятся к фрагментам определения, и имеют значение только в пределах индивидуальных входов словаря, где они появляются. 3.4.3.1 ____________________ Семантика выполнения Семантика выполнения каждого определения Forth определена в секции "Выполнение:" его входа словаря. Когда определение имеет только одно указанное поведение, метка опущена. Выполнение может происходить неявно, когда выполняется определение, в которое оно было скомпилировано, или явно, когда его идентификатор исполнения передается в EXECUTE. Семантика выполнения синтаксически правильного определения при условиях отличных от тех, что определены в этом Стандарте - зависящая от реализации. Входы словаря для определяющих слов включают семантику выполнения для нового определения в секции "имя Выполнение:". 3.4.3.2 _______________________ Семантика интерпретации Если иначе не определено в секции "Интерпретация:" входа словаря, семантика интерпретации определения Forth - это его семантика выполнения. 34 Система должна быть способна выполнить в состоянии интерпретации все определения из основного набора слов и любые определения, включенные в дополнительный набор слов или слова расширенного набора, чья семантика интерпретации определена в этом Стандарте. Система должна быть способна выполнить в состоянии интерпретации любые новые определения созданные в соответствии с 3. Условия применения. 3.4.3.3 ____________________ Семантика компиляции Если иначе не определено в секции "Компиляция:" входа словаря, семантика компиляции определения Forth должна добавить его семантику выполнения в конец семантики выполнения текущего определения. 3.4.4 _____________________________________________ Возможное действие на неопределенную ситуацию Когда существует неопределенная ситуация, система может предпринимать одно или более из следующих действий: - игнорировать, и продолжить; - вывести сообщение; - выполнить специфическое слово; - установить состояние интерпретации и начать текстовую интерпретацию; - предпринимать другие действия определенные реализацией; - предпринимать зависящие от реализации действия. Ответ на специфическую неопределенную ситуацию не обязан быть один и тот же при всех обстоятельствах. 3.4.5 __________ Компиляция Программа не должна пытаться выполнять вложенную компиляцию определений. В течение компиляции текущего определения, программа не должна выполнять никакое определяющее слово, :NONAME, или любое определение, которое распределяет область данных словаря. Компиляция текущего определения может быть приостановлена, с помощью [ (левая скобка) и продолжена, с помощью ] (правая скобка). Если компиляция текущего определения приостановлена, программа не должна выполнять никакое определяющее слово, :NONAME, или любое определение, которое распределяет область данных словаря. 35 4. ___________________________ Документационные требования Когда невозможно или неосуществимо для системы или программы определить ее детали поведения, допустимо установить, что поведение - точно неопределяемое и объяснить обстоятельства и причины, почему это - так. 4.1 ______________________ Системная документация 4.1.1 ______________________________ Опции определяемые реализацией В следующем списке пункты определенные реализацией представляют характеристики и варианты, оставленные на усмотрение разработчика, при условии, что выполнены требования этого Стандарта. Система должна документировать значения, или поведения, для каждого пункта. - требования к выравниванию адреса (3.1.3.3 Адреса); - поведение 6.1.1320 EMIT для неграфических символов; - символьное редактирование 6.1.0695 ACCEPT и 6.2.1390 EXPECT; - набор символов (3.1.2 Символьные типы, 6.1.1320 EMIT, 6.1.1750 KEY); - требования символьно-выровненного адреса (3.1.3.3 Адреса); - характеристики, соответствующие расширениям набора символов (3.4.2 Поиск имен определений); - условия, при которых управляющие символы соответствуют пробельному разделителю (3.4.1.1 Разделители); - формат стека потока-управления (3.2.3.2 Стек потока-управления); - преобразование цифр больших, чем тридцать пять (3.2.1.2 Преобразование цифр); - изображение после окончания ввода в 6.1.0695 ACCEPT и 6.2.1390 EXPECT; - последовательность сброса исключения (как в 6.1.0680 ABORT"); - признак конца входной строки (3.2.4.1 Пользовательское устройство ввода данных); - максимальный размер строки со счетчиком, в символах (3.1.3.4 Строки со счетчиком, 6.1.2450 WORD); - максимальный размер анализируемой строки (3.4.1 Синтаксический анализ); - максимальный размер имени определения, в символах (3.3.1.2 Имена определений); - максимальная длина строки для 6.1.1345 ENVIRONMENT?, в символах; - метод выбора 3.2.4.1 Пользовательское устройство ввода; - метод выбора 3.2.4.2 Пользовательское устройство вывода; - методы компиляции словаря (3.3 Словарь Forth); - число бит в одном адресуемом элементе (3.1.3.3 Адреса); - представление числа и арифметика (3.2.1.1 Внутреннее представление числа); - диапазоны для n, +n, u, d, +d, и ud (3.1.3 Типы одна-ячейка, 3.1.4 Типы пара- ячеек); - зоны области данных только-для-чтения (3.3.3 Область данных); - размер буфера в 6.1.2450 WORD (3.3.3.6 Другие временные области); - размер одной ячейки в адресуемых элементах (3.1.3 Типы одна-ячейка); - размер одного символа в адресуемых элементах (3.1.2 Символьные типы); - размер входного буфера клавиатуры терминала (3.3.3.5 Входные буферы); - размер буфера строки вывода отображаемого числа (3.3.3.6 Другие временные области); - размер рабочей области, чей адрес возвращен 6.2.2000 PAD (3.3.3.6 Другие временные области); - системные регистро-чувствительные характеристики (3.4.2 Поиск имен определений); - системное приглашение (3.4 Интерпретатор текста Forth, 6.1.2050 QUIT); - тип округления деления (3.2.2.1 Целочисленное деление, 6.1.0100 */, 6.1.0110 */MOD, 6.1.0230 /, 6.1.0240 /MOD, 6.1.1890 MOD); 36 - значения 6.1.2250 STATE, если true; - значения, возвращаемые после арифметического переполнения (3.2.2.2 Другие целочисленные операции); - может ли текущее определение быть найдено после 6.1.1250 DOES> (6.1.0450 :). 4.1.2 _____________________ Неоднозначные условия Система должна документировать системное действие, предпринимаемое на каждое общее или специфическое неоднозначное условие, идентифицированное в этом Стандарте. См. 3.4.4 Возможное действие на неопределенную ситуацию. Следующие общие неоднозначные условия могут происходить из-за комбинации факторов: - имя не определено ни допустимым именем определения, ни допустимым числом в течение интерпретации текста (3.4 Интерпретатор текста Forth); - имя определения превысило максимальную допустимую длину (3.3.1.2 Имена определений); - адресование области, не перечисленной в 3.3.3 Области данных; - тип параметра, несовместимый с указанным входным параметром, например, передача флага слову ожидающему n (3.1 Типы данных); - попытка получить идентификатор исполнения (например, с помощью 6.1.0070 ', 6.1.1550 FIND, и т.д.) определения с неопределенной семантикой интерпретации; - деление на ноль (6.1.0100 */, 6.1.0110 */MOD, 6.1.0230 /, 6.1.0240 /MOD, 6.1.1561 FM/MOD, 6.1.1890 MOD, 6.1.2214 SM/REM, 6.1.2370 UM/MOD, 8.6.1.1820 M*/); - недостаточный размер стека данных или размер стека возвратов (переполнение стека); - недостаточно места для параметров loop-control; - недостаточно места в словаре; - интерпретация слова с неопределенной семантикой интерпретации; - изменение содержания входного буфера или строкового литерала (3.3.3.4 Области текстовых констант, 3.3.3.5 Входные буферы); - переполнение строки вывода отображаемого числа; - переполнение анализируемой строки; - производимый результат вне диапазона, например умножение (с использованием *) приводит к значению слишком большому, чтобы быть представленным целым числом одна-ячейка (6.1.0090 *, 6.1.0100 */, 6.1.0110 */MOD, 6.1.0570 >NUMBER, 6.1.1561 FM/MOD, 6.1.2214 SM/REM, 6.1.2370 UM/MOD, 6.2.0970 CONVERT, 8.6.1.1820 M*/); - чтение из пустого стека данных или стека возвратов (выход за нижнюю границу стека); - неожиданный конец входного буфера, приводящий к попытке использовать строку нулевой длины как имя; Следующие специфические неоднозначные условия отмечены в словарных входах важных слов: - >IN больше чем размер входного буфера (3.4.1 Синтаксический анализ); - 6.1.2120 RECURSE появляется после 6.1.1250 DOES>; - параметр источника ввода, отличный от текущего входного источника для 6.2.2148 RESTORE-INPUT; - область данных, содержащая определения освобождена (3.3.3.2 Непрерывные области); - чтение-запись области данных с неправильным выравниванием (3.3.3.1 Выравнивание адреса); - указатель области данных, не должным образом выровненный (6.1.0150 ,, 6.1.0860 C,); - меньше чем u+2 элементов в стеке (6.2.2030 PICK, 6.2.2150 ROLL); - параметры loop-control не доступны (6.1.0140 +LOOP, 6.1.1680 I, 6.1.1730 J, 6.1.1760 LEAVE, 6.1.1800 LOOP, 6.1.2380 UNLOOP); 37 - самое последнее определение не имеет имени (6.1.1710 IMMEDIATE); - имя, не определенное 6.2.2405 VALUE, для использования с 6.2.2295 TO; - имя, не найдено (6.1.0070 ', 6.1.2033 POSTPONE, 6.1.2510 ['], 6.2.2530 [COMPILE]); - параметры не одного типа (6.1.1240 DO, 6.2.0620 ?DO, 6.2.2440 WITHIN); - 6.1.2033 POSTPONE, или 6.2.2530 [COMPILE] применено к 6.2.2295 TO; - строка длиннее, чем строка со счетчиком возвращенная 6.1.2450 WORD; - u больше или равно числу битов в ячейке (6.1.1805 LSHIFT, 6.1.2162 RSHIFT); - слово, не определенное с помощью 6.1.1000 CREATE (6.1.0550 >BODY, 6.1.1250 DOES>); - слова, ненадлежащим образом используемые вне 6.1.0490 <# и 6.1.0040 #> (6.1.0030 #, 6.1.0050 #S, 6.1.1670 HOLD, 6.1.2210 SIGN). 4.1.3 _____________________________ Другая системная документация Система должна предоставить следующую информацию: - список нестандартных слов, использующих 6.2.2000 PAD (3.3.3.6 Другие временные области); - доступные терминальные средства оператора; - доступная область данных программы, в адресуемых элементах; - доступный размер стека возвратов, в ячейках; - доступный размер стека, в ячейках; - требуемое системное пространство словаря, в адресуемых элементах. 4.2 ________________________ Программная документация 4.2.1 _____________________ Зависимости окружения Программа должна документировать следующие зависимости окружения, где они применяются, и должна документировать другие известные зависимости окружения: - рассмотрение буфера строки вывода отображаемого числа фиксированной областью с неизменными параметрами доступа (3.3.3.6 Другие временные области); - зависимости присутствия или отсутствия неграфических символов в полученной строке (6.1.0695 ACCEPT, 6.2.1390 EXPECT); - доверие к особенностям направления округления (3.2.2.1 Целочисленное деление); - требования к особенностям представления чисел и арифметики (3.2.1.1 Внутреннее представление числа); - требование к нестандартным словам или методам (3. Условия применения); - требование к способности посылать или получать управляющие символы (3.1.2.2 Управляющие символы, 6.1.1750 KEY); - использование управляющих символов, для выполнения специфических функций (6.1.1320 EMIT, 6.1.2310 TYPE); - использование флагов как арифметических операндов (3.1.3.1 Флаги); - использование строчных букв для стандартных имен определений или зависимость от чувствительности к регистру системы (3.3.1.2 Имена определений); - использование графического символа со значением hex 24 (3.1.2.1 Графические символы). 4.2.2 _______________________________ Другая программная документация Программа должна также документировать: 38 - минимальные требования терминальных средств оператора; - существует ли Стандартная система после загрузки программы. 39 5. _________________________ Соглашение и наименование 5.1 _________________ ANS Forth системы 5.1.1 ____________________ Системное соглашение Система, которая соблюдает все системные требования разделов 3. Условия применения и 4.1 Системная документация и их подразделов - Стандартная система. Иначе Стандартная система, которая предоставляет только часть основных слов - подмножество Стандартной системы. Иначе Стандартная система (подмножество), которая не в состоянии соблюдать один или большее количество минимальных значений или диапазонов, указанных в 3. Условия применения и их подразделы - имеет ограничения окружающей среды. 5.1.2 ______________________ Системное наименование Стандартная система (подмножество) должна быть именована "ANS Forth система (подмножество)". Это наименование не должно применяться к Стандартным системам или Стандартным системам подмножествам, которые имеют ограничения окружающей среды. Фраза "с ограничениями окружающей среды" должна быть добавлена в конец наименования Стандартной системы (подмножества), которая имеет ограничения окружающей среды. Фраза "Предоставляет имена из расширений основного набора слов" должна быть добавлена к наименованию любой Стандартной системы, которая предоставляет части расширений основного набора слов. Фраза "Предоставляет расширения основного набора слов" должна быть добавлена к наименованию любой Стандартной системы, которая предоставляет все расширения основного набора слов. 5.2 ___________________ ANS Forth программы 5.2.1 ______________________ Программное соглашение Программа, которая соблюдает все программные требования разделов 3. Условия применения и 4.2 Программная документация и их подразделы - Стандартная программа. 5.2.2 ________________________ Программное наименование Стандартная программа должна быть именована "ANS Forth программа". Это наименование не должно применяться к Стандартным программам, которые требуют, чтобы система предоставляла стандартные слова вне Основного набора слов или она имеет зависимость от окружения. Фраза "с Зависимостями от окружения" должна быть добавлена наименования Стандартной программы, которая имеет зависимость от окружения. Фраза "Требуются имена из расширений основного набора слов" должна быть добавлена к наименованию Стандартной программы, которая требует, чтобы система предоставила часть расширений основного набора. Фраза "Требуются расширения основного набора слов" должна быть добавлена к наименованию Стандартной программы, которая требует, чтобы система предоставила все расширения основного набора. 40 6. _______ Словарь 6.1 ______________ Основные слова 6.1.0010 ! "store " CORE ( x a-addr -- ) Сохраняет x в a-addr . См.: 3.3.3.1 Выравнивание адреса. 6.1.0030 # "number-sign" CORE ( ud1 -- ud2 ) Делит ud1 числом в BASE, дает частное ud2 и остаток n. (n - младший разряд ud1.) Преобразовывает n к внешней форме и добавляет результирующий символ к началу выходной строки отображаемого числа. Неопределенная ситуация существует если # выполняется вне <# #> ограничивающих преобразование числа. См.: 6.1.0040 #>, 6.1.0050 #S, 6.1.0490 <#. 6.1.0040 #> "number-sign-greater" CORE ( xd -- c-addr u ) Удаляет xd. Делает выходную строку отображаемого числа доступной как символьную строку. C-addr и u определяют результирующую символьную строку. Программа может заменять символы в пределах строки. См.: 6.1.0030 #, 6.1.0050 #S, 6.1.0490 <#. 6.1.0050 #S "number-sign-s" CORE ( ud1 -- ud2 ) Преобразует одну цифру ud1 согласно правилу для #. Продолжает преобразование до нулевого частного. ud2 нулевое. Неопределенная ситуация существует, если #S выполняется вне <# #> ограничивающих преобразование числа. См.: 6.1.0030 #, 6.1.0040 #>, 6.1.0490 <#. 6.1.0070 ' "tick" CORE ( "name" -- xt ) Пропускает ведущие разделители пробелы. Выделяет name ограниченное пробелом. Ищет name, и возвращает xt, идентификатор исполнения для name. Неопределенная ситуация существует, если name не найдено. При интерпретации, ' xyz EXECUTE, эквивалентно xyz. См.: 3.4 Интерпретатор текста Forth, 3.4.1 Синтаксический анализ, A.6.1.2033 POSTPONE, A.6.1.2510 ['], D.6.7 Immediate-ности. 6.1.0080 ( "paren" CORE Компиляция: Исполняет семантику выполнения, данную ниже. 41 Выполнение: ( "ccc" -- ) Выделяет ccc, ограниченное ) (правая круглая скобка). ( - слово немедленного исполнения. Число символов в ccc может быть нулевое для числа символов в области анализа. См.: 3.4.1 Синтаксический анализ, 11.6.1.0080 (. 6.1.0090 * "star" CORE ( n1|u1 n2|u2 -- n3|u3 ) Умножает n1|u1 на n2|u2, возвращает n3|u3. 6.1.0100 */ "star-slash" CORE ( n1 n2 n3 -- n4 ) Умножает n1 на n2, с промежуточным результатом двойная-ячейка d. Делит d на n3, выдает частное одна-ячейка n4. Неопределенная ситуация существует, если n3 нулевое или если частное n4 находится вне диапазона числа со знаком. Если d и n3 отличаются по знаку, возвращенный результат, определенный реализацией будет такой же самый, как и возвращаемый фразой >R M* R> FM/MOD SWAP DROP или фразой >R M* R> SM/REM SWAP DROP. См.: 3.2.2.1 Целочисленное деление. 6.1.0110 */MOD "star-slash-mod" CORE ( n1 n2 n3 -- n4 n5 ) Умножает n1 на n2, с промежуточным результатом двойная-ячейка d. Делит d на n3, выдает остаток одна-ячейка n4 и частное одна-ячейка n5. Неопределенная ситуация существует, если n3 нулевое или если частное n5 находится вне диапазона числа одна-ячейка со знаком. Если d и n3 отличаются по знаку, возвращенный результат, определенный реализацией будет тот же самый, как и возвращаемый фразой >R M* R> FM/MOD или фразой >R M* R> SM/REM. См.: 3.2.2.1 Целочисленное деление. 6.1.0120 + "plus" CORE ( n1|u1 n2|u2 -- n3|u3 ) Прибавляет n2|u2 к n1|u1, возвращая сумму n3|u3. См.: 3.3.3.1 Выравнивание адреса. 6.1.0130 +! "plus-store" CORE ( n|u a-addr -- ) Прибавляет n|u к числу одна-ячейка в a-addr. См.: 3.3.3.1 Выравнивание адреса. 6.1.0140 +LOOP "plus-loop" CORE Интерпретация: Семантика интерпретации для этого слова не определена. 42 Компиляция: ( C: do-sys -- ) Добавляет семантику времени-выполнения, данную ниже к текущему определению. Разрешает назначения для всех неразрешенных ссылок LEAVE между местоположением, данным do-sys и следующим местоположением для перехода к выполнению слова после +LOOP. Время-выполнения: ( n -- ) ( R: loop-sys1 -- | loop-sys2 ) Неопределенная ситуация существует, если параметры управления циклом недоступны. Прибавляет n к индексу цикла. Если индекс цикла не пересекал границу между пределом цикла минус один и пределом цикла, продолжает выполнение с начала цикла. Иначе, удаляет текущие параметры управления цикла и продолжает выполнение сразу после цикла. См.: 6.1.1240 DO, 6.1.1680 I, 6.1.1760 LEAVE. 6.1.0150 , "comma" CORE ( x -- ) Резервирует одну ячейку области данных, и сохраняет x в ячейке. Если указатель области данных выровнен перед выполнением ",", то он останется выровненным после окончания выполнения ",". Неопределенная ситуация существует если указатель области данных не выровнен перед выполнением ",". См.: 3.3.3 Область данных, 3.3.3.1 Выравнивание адреса. 6.1.0160 - "minus" CORE ( n1|u1 n2|u2 -- n3|u3 ) Вычитает n2|u2 из n1|u1, и возвращает разницу n3|u3. См.: 3.3.3.1 Выравнивание адреса. 6.1.0180 . "dot" CORE ( n -- ) Отображает n в формате свободного поля. См.: 3.2.1.2 Преобразование цифр, 3.2.1.3 Изображение чисел в свободном поле. 6.1.0190 ." "dot-quote" CORE Интерпретация: Семантика интерпретации для этого слова не определена. Компиляция: ( "ccc" -- ) Выделяет ccc, ограниченную " (двойная кавычка). Добавляет семантику времени-выполнения данную ниже к текущему определению. Время-выполнения: ( -- ) Отображает ccc. См.: 3.4.1 Синтаксический анализ, 6.2.0200 .(. 6.1.0230 / "slash" CORE 43 ( n1 n2 -- n3 ) Делит n1 на n2, возвращает частное одна-ячейка n3. Неопределенная ситуация существует, если n2 нулевое. Если n1 и n2 отличаются по знаку, возвращенный результат, определенный реализацией будет тот же самый, как и возвращаемый фразой >R S>D R> FM/MOD SWAP DROP или фразой >R S>D R> SM/REM SWAP DROP. См.: 3.2.2.1 Целочисленное деление. 6.1.0240 /MOD "slash-mod" CORE ( n1 n2 -- n3 n4 ) Делит n1 на n2, возвращает остаток одна-ячейка n3 и частное одна- ячейка n4. Неопределенная ситуация существует, если n2 нулевое. Если n1 и n2 отличаются по знаку, возвращенный результат, определенный реализацией будет тот же самый, как и возвращаемый фразой >R S>D R> FM/MOD или фразой >R S>D R> SM/REM. См.: 3.2.2.1 Целочисленное деление. 6.1.0250 0< "zero-less" CORE ( n -- flag ) flag - true, если и только если n - меньше нуля. 6.1.0270 0= "zero-equals" CORE ( x -- flag ) flag - true, если и только если x - равно нулю. 6.1.0290 1+ "one-plus" CORE ( n1|u1 -- n2|u2 ) Прибавляет один(1) к n1|u1 возвращает сумму n2|u2. 6.1.0300 1- "one-minus" CORE ( n1|u1 -- n2|u2 ) Вычитает один (1) из n1|u1, возвращает разницу n2|u2. 6.1.0310 2! "two-store" CORE ( x1 x2 a-addr -- ) Сохраняет пару-ячеек x1 x2 в a-addr, x2 в a-addr и x1 в следующей последовательной ячейке. Это эквивалентно последовательности SWAP OVER ! CELL+ !. См.: 3.3.3.1 Выравнивание адреса. 6.1.0320 2* "two-star" CORE ( x1 -- x2 ) x2 - результат смещения x1 на один бит к старшему двоичному разряду, заполнение освобожденного младшего бита нулем. 6.1.0330 2/ "two-slash" CORE ( x1 -- x2 ) x2 - результат смещения x1 на один бит к младшему двоичному разряду, оставляет старший бит неизменным. 44 6.1.0350 2@ "two-fetch" CORE ( a-addr -- x1 x2 ) Извлекает пару-ячеек x1 x2 сохраненную в a-addr. x2 сохранено в a- addr и x1 в следующей последовательной ячейке. Это эквивалентно последовательности DUP CELL+ @ SWAP @. См.: 3.3.3.1 Выравнивание адреса, 6.1.0310 2!. 6.1.0370 2DROP "two-drop" CORE ( x1 x2 -- ) Удаляет пару-ячеек x1 x2 из стека. 6.1.0380 2DUP "two-dupe" CORE ( x1 x2 -- x1 x2 x1 x2 ) Дублирует пару-ячеек x1 x2. 6.1.0400 2OVER "two-over" CORE ( x1 x2 x3 x4 -- x1 x2 x3 x4 x1 x2 ) Копирует пару-ячеек x1 x2 на вершину стека. 6.1.0430 2SWAP "two-swap" CORE ( x1 x2 x3 x4 -- x3 x4 x1 x2 ) Меняет местами две верхних пары-ячеек. 6.1.0450 : "colon" CORE ( C: "name" -- colon-sys ) Пропускает ведущие разделители пробелы. Выделяет name, ограниченное пробелом. Создает определение для name, называемое "определение через двоеточие". Вводит состояние компиляции и начинает текущее определение, создавая colon-sys. Добавляет семантику инициирования, данную ниже к текущему определению. Семантика выполнения name будет определяться скомпилированными в тело определения словами. Текущее определение не должно быть находимым в словаре, пока оно не закончено (или до выполнения DOES> в некоторых системах). Инициирование: ( i*x -- i*x ) ( R: -- nest-sys ) Сохраняет зависящую-от-реализации информацию nest-sys о вызове определения. Состояние стека i*x, представляет параметры для name. name Выполнение: ( i*x -- j*x ) Выполняет name определения. Состояние стека i*x, и j*x представляет параметры и результаты из name, соответственно. См.: 3.4 Интерпретатор текста Forth, 3.4.1 Синтаксический анализ, 3.4.5 Компиляция, 6.1.1250 DOES>, 6.1.2500 [, 6.1.2540 ], 15.6.2.0470 ;CODE. 6.1.0460 ; "semicolon" CORE Интерпретация: Семантика интерпретации для этого слова не определена. 45 Компиляция: ( C: colon-sys -- ) Добавляет семантику времени-выполнения ниже к текущему определению. Заканчивает текущее определение, позволяя ему быть найденным в словаре, и вводит состояние интерпретации, потребляя colon-sys. Если указатель области данных не выровненный, резервирует достаточно области данных для его выравнивания. Время-выполнения: ( -- ) ( R: nest-sys -- ) Возвращение к вызывающему определению, определенному nest-sys. См.: 3.4 Интерпретатор текста Forth, 3.4.5 Компиляция. 6.1.0480 < "less-than" CORE ( n1 n2 -- flag ) flag - true, если и только если n1 - меньше чем n2. См.: 6.1.2340 U<. 6.1.0490 <# "less-number-sign" CORE ( -- ) Инициализирует процесс выходного преобразования отображаемого числа. См.: 6.1.0030 #, 6.1.0040 #>, 6.1.0050 #S. 6.1.0530 = "equals" CORE ( x1 x2 -- flag ) flag - true, если и только если x1 - побитно равно x2. 6.1.0540 > "greater-than" CORE ( n1 n2 -- flag ) flag - true, если и только если n1 - больше чем n2. См.: 6.2.2350 U>. 6.1.0550 >BODY "to-body" CORE ( xt -- a-addr ) a-addr - адрес области данных соответствующей xt. Неопределенная ситуация существует, если xt не для слова определенного через CREATE. См.: 3.3.3 Область данных. 6.1.0560 >IN "to-in" CORE ( -- a-addr ) a-addr - адрес ячейки, содержащей смещение в символах от начала входного буфера до начала области анализа. 6.1.0570 >NUMBER "to-number" CORE ( ud1 c-addr1 u1 -- ud2 c-addr2 u2 ) ud2 - без знаковый результат преобразования символов из строки указанной c-addr1 u1 в цифры, используя число в BASE, и добавления каждого в ud1 после умножения ud1 на число из BASE. 46 Преобразование продолжается слева направо до встречи не преобразуемого символа, включая "+" или "-", или пока строка полностью не будет преобразована. c-addr2 - местоположение первого не преобразованного символа или первого символа после конца строки, если строка была полностью преобразована. u2 - число не преобразованных символов в строке. Неопределенная ситуация существует если ud2 переполняется в процессе преобразования. См.: 3.2.1.2 Преобразование цифр. 6.1.0580 >R "to-r" CORE Интерпретация: Семантика интерпретации для этого слова не определена. Выполнение: ( x -- ) ( R: -- x ) Перемещает x на стек возвратов. См.: 3.2.3.3 Стек возвратов, 6.1.2060 R>, 6.1.2070 R@, 6.2.0340 2>R, 6.2.0410 2R>, 6.2.0415 2R@. 6.1.0630 ?DUP "question-dupe" CORE ( x -- 0 | x x ) Дублирует x, если оно ненулевое. 6.1.0650 @ "fetch" CORE ( a-addr -- x ) x - значение, сохраненное в a-addr. См.: 3.3.3.1 Выравнивание адреса. 6.1.0670 ABORT CORE ( i*x -- ) ( R: j*x -- ) Освобождает стек данных и выполняет функцию QUIT, которая включает освобождение стека возвратов, без отображения сообщения. См.: 9.6.2.0670 ABORT. 6.1.0680 ABORT" "abort-quote" CORE Интерпретация: Семантика интерпретации для этого слова не определена. Компиляция: ( "ccc" -- ) Выделяет ccc, ограниченную " (двойная кавычка). Добавляет семантику времени-выполнения данную ниже к текущему определению. Время-выполнения: ( i*x x1 -- | i*x ) ( R: j*x -- | j*x ) Удаляет x1 из стека. Если какой либо бит x1 - не нулевой, отображает ccc и выполняет определенную реализацией последовательность сброса, которая включает функцию ABORT. См.: 3.4.1 Синтаксический анализ, 9.6.2.0680 ABORT". 6.1.0690 ABS "abs" CORE ( n -- u ) u - абсолютное значение n. 47 6.1.0695 ACCEPT CORE ( c-addr +n1 -- +n2 ) Получает строку с максимумом +n1 символов. Неопределенная ситуация существует, если +n1 нулевое или больше чем 32767. Отображает полученные графические символы. Программа, которая зависит от присутствия или отсутствия неграфических символов в строке имеет зависимость от окружающей среды. Функции редактирования, если таковые вообще имеются, которые система исполняет при создании строки - определенное реализацией. Ввод заканчивается, когда получен определенный реализацией признак конца строки. Когда ввод заканчивается, ничего не добавляется в конец строки, и отображение обеспечивается определенным реализацией способом. +n2 - длина строки, сохраненной в c-addr. 6.1.0705 ALIGN CORE ( -- ) Если указатель области данных не выровнен, резервирует достаточно пространства, для его выравнивания. См.: 3.3.3 Область данных, 3.3.3.1 Выравнивание адреса. 6.1.0706 ALIGNED CORE ( addr -- a-addr ) a-addr - первый выровненный адрес большее чем или равный addr. См.: 3.3.3.1 Выравнивание адреса. 6.1.0710 ALLOT CORE ( n -- ) Если n больше нуля, резервирует n адресуемых элементов области данных. Если n меньше нуля, освобождает | n | адресуемых элементов области данных. Если n нуль, оставляет указатель области данных неизменным. Если указатель области данных выровнен, и n - кратно размеру ячейки перед выполнением ALLOT, он останется выровненным, и после завершения выполнения ALLOT. Если указатель области данных выровнен на символ, и n - кратно размеру символа перед выполнением ALLOT, он останется выровненным на символ, и после завершения выполнения ALLOT. См.: 3.3.3 Область данных. 6.1.0720 AND CORE ( x1 x2 -- x3 ) x3 поразрядное логическое "и" x1 и x2. 48 6.1.0750 BASE CORE ( -- a-addr ) a-addr - адрес ячейки, содержащей текущее основание системы счисления для преобразования чисел {{2...36}}. 6.1.0760 BEGIN CORE Интерпретация: Семантика интерпретации для этого слова не определена. Компиляция: ( C: -- dest ) Помещает адрес следующей ячейки для передачи управления, dest, на стек потока-управления. Добавляет семантику времени-выполнения, данную ниже к текущему определению. Время-выполнения: ( -- ) Продолжает выполнение. См.: 3.2.3.2 Стек потока-управления, 6.1.2140 REPEAT, 6.1.2390 UNTIL, 6.1.2430 WHILE. 6.1.0770 BL "b-l" CORE ( -- char ) char - символьное значение для пробела. 6.1.0850 C! "c-store" CORE ( char c-addr -- ) Сохраняет char в c-addr. Когда размер символа меньше чем размер ячейки, переданы только младшие биты, соответствующие размеру символа. См.: 3.3.3.1 Выравнивание адреса. 6.1.0860 C, "c-comma" CORE ( char -- ) Резервирует пространство для одного символа в области данных и запоминает char в нем. Если указатель области данных - выровнен на символ перед выполнением C,, он останется выровненным на символ и после окончания выполнения C,. Неопределенная ситуация существует, если указатель области данных - не выровненный на символ до выполнения C,. См.: 3.3.3 Область данных, 3.3.3.1 Выравнивание адреса. 6.1.0870 C@ "c-fetch" CORE ( c-addr -- char ) Выбирает символ, сохраненный в c-addr. Когда размер ячейки больше чем размер символа, все неиспользованные старшие биты - нули. См.: 3.3.3.1 Выравнивание адреса. 6.1.0880 CELL+ "cell-plus" CORE ( a-addr1 -- a-addr2 ) 49 Добавляет размер в адресуемых элементах ячеек к a-addr1, возвращает a-addr2. См.: 3.3.3.1 Выравнивание адреса. 6.1.0890 CELLS CORE ( n1 -- n2 ) n2 - размер в адресуемых элементах n1 ячеек. 6.1.0895 CHAR "char" CORE ( "name" -- char ) Пропускает ведущие разделители пробелы. Выделяет name, ограниченное пробелом. Помещает значение его первого символа на стек. См.: 3.4.1 Синтаксический анализ, 6.1.2520 [CHAR]. 6.1.0897 CHAR+ "char-plus" CORE ( c-addr1 -- c-addr2 ) Добавляет размер в адресуемых элементах символа к c-addr1, возвращает c-addr2. См.: 3.3.3.1 Выравнивание адреса. 6.1.0898 CHARS "chars" CORE ( n1 -- n2 ) n2 - размер в адресуемых элементах n1 символов. 6.1.0950 CONSTANT CORE ( x "name" -- ) Пропускает ведущие разделители пробелы. Выделяет name, ограниченное пробелом. Создает определение для name с семантикой выполнения, определенной ниже. name объявляется как "constant". name Выполнение: ( -- x ) Размещает x на стеке. См.: 3.4.1 Синтаксический анализ. 6.1.0980 COUNT CORE ( c-addr1 -- c-addr2 u ) Возвращает спецификацию символьной строки для строки со счетчиком сохраненной в c-addr1. c-addr2 - адрес первого символа после c- addr1. u - содержимое символа в c-addr1, который является длиной в символах строки в c-addr2. 6.1.0990 CR "c-r" CORE ( -- ) Заставляет последующий вывод появляться в начале следующей строки. 6.1.1000 CREATE CORE ( "name" -- ) 50 Пропускает ведущие разделители пробелы. Выделяет name, ограниченное пробелом. Создает определение для name с семантикой выполнения, определенной ниже. Если указатель области данных не выровнен, резервирует достаточно области данных для его выравнивания. Новый указатель области данных определяет поле данных name. CREATE не распределяет область данных в поле данных name. name Выполнение: ( -- a-addr ) a-addr - адрес поля данных name. Семантика выполнения name может быть расширена использованием DOES>. См.: 3.3.3 Область данных, 6.1.1250 DOES>. 6.1.1170 DECIMAL CORE ( -- ) Устанавливает основание системы счисления преобразования чисел на десять (десятичные числа). 6.1.1200 DEPTH CORE ( -- +n ) +n - число значений данных одна-ячейка, содержащихся на стеке данных перед тем, как +n было помещено на стек. 6.1.1240 DO CORE Интерпретация: Семантика интерпретации для этого слова не определена. Компиляция: ( C: -- do-sys ) Помещает do-sys на стек потока управления. Добавляет семантику времени-выполнения данную ниже к текущему определению. Семантика не завершена, пока do-sys не разрешена потребителем типа LOOP. Время-выполнения: ( n1|u1 n2|u2 -- ) ( R: -- loop-sys ) Устанавливает параметры управления цикла с индексом n2|u2, и границей n1|u1. Неопределенная ситуация существует, если оба n1|u1 и n2|u2- не одного типа. Что-либо уже имеющееся на стеке возвратов становится недоступным до удаления параметров управления циклом. См.: 3.2.3.2 Стек потока управления, 6.1.0140 +LOOP, 6.1.1800 LOOP. 6.1.1250 DOES> "does" CORE Интерпретация: Семантика интерпретации для этого слова не определена. Компиляция: ( C: colon-sys1 -- colon-sys2 ) Добавляет семантику времени-выполнения ниже к текущему определению. В любом случае текущее определение представленное находимым в словаре при компиляции DOES> - определенное реализацией. Потребляет colon-sys1 и производит colon-sys2. Добавляет семантику инициирования, данную ниже к текущему определению. Время-выполнения: ( -- ) ( R: nest-sys1 -- ) Заменяет семантику выполнения самого последнего определения, упоминаемого как name, семантикой выполнения имени данной ниже. Возвращает управление на вызывающее определение, определенное nest- sys1. Неопределенная ситуация существует если name не было определено CREATE, или определенным пользователем словом которое вызывает CREATE. 51 Инициирование: ( i*x -- i*x a-addr ) ( R: -- nest-sys2 ) Сохраняет зависящую-от-реализации информацию nest-sys2 о вызывающем определении. Размещает адрес поля данных name на стеке. Состояние стека i*x представляет параметры name. name Выполнение: ( i*x -- j*x ) Выполняет часть определения, которая начинается с семантики инициирования добавленной изменившим name DOES>. Состояния стека i*x и j*x представляют параметры, и результаты name, соответственно. См.: 6.1.1000 CREATE. 6.1.1260 DROP CORE ( x -- ) Удаляет x из стека. 6.1.1290 DUP "dupe" CORE ( x -- x x ) Дублирует x. 6.1.1310 ELSE CORE Интерпретация: Семантика интерпретации для этого слова не определена. Компиляция: ( C: orig1 -- orig2 ) Помещает адрес ячейки новой неразрешенной ссылки вперед orig2 на стек потока управления. Добавляет семантику времени-выполнения данную ниже к текущему определению. Семантика будет не завершена, пока orig2 не разрешена (например, THEN). Разрешает ссылку вперед orig1 использованием адреса ячейки после добавленной семантики времени-выполнения. Время-выполнения: ( -- ) Продолжает выполнение с адреса ячейки данного ссылкой orig2. См.: 6.1.1700 IF, 6.1.2270 THEN. 6.1.1320 EMIT CORE ( x -- ) Если x - графический символ в наборе символов определенном реализацией - показать x. Эффект EMIT для всех других значений x - определенное реализацией. Когда просматривается символ, чьи символом-определенные биты имеют значение между hex 20 и 7E включительно, отображается соответствующий стандартный символ, определенный 3.1.2.1 Графические символы. Поскольку различные устройства вывода могут реагировать по-разному на управляющие символы, программы, использующие управляющие символы для выполнения специфических функций, имеют зависимость от окружения. Каждый EMIT, имеет дело только с одним символом. См.: 6.1.2310 TYPE. 52 6.1.1345 ENVIRONMENT? "environment-query" CORE ( c-addr u -- false | i*x true ) c-addr - адрес символьной строки, и u - ее размер. u может иметь значение в диапазоне от нуля до максимума определенного реализацией, но не должен быть меньше чем 31. Символьная строка должна содержать ключевое слово из 3.2.6 Запросы к окружению или дополнительных наборов слов, которое будут проверено на соответствие атрибутам существующей среды. Если система рассматривает атрибут как неизвестный, возвращается флаг - false; иначе, флаг - true, и возвращенное i*x имеет тип, указанный в таблице для запрашиваемого атрибута. 6.1.1360 EVALUATE CORE ( i*x c-addr u -- j*x ) Сохраняет текущую спецификацию входного источника. Записывает минус - один (-1) в SOURCE-ID, если он присутствует. Делает строку, описанную c-addr и u входным источником и входным буфером, устанавливает >IN в нуль, и интерпретирует. Когда область анализа пуста, восстанавливает предыдущую спецификацию входного источника. Изменения состояния стека определяются интерпретируемыми словами. 6.1.1370 EXECUTE CORE ( i*x xt -- j*x ) Удаляет xt из стека, и выполняет идентифицированную им семантику. Изменения состояния стека определяются выполненным словом. См.: 6.1.0070 ', 6.1.2510 [']. 6.1.1380 EXIT CORE Интерпретация: Семантика интерпретации для этого слова не определена. Выполнение: ( -- ) ( R: nest-sys -- ) Возвращает управление на вызывающее определение, определенное nest- sys. Перед выполнением EXIT в пределах do-loop, программа должна удалить параметры управления циклом, выполняя UNLOOP. См.: 3.2.3.3 Стек возвратов, 6.1.2380 UNLOOP. 6.1.1540 FILL CORE ( c-addr u char -- ) Если u больше чем нуль, сохраняет char в каждом из u последовательных символов в памяти, начинающейся с c-addr. 6.1.1550 FIND CORE ( c-addr -- c-addr 0 | xt 1 | xt -1 ) Находит определение, по имени строки со счетчиком в c-addr. Если определение не найдено, возвращает c-addr и нуль. Если определение найдено, возвращает его идентификатор исполнения xt. Если определение немедленного исполнения, возвращает также один (1), иначе минус - один (-1). Для данной строки значения возвращенные FIND, во время компиляции могут отличаться от возвращенных при не компиляции. 53 См.: 3.4.2 Поиск имен определений, A.6.1.0070 ', A.6.1.2510 ['], A.6.1.2033 POSTPONE, D.6.7 Immediate-ности. 6.1.1561 FM/MOD "f-m-slash-mod" CORE ( d1 n1 -- n2 n3 ) Делит d1 на n1, возвращает минимальное частное n3 и остаток n2. Входные и выходные аргументы стека знаковые. Неопределенная ситуация существует, если n1 нулевое или если частное находится вне диапазона целого числа одна-ячейка со знаком. См.: 3.2.2.1 Целочисленное деление, 6.1.2214 SM/REM, 6.1.2370 UM/MOD. 6.1.1650 HERE CORE ( -- addr ) addr - указатель области данных. См.: 3.3.3.2 Непрерывные области. 6.1.1670 HOLD CORE ( char -- ) Добавляет char к началу выходной строки отображаемого числа. Неопределенная ситуация существует если HOLD выполняется вне <# #> ограничивающих преобразование числа. 6.1.1680 I CORE Интерпретация: Семантика интерпретации для этого слова не определена. Выполнение: ( -- n|u ) ( R: loop-sys -- loop-sys ) n|u - копия текущего (самого внутреннего) индекса цикла. Неопределенная ситуация существует, если параметры управления циклом недоступны. 6.1.1700 IF CORE Интерпретация: Семантика интерпретации для этого слова не определена. Компиляция: ( C: -- orig ) Помещает адрес ячейки новой неразрешенной ссылки вперед orig на стек потока управления. Добавляет семантику времени-выполнения, данную ниже к текущему определению. Семантика не завершена, пока orig не разрешена, например THEN или ELSE. Время-выполнения: ( x -- ) Если все биты x нулевые, продолжает выполнение с адреса ячейки определенного ссылкой orig. См.: 3.2.3.2 Стек потока-управления, 6.1.1310 ELSE, 6.1.2270 THEN. 6.1.1710 IMMEDIATE CORE ( -- ) Делает самое последнее определение словом немедленного исполнения. Неопределенная ситуация существует, если самое последнее определение не имеет имени. 54 См.: D.6.7 Immediate-ности. 6.1.1720 INVERT CORE ( x1 -- x2 ) Инвертирует все биты x1, возвращает его логическую инверсию x2. См.: 6.1.1910 NEGATE, 6.1.0270 0=. 6.1.1730 J CORE Интерпретация: Семантика интерпретации для этого слова не определена. Выполнение:( -- n|u )( R: loop-sys1 loop-sys2 -- loop-sys1 loop-sys2 ) n|u - копия следующего-внешнего индекса цикла. Неопределенная ситуация существует, если параметры управления цикла следующего- внешнего цикла, loop-sys1, недоступны. 6.1.1750 KEY CORE ( -- char ) Получает один символ char, член определенного реализацией набора символов. События клавиатуры, которые не соответствуют таким символам игнорируются, пока не получен допустимый символ, и впоследствии будут недоступны. Могут быть получены все стандартные символы. Символы, полученные KEY, не отображаются. Любой стандартный символ, возвращенный KEY имеет числовое значение определенное в 3.1.2.1 Графические символы. Программы, которые требуют способности к получению управляющих символов, имеют зависимость от окружения. См.: 10.6.2.1307 EKEY, 10.6.1.1755 KEY?. 6.1.1760 LEAVE CORE Интерпретация: Семантика интерпретации для этого слова не определена. Выполнение: ( -- ) ( R: loop-sys -- ) Снимает текущие параметры управления циклом. Неопределенная ситуация существует, если они недоступны. Продолжает выполнение непосредственно вне самого внутреннего синтаксически окруженного DO ... LOOP или DO ... +LOOP. См.: 3.2.3.3 Стек возвратов, 6.1.0140 +LOOP, 6.1.1800 LOOP. 6.1.1780 LITERAL CORE Интерпретация: Семантика интерпретации для этого слова не определена. Компиляция: ( x -- ) Добавляет семантику времени-выполнения, данную ниже к текущему определению. 55 Время-выполнения: ( -- x ) Помещает x на стек. 6.1.1800 LOOP CORE Интерпретация: Семантика интерпретации для этого слова не определена. Компиляция: ( C: do-sys -- ) Добавляет семантику времени-выполнения, данную ниже к текущему определению. Разрешает назначения для всех неразрешенных ссылок LEAVE между адресом ячейки определенным do-sys и следующим за LOOP адресом ячейки для передачи управления к выполнению слова после LOOP. Время-выполнения: ( -- ) ( R: loop-sys1 -- | loop-sys2 ) Неопределенная ситуация существует, если параметры управления цикла недоступны. Добавляет один к индексу цикла. Если после этого индекс цикла равен пределу цикла, снимает параметры цикла, и продолжает выполнение непосредственно после цикла. Иначе продолжает выполнение с начала цикла. См.: 6.1.1240 DO, 6.1.1680 I, 6.1.1760 LEAVE. 6.1.1805 LSHIFT "l-shift" CORE ( x1 u -- x2 ) Выполняет логический левый сдвиг x1 на u двоичных разрядов и возвращает x2. Помещает нули в самые младшие биты, освобожденные сдвигом. Неопределенная ситуация существует, если u больше или равно числу битов в ячейке. 6.1.1810 M* "m-star" CORE ( n1 n2 -- d ) d - знаковое произведение n1 на n2. 6.1.1870 MAX CORE ( n1 n2 -- n3 ) n3 большее из n1 и n2. 6.1.1880 MIN CORE ( n1 n2 -- n3 ) n3 меньшее из n1 и n2. 6.1.1890 MOD CORE ( n1 n2 -- n3 ) Делит n1 на n2, возвращает остаток n3 одна-ячейка. Неопределенная ситуация существует, если n2 нулевое. Если n1 и n2 отличаются по знаку, возвращенный результат определенный реализацией будет такой же самый как и возвращенный фразой >R S>D R> FM/MOD DROP или фразой >R S>D R> SM/REM DROP. См.: 3.2.2.1 Целочисленное деление. 56 6.1.1900 MOVE CORE ( addr1 addr2 u -- ) Если u больше чем нуль, копирует содержимое u последовательных адресуемых элементов из addr1 в u последовательных адресуемых элементов в addr2. После завершения MOVE, u последовательных адресуемых элементов в addr2 содержат тоже, что u последовательных адресуемых элементов в addr1 содержали перед перемещением. См.: 17.6.1.0910 CMOVE, 17.6.1.0920 CMOVE>. 6.1.1910 NEGATE CORE ( n1 -- n2 ) Отрицание n1, возвращает его арифметическую инверсию n2. См.: 6.1.1720 INVERT, 6.1.0270 0=. 6.1.1980 OR CORE ( x1 x2 -- x3 ) x3 - поразрядное включающее или x1 и x2. 6.1.1990 OVER CORE ( x1 x2 -- x1 x2 x1 ) Помещает копию x1 на вершине стека. 6.1.2033 POSTPONE CORE Интерпретация: Семантика интерпретации для этого слова не определена. Компиляция: ( "name" -- ) Пропускает ведущие разделители пробелы. Выделяет name, ограниченное пробелом. Находит name. Добавляет семантику компиляции name в текущее определение. Неопределенная ситуация существует, если name не найдено. См.: 3.4.1 Синтаксический анализ. 6.1.2050 QUIT CORE ( -- ) ( R: i*x -- ) Освобождает стек возвратов, сохраняет нуль в SOURCE-ID, если он присутствует, делает пользовательское устройство ввода входным источником, и вводит состояние интерпретации. Не отображает сообщение. Повторяет следующее: - Принимает строку из входного источника во входной буфер, обнуляет >IN, и интерпретирует. - Отображает определенную реализацией системную подсказку, если в состоянии интерпретации вся обработка была закончена, и нет неопределенной ситуации. См.: 3.4 Интерпретатор текста Forth. 6.1.2060 R> "r-from" CORE Интерпретация: Семантика интерпретации для этого слова не определена. 57 Выполнение: ( -- x ) ( R: x -- ) Перемещает x из стека возвратов на стек данных. См.: 3.2.3.3 Стек возвратов, 6.1.0580 >R, 6.1.2070 R@, 6.2.0340 2>R, 6.2.0410 2R>, 6.2.0415 2R@. 6.1.2070 R@ "r-fetch" CORE Интерпретация: Семантика интерпретации для этого слова не определена. Выполнение: ( -- x ) ( R: x -- x ) Копирует x из стека возвратов на стек данных. См.: 3.2.3.3 Стек возвратов, 6.1.0580 >R, 6.1.2060 R>, 6.2.0340 2>R, 6.2.0410 2R>, 6.2.0415 2R@. 6.1.2120 RECURSE CORE Интерпретация: Семантика интерпретации для этого слова не определена. Компиляция: ( -- ) Добавляет семантику выполнения текущего определения в текущее определение. Неопределенная ситуация существует, если RECURSE появляется в определении после DOES>. См.: 6.1.1250 DOES>, 6.1.2120 RECURSE. 6.1.2140 REPEAT CORE Интерпретация: Семантика интерпретации для этого слова не определена. Компиляция: ( C: orig dest -- ) Добавляет семантику времени-выполнения, данную ниже к текущему определению, разрешает ссылку назад dest. Разрешает ссылку вперед orig используя адрес ячейки после добавленной семантики времени- выполнения. Время-выполнения: ( -- ) Продолжает выполнение с адреса ячейки, данного dest. См.: 6.1.0760 BEGIN, 6.1.2430 WHILE. 6.1.2160 ROT "rote" CORE ( x1 x2 x3 -- x2 x3 x1 ) Вращает три верхних элемента стека. 6.1.2162 RSHIFT "r-shift" CORE ( x1 u -- x2 ) Выполняет правый логический сдвиг x1 на u двоичных разрядов, возвращает x2. Помещает нули в самые старшие биты, освобожденные сдвигом. Неопределенная ситуация существует, если u больше или равно числу бит в ячейке. 6.1.2165 S" "s-quote" CORE Интерпретация: Семантика интерпретации для этого слова не определена. 58 Компиляция: ( "ccc" -- ) Выделяет ccc, ограниченную " (двойная кавычка). Добавляет семантику времени-выполнения данную ниже к текущему определению. Время-выполнения: ( -- c-addr u ) Возвращает c-addr и u описывающие строку, состоящую из символов ccc. Программа не должна изменять возвращенную строку. См.: 3.4.1 Синтаксический анализ, 6.2.0855 C", 11.6.1.2165 S". 6.1.2170 S>D "s-to-d" CORE ( n -- d ) Преобразовывает число n в число d две-ячейки с тем же самым числовым значением. 6.1.2210 SIGN CORE ( n -- ) Если n - отрицательное, добавляет знак "минус" в начало выходной строки отображаемого числа. Неопределенная ситуация существует, если SIGN выполняется вне <# #> ограничивающих преобразование числа. 6.1.2214 SM/REM "s-m-slash-rem" CORE ( d1 n1 -- n2 n3 ) Делит d1 на n1, возвращает симметричное частное n3 и остаток n2. Входные и выходные параметры стека знаковые. Неопределенная ситуация существует, если n1 нулевое или если частное находится вне диапазона целого числа со знаком одна-ячейка. См.: 3.2.2.1 Целочисленное деление, 6.1.1561 FM/MOD, 6.1.2370 UM/MOD. 6.1.2216 SOURCE CORE ( -- c-addr u ) c-addr - адрес, и u - число символов во входном буфере. 6.1.2220 SPACE CORE ( -- ) Отображает один пробел. 6.1.2230 SPACES CORE ( n -- ) Если n больше нуля, отображает n пробелов. 6.1.2250 STATE CORE ( -- a-addr ) a-addr - адрес ячейки, содержащей флаг состояния компиляции. STATE - true когда в состояния компиляции, иначе false. Значение true в STATE ненулевое, но - иначе определенное реализацией. Только следующие стандартные слова изменяют значение в STATE: : (двоеточие), ; (Точка с запятой), ABORT, QUIT, :NONAME, [ (левая скобка), и ] (правая скобка). 59 Обратите внимание: Программа непосредственно не должна изменять содержание STATE. См.: 3.4 Интерпретатор текста Forth, 6.1.0450 :, 6.1.0460 ;, 6.1.0670 ABORT, 6.1.2050 QUIT, 6.1.2500 [, 6.1.2540 ], 6.2.0455 :NONAME, 15.6.2.2250 STATE. 6.1.2260 SWAP CORE ( x1 x2 -- x2 x1 ) Переставляет два верхних элемента стека. 6.1.2270 THEN CORE Интерпретация: Семантика интерпретации для этого слова не определена. Компиляция: ( C: orig -- ) Добавляет семантику времени-выполнения, данную ниже к текущему определению. Разрешает ссылку вперед orig, используя адрес ячейки добавленной семантики времени-выполнения. Время-выполнения: ( -- ) Продолжает выполнение. См.: 6.1.1310 ELSE, 6.1.1700 IF. 6.1.2310 TYPE CORE ( c-addr u -- ) Если u больше нуля, отображает символьную строку, определенную c- addr и u. Когда просматривается символ, чьи символом-определенные биты имеют значение между hex 20 и 7E включительно, отображается соответствующий стандартный символ, определенный в 3.1.2.1 Графические символы. Поскольку различные устройства вывода могут реагировать по-разному на управляющие символы, программы, использующие управляющие символы для выполнения специфических функций, имеют зависимость от окружения. См.: 6.1.1320 EMIT. 6.1.2320 U. "u-dot" CORE ( u -- ) Отображает u в формате свободного поля. 6.1.2340 U< "u-less-than" CORE ( u1 u2 -- flag ) flag - true, если и только если u1 - меньше чем u2. См.: 6.1.0480 <. 6.1.2360 UM* "u-m-star" CORE ( u1 u2 -- ud ) Умножает u1 на u2, возвращает результат ud без знака две-ячейки. Все значения и арифметика без знаковые. 60 6.1.2370 UM/MOD "u-m-slash-mod" CORE ( ud u1 -- u2 u3 ) Делит ud на u1, возвращает частное u3 и остаток u2. Все значения и арифметика без знака. Неопределенная ситуация существует если u1 нулевое или если частное находится вне диапазона целого числа одна- ячейка без знака. См.: 3.2.2.1 Целочисленное деление, 6.1.1561 FM/MOD, 6.1.2214 SM/REM. 6.1.2380 UNLOOP CORE Интерпретация: Семантика интерпретации для этого слова не определена. Выполнение: ( -- ) ( R: loop-sys -- ) Снимает параметры управления циклом для текущего уровня вложенности. UNLOOP требуется для каждого уровня вложенности прежде, чем может быть выполнено EXIT определения. Неопределенная ситуация существует если параметры управления циклом недоступны. См.: 3.2.3.3 Стек возвратов. 6.1.2390 UNTIL CORE Интерпретация: Семантика интерпретации для этого слова не определена. Компиляция: ( C: dest -- ) Добавляет семантику времени-выполнения, данную ниже к текущему определению, разрешая ссылку назад dest. Время-выполнения: ( x -- ) Если все биты x нулевые, продолжает выполнение с адреса ячейки определенного dest. См.: 6.1.0760 BEGIN. 6.1.2410 VARIABLE CORE ( "name" -- ) Пропускает ведущие разделители пробелы. Выделяет name, ограниченное пробелом. Создает определение для name с семантикой выполнения, определенной ниже. Резервирует одну ячейку области данных в выровненном адресе. name объявляется как "variable". name Выполнение: ( -- a-addr ) a-addr - адрес зарезервированной ячейки. Программа ответственна за инициализацию и содержание зарезервированной ячейки. См.: 3.4.1 Синтаксический анализ. 61 6.1.2430 WHILE CORE Интерпретация: Семантика интерпретации для этого слова не определена. Компиляция: ( C: dest -- orig dest ) Помещает адрес ячейки новой неразрешенной ссылки вперед orig на стек потока управления, под существующим dest. Добавляет семантику времени-выполнения, данную ниже к текущему определению. Семантика не завершена до разрешения orig и dest (например, REPEAT). Время-выполнения: ( x -- ) Если все биты x нулевые, продолжает выполнение с адреса ячейки определенного ссылкой orig. 6.1.2450 WORD CORE ( char "ccc" -- c-addr ) Пропускает ведущие разделители. Выделяет символы ccc ограниченные char. Неопределенная ситуация существует, если длина выделенной строки больше чем длина определенной реализацией строки со счетчиком. c-addr - адрес временной области, содержащей выделенное слово как строку со счетчиком. Если область анализа была пуста или не содержала других символов кроме разделителей, результирующая строка имеет нулевую длину. За строкой следует не включенный в длину пробел. Программа может изменять символы в пределах строки. Примечание: Требование, о следовании пробела за строкой устаревшее и включено как уступка существующим программам, которые используют CONVERT. Программа не должна зависеть от существования пробела. См.: 3.3.3.6 Другие временные области, 3.4.1 Синтаксический анализ. 6.1.2490 XOR "x-or" CORE ( x1 x2 -- x3 ) x3 поразрядное исключающее-или x1 и x2. 6.1.2500 [ "left-bracket" CORE Интерпретация: Семантика интерпретации для этого слова не определена. Компиляция: Исполняет семантику выполнения, данную ниже. Выполнение: ( -- ) Вводит состояние интерпретации. [ - слово немедленного выполнения. См.: 3.4 Интерпретатор текста Forth, 3.4.5 Компиляция, 6.1.2540 ]. 6.1.2510 ['] "bracket-tick" CORE Интерпретация: Семантика интерпретации для этого слова не определена. Компиляция: ( "name" -- ) Пропускает ведущие разделители пробелы. Выделяет name, ограниченное пробелом. Находит name. Добавляет семантику времени-выполнения, данную ниже к текущему определению. Неопределенная ситуация существует, если name не найдено. 62 Время-выполнения: ( -- xt ) Помещает идентификатор исполнения name xt на стек. Идентификатор исполнения, возвращенный скомпилированной фразой "['] X " , имеет то же значение, как и возвращенный "' X " вне состояния компиляции. См.: 3.4.1 Синтаксический анализ, A.6.1.0070 ', A.6.1.2033 POSTPONE, D.6.7 Immediate-ности. 6.1.2520 [CHAR] "bracket-char" CORE Интерпретация: Семантика интерпретации для этого слова не определена. Компиляция: ( "name" -- ) Пропускает ведущие разделители пробелы. Выделяет name, ограниченное пробелом. Добавляет семантику времени-выполнения, данную ниже к текущему определению. Время-выполнения: ( -- char ) Помещает на стек char, значение первого символа name. См.: 3.4.1 Синтаксический анализ, 6.1.0895 CHAR. 6.1.2540 ] "right-bracket" CORE ( -- ) Вводит состояние компиляции. См.: 3.4 Интерпретатор текста Forth, 3.4.5 Компиляция, 6.1.2500 [. 63 6.2 ________________________ Расширения основных слов 6.2.0060 #TIB "number-t-i-b" CORE EXT ( -- a-addr ) a-addr - адрес ячейки, содержащей число символов во входном буфере терминала. Примечание: Это слово устаревшее и включено как уступка существующим реализациям. 6.2.0200 .( "dot-paren" CORE EXT Компиляция: Исполняет семантику выполнения, данную ниже. Выполнение: ( "ccc" -- ) Выделяет и отображает ccc, ограниченную ) (правая круглая скобка). .( является словом немедленного исполнения. См.: 3.4.1 Синтаксический анализ, 6.1.0190 .". 6.2.0210 .R "dot-r" CORE EXT ( n1 n2 -- ) Отображает n1 выровненное вправо в поле шириной n2 символов. Если число символов требуемых для отображения n1 больше чем n2, все цифры отображаются без ведущих пробелов в поле необходимой ширины. 6.2.0260 0<> "zero-not-equals" CORE EXT ( x -- flag ) flag - true, если и только если x - не равно нулю. 6.2.0280 0> "zero-greater" CORE EXT ( n -- flag ) flag - true, если и только если n - больше нуля. 6.2.0340 2>R "two-to-r" CORE EXT Интерпретация: Семантика интерпретации для этого слова не определена. Выполнение: ( x1 x2 -- ) ( R: -- x1 x2 ) Перемещает пару-ячеек x1 x2 на стек возвратов. Семантически эквивалентно SWAP >R >R. См.: 3.2.3.3 Стек возвратов, 6.1.0580 >R, 6.1.2060 R>, 6.1.2070 R@, 6.2.0410 2R>, 6.2.0415 2R@. 6.2.0410 2R> "two-r-from" CORE EXT Интерпретация: Семантика интерпретации для этого слова не определена. Выполнение: ( -- x1 x2 ) ( R: x1 x2 -- ) Перемещает пару-ячеек x1 x2 со стека возвратов. Семантически эквивалентно R> R> SWAP. 64 См.: 3.2.3.3 Стек возвратов, 6.1.0580 >R, 6.1.2060 R>, 6.1.2070 R@, 6.2.0340 2>R, 6.2.0415 2R@. 6.2.0415 2R@ "two-r-fetch" CORE EXT Интерпретация: Семантика интерпретации для этого слова не определена. Выполнение: ( -- x1 x2 ) ( R: x1 x2 -- x1 x2 ) Копирует пару-ячеек x1 x2 со стека возвратов. Семантически эквивалентно R> R> 2DUP >R >R SWAP. См.: 3.2.3.3 Стек возвратов, 6.1.0580 >R, 6.1.2060 R>, 6.1.2070 R@, 6.2.0340 2>R, 6.2.0410 2R>. 6.2.0455 :NONAME "colon-no-name" CORE EXT ( C: -- colon-sys ) ( S: -- xt ) Создает идентификатор исполнения xt, вводит состояние компиляции и начинает текущее определение, производя colon-sys. Добавляет семантику инициирования данную ниже к текущему определению. Семантика выполнения xt будет определена скомпилированными в тело определения словами. Это определение может быть выполнено позже, используя xt EXECUTE. Если стек потока управления реализован с использованием стека данных, colon-sys должен быть самым верхним элементом на стеке данных. Инициирование: ( i*x -- i*x ) ( R: -- nest-sys ) Сохраняет зависящую-от-реализации информацию nest-sys о вызывающем определении. Состояние стека i*x представляет параметры для xt. xt Выполнение: ( i*x -- j*x ) Выполняет определение определенное xt. Состояние стека i*x и i*x представляет параметры для и результаты от xt, соответственно. См. 3.2.3.2 Стек потока-управления. 6.2.0500 <> "not-equals" CORE EXT ( x1 x2 -- flag ) flag - true, если и только если x1 побитно не эквивалентно x2. 6.2.0620 ?DO "question-do" CORE EXT Интерпретация: Семантика интерпретации для этого слова не определена. Компиляция: ( C: -- do-sys ) Помещает do-sys на стек потока управления. Добавляет семантику времени-выполнения данную ниже к текущему определению. Семантика не завершена, пока не разрешена потребителем do-sys типа LOOP. Время-выполнения: ( n1|u1 n2|u2 -- ) ( R: -- | loop-sys ) 65 Если n1|u1 равно n2|u2, продолжает выполнение с адреса ячейки данного потребителем do-sys. Иначе устанавливает параметры управления цикла с индексом n2|u2, и границей n1|u1, и продолжает выполнение непосредственно после ?DO. Что - либо уже имеющееся на стеке возвратов становится недоступным до удаления параметров управления циклом. Неопределенная ситуация существует, если оба n1|u1 и n2|u2- не одного типа. См.: 3.2.3.2 Стек потока-управления, 6.1.0140 +LOOP, 6.1.1240 DO, 6.1.1680 I, 6.1.1760 LEAVE, 6.1.1800 LOOP, 6.1.2380 UNLOOP. 6.2.0700 AGAIN CORE EXT Интерпретация: Семантика интерпретации для этого слова не определена. Компиляция: ( C: dest -- ) Добавляет семантику времени-выполнения, данную ниже к текущему определению, разрешением ссылки назад dest. Время-выполнения: ( -- ) Продолжает выполнение с адреса ячейки определенного dest. Если никакое другое слово потока управления не используется, любой код программы после AGAIN не будет выполнен. См.: 6.1.0760 BEGIN. 6.2.0855 C" "c-quote" CORE EXT Интерпретация: Семантика интерпретации для этого слова не определена. Компиляция: ( "ccc" -- ) Выделяет ccc, ограниченное " (двойная кавычка), и добавляет семантику времени-выполнения данную ниже к текущему определению. Время-выполнения: ( -- c-addr ) Возвращает c-addr строку со счетчиком, состоящую из символов ccc. Программа не должна изменять возвращенную строку. См.: 3.4.1 Синтаксический анализ, 6.1.2165 S", 11.6.1.2165 S". 6.2.0873 CASE CORE EXT Интерпретация: Семантика интерпретации для этого слова не определена. Компиляция: ( C: -- case-sys ) Отмечает начало CASE ... OF ... ENDOF ... ENDCASE структуры. Добавляет семантику времени-выполнениия, данную ниже к текущему определению. Время-выполнения: ( -- ) Продолжает выполнение. См.: 6.2.1342 ENDCASE, 6.2.1343 ENDOF, 6.2.1950 OF. 6.2.0945 COMPILE, "compile-comma" CORE EXT Интерпретация: Семантика интерпретации для этого слова не определена. 66 Выполнение: ( xt -- ) Добавляет семантику выполнения определения представленного xt к семантике выполнения текущего определения. 6.2.0970 CONVERT CORE EXT ( ud1 c-addr1 -- ud2 c-addr2 ) ud2 - результат преобразования символов в пределах текста начинающегося с первого символа после c-addr1 в цифры, используя число из BASE, и добавление каждой цифры в ud1 после умножения ud1 на число из BASE. Преобразование продолжается до встречи с не преобразуемым символом. c-addr2 - адрес ячейки первого не преобразованного символа. Неопределенная ситуация существует, если ud2 переполняется. Примечание: Это слово устаревшее и включено как уступка существующим реализациям. Его функция заменена на 6.1.0570 >NUMBER. См.: 3.2.1.2 Преобразование цифр. 6.2.1342 ENDCASE "end-case" CORE EXT Интерпретация: Семантика интерпретации для этого слова не определена. Компиляция: ( C: case-sys -- ) Отмечает конец CASE ... OF ... ENDOF ... ENDCASE структуры. Использует case-sys для разрешения всей структуры. Добавляет семантику времени-выполнения данную ниже к текущему определению. Время-выполнения: ( x -- ) Снимает case селектор x, и продолжает выполнение. См.: 6.2.0873 CASE, 6.2.1343 ENDOF, 6.2.1950 OF. 6.2.1343 ENDOF "end-of" CORE EXT Интерпретация: Семантика интерпретации для этого слова не определена. Компиляция: ( C: case-sys1 of-sys -- case-sys2 ) Отмечает конец OF ... ENDOF части CASE структуры. Следующий адрес ячейки для передачи управления разрешает ссылка of-sys. Добавляет семантику времени-выполнения, данную ниже к текущему определению. Заменяет case-sys1 на case-sys2 на стеке потока управления, для разрешения ENDCASE. Время-выполнения: ( -- ) Продолжает выполнение с адреса ячейки определенного потребителем case-sys2. См.: 6.2.0873 CASE, 6.2.1342 ENDCASE, 6.2.1950 OF. 6.2.1350 ERASE CORE EXT ( addr u -- ) Если u больше нуля, очистить все биты в каждом из u последовательных адресуемых элементов памяти, начинающихся с addr. 67 6.2.1390 EXPECT CORE EXT ( c-addr +n -- ) Получает строку с максимумом в +n символов. Отображает графические символы по мере их получения. Программа, которая зависит от присутствия или отсутствия неграфических символов в строке имеет зависимость от окружения. Функции редактирования, если таковые вообще имеются, которые система исполняет, чтобы создать строку символов - определенное реализацией. Ввод заканчивается, когда получен определенный реализацией признак конца строки или если строка длиной +n символов. Когда ввод заканчивается, ничего не добавляется в конец строки, и изображение обеспечивается определенным реализацией способом. Сохраняет строку в c-addr и ее длинну в SPAN. Примечание: Это слово устаревшее и включено как уступка существующим реализациям. Его функция заменена на 6.1.0695 ACCEPT. 6.2.1485 FALSE CORE EXT ( -- false ) Возвращает флаг false. См.: 3.1.3.1 Флаги 6.2.1660 HEX CORE EXT ( -- ) Устанавливает содержимое BASE в 16. 6.2.1850 MARKER CORE EXT ( "name" -- ) Пропускает ведущие разделители пробелы. Выделяет name, ограниченное пробелом. Создает определение для name с семантикой выполнения, определенной ниже. name Выполнение: ( -- ) Восстанавливает все распределение словаря и указатели порядка поиска на состояние, которое они имели непосредственно до определения name. Удаляет определение name и все последующие определения. Восстановление любых все еще существующих структур, которые могли бы обратиться к удаленным определениям или освобожденной области данных предусматривать не обязательно. Никакая другая контекстная информация типа основания счисления не затрагивается. См.: 3.4.1 Синтаксический анализ, 15.6.2.1580 FORGET. 6.2.1930 NIP CORE EXT ( x1 x2 -- x2 ) Удаляет первый элемент ниже вершины стека. 6.2.1950 OF CORE EXT Интерпретация: Семантика интерпретации для этого слова не определена. 68 Компиляция: ( C: -- of-sys ) Помещает of-sys на стек потока управления. Добавляет семантику времени-выполнения данную ниже к текущему определению. Семантика не завершена, пока не разрешена of-sys потребителем типа ENDOF. Время-выполнения: ( x1 x2 -- | x1 ) Если два значения на стеке - не равны, снимает верхнее значение и продолжает выполнение с адреса ячейки определенного потребителем of-sys, например, после следующего ENDOF. Иначе, снимает оба значения и продолжает выполнение в строке. См.: 6.2.0873 CASE, 6.2.1342 ENDCASE, 6.2.1343 ENDOF. 6.2.2000 PAD CORE EXT ( -- c-addr ) c-addr - адрес временной области, которая может использоваться с целью хранения данных для промежуточной обработки. См.: 3.3.3.6 Другие временные области. 6.2.2008 PARSE CORE EXT ( char "ccc" -- c-addr u ) Выделяет ccc, ограниченную разделителем char. c-addr - адрес (в пределах входного буфера) и u - длина выделенной строки. Если область анализа была пуста, результирующая строка имеет нулевую длину. См.: 3.4.1 Синтаксический анализ. 6.2.2030 PICK CORE EXT ( xu ... x1 x0 u -- xu ... x1 x0 xu ) Удаляет u. Копирует xu на вершину стека. Неопределенная ситуация существует, если до выполнения PICK на стеке меньше u+2 элементов. 6.2.2040 QUERY CORE EXT ( -- ) Делает пользовательское устройство ввода данных входным источником. Получает ввод в буфер ввода терминала, заменяя любое предыдущее содержимое. Делает результат, чей адрес возвращается TIB, входным буфером. Установить >IN в ноль. Примечание: Это слово устаревшее и включено как уступка существующим реализациям. 6.2.2125 REFILL CORE EXT ( -- flag ) 69 Пытается заполнить входной буфер из входного источника, возвращая true flag если успешно. Если входной источник - пользовательское устройство ввода, пытается получить ввод во входной буфер терминала. Если успешно, делает результат входным буфером, устанавливает >IN в ноль, и возвращает true. Получение строки не содержащей никакие символы рассматривается успешным. Если ввод не доступен из текущего входного источника, возвращает false. Когда входной источник - строка от EVALUATE, возвращает false и не исполняет никакое другое действие. См.: 7.6.2.2125 REFILL, 11.6.2.2125 REFILL. 6.2.2148 RESTORE-INPUT CORE EXT ( xn ... x1 n -- flag ) Пытается восстановить спецификацию входного источника к состоянию описанному x1 ... xn. flag - true, если спецификация входного источника не может быть так восстановлена. Неопределенная ситуация существует если входной источник, представленный параметрами - не совпадает с текущим входным источником. См.: A.6.2.2182 SAVE-INPUT. 6.2.2150 ROLL CORE EXT ( xu xu-1 ... x0 u -- xu-1 ... x0 xu ) Удаляет u. Вращает u+1 элементов на вершине стека. Неопределенная ситуация существует, если перед выполнением ROLL на стеке имелось меньше u+2 элементов. 6.2.2182 SAVE-INPUT CORE EXT ( -- xn ... x1 n ) x1 ... xn описывают текущее состояние спецификации входного источника для более позднего использования RESTORE-INPUT. 6.2.2218 SOURCE-ID "source-i-d" CORE EXT ( -- 0 | -1 ) Идентифицирует входной источник следующим образом: SOURCE-ID Входной источник -------------------------------------------- -1 Строка (через EVALUATE) 0 Пользовательское устройство ввода -------------------------------------------- См.: 11.6.1.2218 SOURCE-ID. 6.2.2240 SPAN CORE EXT ( -- a-addr ) a-addr - адрес ячейки, содержащей число символов сохраненное последним выполнением EXPECT. 70 Примечание: Это слово устаревшее и включено как уступка существующим реализациям. 6.2.2290 TIB "t-i-b" CORE EXT ( -- c-addr ) c-addr - адрес буфера ввода терминала. Примечание: Это слово устаревшее и включено как уступка существующим реализациям. 6.2.2295 TO CORE EXT Интерпретация: ( x "name" -- ) Пропускает ведущие пробелы, и выделяет name, ограниченное пробелом. Сохраняет x в name. Неопределенная ситуация существует, если name не было определено через VALUE. Компиляция: ( "name" -- ) Пропускает ведущие пробелы, и выделяет name, ограниченное пробелом. Добавляет семантику времени-выполнения, данную ниже к текущему определению. Неопределенная ситуация существует, если name не было определено через VALUE. Время-выполнения: ( x -- ) Сохраняет x в name. Примечание: Неопределенная ситуация существует, если POSTPONE или [COMPILE], применяется к TO. См.: 6.2.2405 VALUE, 13.6.1.2295 TO. 6.2.2298 TRUE CORE EXT ( -- true ) Возвращает флаг true, значение одна-ячейка со всеми установленными битами. См.: 3.1.3.1 Флаги. 6.2.2300 TUCK CORE EXT ( x1 x2 -- x2 x1 x2 ) Копирует верхний элемент стека ниже второго элемента стека. 6.2.2330 U.R "u-dot-r" CORE EXT ( u n -- ) Отображает u выровненное вправо, в поле шириной n символов. Если число символов требуемых для отображения u больше чем n, все цифры отображаются без ведущих пробелов в поле необходимой ширины. 6.2.2350 U> "u-greater-than" CORE EXT ( u1 u2 -- flag ) flag - true, если и только если u1 больше чем u2. См.: 6.1.0540 >. 71 6.2.2395 UNUSED CORE EXT ( -- u ) u - количество оставшегося пространства в области адресуемой HERE, в адресуемых элементах. 6.2.2405 VALUE CORE EXT ( x "name" -- ) Пропускает ведущие разделители пробелы. Выделяет name, ограниченное пробелом. Создает определение для name с семантикой выполнения, определенной ниже, с начальным значением равным x. name определено как "value". name Выполнение: ( -- x ) Помещает x на стек. Значение x - то что задано, при создании name, до тех пор пока не выполнена фраза x TO name, задающая новое значение x, связанное с name. См.: 3.4.1 Синтаксический анализ. 6.2.2440 WITHIN CORE EXT ( n1|u1 n2|u2 n3|u3 -- flag ) Выполняет сравнение проверяемого значения n1|u1 с нижним пределом n2|u2 и верхним пределом n3|u3, возвращая true, если (n2|u2 < n3|u3 и (n2|u2 <= n1|u1 и n1|u1 < n3|u3)) или (n2|u2 > n3|u3 и (n2|u2 <= n1|u1 или n1|u1 < n3|u3)) - true, иначе возвращает false. Неопределенная ситуация существует, если n1|u1, n2|u2, и n3|u3 не все одного типа. 6.2.2530 [COMPILE] "bracket-compile" CORE EXT Интерпретация: Семантика интерпретации для этого слова не определена. Компиляция: ( "name" -- ) Пропускает ведущие разделители пробелы. Выделяет name, ограниченное пробелом. Находит name. Если name имеет семантику компиляции отличную от заданной по умолчанию, добавляет ее к текущему определению; иначе добавляет семантику выполнения name. Неопределенная ситуация существует, если name не найдено. См.: 3.4.1 Синтаксический анализ. 6.2.2535 \ "backslash" CORE EXT Компиляция: Исполняет семантику выполнения, данную ниже. Выполнение: ( "ccc"-- ) Выделяет и удаляет остаток области анализа. \ слово немедленного исполнения. См.: 7.6.2.2535 \. 72 7. _________________________________ Дополнительный Блочный набор слов 7.1 ________ Введение 7.2 ______________________ Дополнительные термины Блок: 1024 символа данных на запоминающем устройстве, обозначенные номером блока. Блочный буфер: зона области данных блочного размера, где блок создан временно доступным для использования. Текущий блочный буфер - блочный буфер больше всего недавно использовавшийся посредством BLOCK, BUFFER, LOAD, LIST, или THRU. 7.3 _________________________________ Дополнительные условия применения 7.3.1 ___________________ Запросы к окружению Добавьте таблицу 7.1 к таблице 3.5. См.: 3.2.6 Запросы к окружению. _________________________________________ Таблица 7.1 - Строки запросов к окружению Строка Тип Константа Значение --------------------------------------------------------------- BLOCK flag no блочный набор слов присутствует BLOCK-EXT flag no дополнительный блочный набор слов присутствует --------------------------------------------------------------- 7.3.2 ______________ Область данных Программа может обращаться к памяти в пределах блочного буфера. См.: 3.3.3 Область данных. 7.3.3 _______________________ Области блочного буфера Адрес блочного буфера, возвращенного BLOCK или BUFFER временный. Вызов BLOCK или BUFFER может сделать адрес предварительно полученного блочного буфера недействительным, также как вызов любого слова типа: - синтаксические анализаторы; - отображающие символы на пользовательском устройстве вывода, типа TYPE или EMIT; - управляющие пользовательским устройством вывода, типа CR или AT-XY; - получающие или проверяющие на присутствие символов из пользовательского устройства ввода, типа ACCEPT или KEY; - ждущие состояние или событие, типа MS или EKEY; - управляющие блочными буферами, типа FLUSH, SAVE-BUFFERS, или EMPTY-BUFFERS; - выполняющие любую операцию над файлом или каталогом имени файла, которые подразумевают ввод-вывод, типа REFILL или любое слово, которое возвращает ior; - неявно выполняющие ввод-вывод, типа встроенного и не встроенного текстового интерпретатора при использовании файлов (включая не встроенный подразумеваемый THROW). 73 Если входной источник - блок, эти ограничения также относятся к адресу, возвращенному SOURCE. Блочные буферы уникально назначены на блоки. 7.3.4 _____________________ Синтаксический анализ Блочный набор слов обеспечивает альтернативный входной источник для текстового интерпретатора. Когда входной источник - блок, BLK должен содержать ненулевой номер блока и входной буфер - 1024-символьный буфер, содержащий этот блок. Блок традиционно представлен как 16 строк по 64 символа. Программа может переключать входной источник на блок, используя LOAD или THRU. Входные источники могут быть вложены, используя LOAD, и EVALUATE в любом порядке. Программа может переустанавливать область анализа в пределах блока, управляя >IN. Более обширное переустановление может быть выполнено, используя SAVE-INPUT и RESTORE-INPUT. См.: 3.4.1 Синтаксический анализ. 7.3.5 _____________________________________________ Возможное действие на неопределенную ситуацию См.: 3.4.4 Возможное действие на неопределенную ситуацию. - Система с блочным набором слов может устанавливать состояние интерпретации и интерпретировать блок. 7.4 __________________________________________ Дополнительные документационные требования 7.4.1 ______________________ Системная документация 7.4.1.1 ______________________________ Опции определенные реализацией - формат, используемый для отображения с помощью 7.6.2.1770 LIST (если реализовано); - длина строки, поддерживаемая 7.6.2.2535 \ (если реализовано). 7.4.1.2 _______________________ Неопределенные ситуации - Верное чтение блока не было возможно; - Исключение ввода-вывода при пересылке блока; - Недействительный номер блока (7.6.1.0800 BLOCK, 7.6.1.0820 BUFFER, 7.6.1.1790 LOAD); - Программа непосредственно изменяет содержимое 7.6.1.0790 BLK; - Нет текущего блочного буфера для 7.6.1.2400 UPDATE. 7.4.1.3 _____________________________ Другая системная документация - любые ограничения служб системы мультипрограммирования на использование адресов буферов; - число блоков, доступных для исходного текста и данных. 7.4.2 ________________________ Программная документация - число блоков, требуемых программой. 74 7.5 _________________________ Соглашение и наименование 7.5.1 _________________ ANS Forth системы Фраза "Предоставляет блочный набор слов" должна быть добавлена к наименованию любой Стандартной системы, которая предоставляет весь блочный набор слов. Фраза "Предоставляет имена из расширения блочного набора слов" должна быть добавлена к наименованию любой Стандартной системы, которая предоставляет часть расширения блочного набора слов. Фраза "Предоставляет расширение блочного набора слов" должна быть добавлена к наименованию любой Стандартной системы, которая предоставляет весь блочный набор слов и расширение блочного набора слов. 7.5.2 ___________________ ANS Forth программы Фраза "Требуется блочный набор слов" должна быть добавлена к наименованию Стандартной программы, которая требует, чтобы система предоставила блочный набор слов. Фраза "Требуются имена из расширения блочного набора слов" должна быть добавлена к наименованию Стандартной программы, которая требует, чтобы система предоставила часть расширения блочного набора слов. Фраза "Требуется расширение блочного набора слов" должна быть добавлена к наименованию Стандартной программы, которая требует, чтобы система предоставила весь блочный набор слов и расширение блочного набора слов. 7.6 _______ Словарь 7.6.1 _____________ Блочные слова 7.6.1.0790 BLK "b-l-k" BLOCK ( -- a-addr ) a-addr - адрес ячейки, содержащей нуль или номер интерпретируемого блока запоминающего устройства. Если BLK содержит нуль, входной источник - не блок и может быть идентифицирован SOURCE-ID, если SOURCE-ID является доступным. Неопределенная ситуация существует если программа непосредственно изменяет содержание BLK. См.: 7.3.3 Области блочного буфера. 7.6.1.0800 BLOCK BLOCK ( u -- a-addr ) a-addr - адрес первого символа блочного буфера назначенного на блок u запоминающего устройства. Неопределенная ситуация существует, если u не доступный номер блока. Если блок u - уже в блочном буфере, a-addr - адрес этого блочного буфера. 75 Если блок u - уже не в памяти и есть свободный блочный буфер, перемещает блок u из запоминающего устройства в свободный блочный буфер. a-addr - адрес этого блочного буфера. Если блок u - уже не в памяти и нет никаких свободных блочных буферов, освобождает блочный буфер. Если для блока в этом буфере было выполнено UPDATE, перемещает блок в запоминающее устройство, и перемещает блок u из запоминающего устройства в этот буфер. a-addr - адрес этого блочного буфера. При завершении операции, блочный буфер указанный a-addr - текущий буфер блоков и назначен на u. 7.6.1.0820 BUFFER BLOCK ( u -- a-addr ) a-addr - адрес первого символа блочного буфера назначенного блоку u. Содержание блока не определено. Неопределенная ситуация существует, если u - не доступный номер блока. Если блок u - уже в блочном буфере, a-addr - адрес этого блочного буфера. Если блок u - уже не в памяти и есть свободный буфер, a-addr - адрес этого блочного буфера. Если блок u - уже не в памяти и нет никаких свободных блочных буферов, освобождает блочный буфер. Если для блока в этом буфере было выполнено UPDATE, перемещает блок в запоминающее устройство. a-addr - адрес этого блочного буфера. При завершении операции, блочный буфер указанный a-addr - текущий буфер блоков и назначен на u. См.: 7.6.1.0800 BLOCK. 7.6.1.1360 EVALUATE BLOCK Расширяется семантика 6.1.1360 EVALUATE так, чтобы включить: Запись нуля в BLK. 7.6.1.1559 FLUSH BLOCK ( -- ) Выполняет функцию SAVE-BUFFERS, затем освобождает все блочные буферы. 7.6.1.1790 LOAD BLOCK ( i*x u -- j*x ) Сохраняет текущую спецификацию входного источника. Записывает u в BLK (таким образом делает блок u входным источником, и устанавливает входной буфер в соответствии с его содержимым), обнуляет >IN, и интерпретирует. Когда область анализа исчерпана, восстанавливает предыдущую спецификацию входного источника. Другое состояние стека из-за интерпретации слов с помощью LOAD. 76 Неопределенная ситуация существует, если u нулевой или - не допустимый номер блока. См.: 3.4 Интерпретатор текста Forth. 7.6.1.2180 SAVE-BUFFERS BLOCK ( -- ) Перемещает содержание каждого модифицированного блочного буфера на запоминающее устройство. Отмечает все буферы как не модифицированные. 7.6.1.2400 UPDATE BLOCK ( -- ) Отмечает текущий блочный буфер как измененный. Неопределенная ситуация существует, если нет никакого текущего блочного буфера. UPDATE не вызывает немедленно ввод-вывод. См.: 7.6.1.0800 BLOCK, 7.6.1.0820 BUFFER, 7.6.1.1559 FLUSH, 7.6.1.2180 SAVE-BUFFERS. 7.6.2 _______________________ Расширения блочных слов 7.6.2.1330 EMPTY-BUFFERS BLOCK EXT ( -- ) Освобождает все блочные буферы. Не перемещает содержание никакого модифицированного блочного буфера на запоминающее устройство. См.: 7.6.1.0800 BLOCK. 7.6.2.1770 LIST BLOCK EXT ( u -- ) Отображает блок u в формате определенном реализацией. Сохраняет u в SCR. См.: 7.6.1.0800 BLOCK. 7.6.2.2125 REFILL BLOCK EXT ( -- flag ) Расширяется семантика выполнения 6.2.2125 REFILL следующим образом: Когда входной источник - блок, делает следующий блок входным источником и текущим входным буфером, добавляя один к значению BLK и устанавливая >IN в ноль. Возвращает true, если новое значение BLK - допустимый номер блока, иначе false. См.: 6.2.2125 REFILL, 11.6.2.2125 REFILL. 7.6.2.2190 SCR "s-c-r" BLOCK EXT ( -- a-addr ) a-addr - адрес ячейки, содержащей номер последнего блока отображенного с помощью LIST. 77 7.6.2.2280 THRU BLOCK EXT ( i*x u1 u2 -- j*x ) LOAD последовательные блоки из запоминающего устройства с номерами с u1 по u2. Другое состояние стека из-за интерпретации слов с помощью LOAD. 7.6.2.2535 \ "backslash" BLOCK EXT Компиляция: Исполняет семантику выполнения, данную ниже. Выполнение: ( "ccc"-- ) Если BLK содержит нуль, выделяет, и удаляет остаток области анализа; иначе выделяет, и удаляет остаток области анализа соответствующей остатку текущей строки. \ - слово немедленного исполнения. 78 8. _______________________________________ Дополнительный набор слов двойных чисел 8.1 ________ Введение 16-бит системы Forth часто используют числа двойной длины. Однако много Forth- ов на маленьких встроенных системах этого не имеют, и много пользователей Forth на системах с размером ячейки 32 бит или больше находят, что использование чисел двойной длины очень ограничено. Поэтому слова, которые манипулируют объектами двойной длины, были помещены в этот дополнительный набор слов. 8.2 ________________________________ Дополнительные термины и нотации Нет. 8.3 _________________________________ Дополнительные условия применения 8.3.1 ____________________ Запросы к окружению Добавьте таблицу 8.1 к таблице 3.5. См.: 3.2.6 Запросы к окружению. _________________________________________ Таблица 8.1 - Строки запросов к окружению Строка Тип Константа Значение -------------------------------------------------------------------- DOUBLE flag no набор слов двойных чисел присутствует DOUBLE-EXT flag no дополнительный набор слов двойных чисел присутствует -------------------------------------------------------------------- 8.3.2 ______________________________________________________ Преобразование входных чисел текстового интерпретатора Когда текстовый интерпретатор обрабатывает число, которое непосредственно сопровождается десятичной точкой и не найдено как определение name, текстовый интерпретатор должен преобразовать его к числу две-ячейки. Например, ввод DECIMAL 1234 оставит число одна-ячейка 1234 на стеке, и ввод DECIMAL 1234. оставит число две-ячейки 1234 0 на стеке. См.: 3.4.1.3 Преобразование входных чисел текстового интерпретатора. 8.4 __________________________________________ Дополнительные документационные требования 8.4.1 ______________________ Системная документация 8.4.1.1 Опции определенные реализацией - нет дополнительных требований. 8.4.1.2 Неопределенные ситуации - d вне диапазона n при 8.6.1.1140 D>S. 8.4.1.3 Другая системная документация - нет дополнительных требований. 79 8.4.2 ________________________ Программная документация - нет дополнительных требований. 8.5 _________________________ Соглашение и наименование 8.5.1 _________________ ANS Forth системы Фраза "Предоставляет набор слов двойных чисел" должна быть добавлена к наименованию любой Стандартной системы, которая предоставляет весь набор слов двойных чисел. Фраза "Предоставляет имена из расширения набора слов двойных чисел" должна быть добавлена к наименованию любой Стандартной системы, которая предоставляет часть расширения набора слов двойных чисел. Фраза "Предоставляет расширение набора слов двойных чисел" должна быть добавлена к наименованию любой Стандартной системы, которая предоставляет весь набор слов двойных чисел и расширение набора слов двойных чисел. 8.5.2 ___________________ ANS Forth программы Фраза "Требуется набор слов двойных чисел" должна быть добавлена к наименованию Стандартной программы, которая требует, чтобы система предоставила набор слов двойных чисел. Фраза "Требуются имена из расширения набора слов двойных чисел" должна быть добавлена к наименованию Стандартной программы, которая требует, чтобы система предоставила часть расширения набора слов двойных чисел. Фраза "Требуется расширение набора слов двойных чисел" должна быть добавлена к наименованию Стандартной программы, которая требует, чтобы система предоставила весь набор слов двойных чисел и расширение набора слов двойных чисел. 8.6 _______ Словарь 8.6.1 ___________________ Слова двойных чисел 8.6.1.0360 2CONSTANT "two-constant" DOUBLE ( x1 x2 "name" -- ) Пропускает ведущие разделители пробелы. Выделяет name, ограниченное пробелом. Создает определение для name с семантикой выполнения, определенной ниже. name объявляется как "two-constant". name Выполнение: ( -- x1 x2 ) Помещает пару-ячеек x1 x2 на стек. См.: 3.4.1 Синтаксический анализ. 80 8.6.1.0390 2LITERAL "two-literal" DOUBLE Интерпретация: Семантика интерпретации для этого слова не определена. Компиляция: ( x1 x2 -- ) Добавляет семантику времени-выполнения данную ниже к текущему определению. Время-выполнения: ( -- x1 x2 ) Помещает пару-ячеек x1 x2 на стек. 8.6.1.0440 2VARIABLE "two-variable" DOUBLE ( "name" -- ) Пропускает ведущие разделители пробелы. Выделяет name, ограниченное пробелом. Создает определение для name с семантикой выполнения, определенной ниже. Резервирует две последовательных ячейки области данных. name объявляется как "two-variable". name Выполнение: ( -- a-addr ) a-addr - адрес первой (наименьший адрес) ячейки двух последовательных ячеек в области данных, зарезервированной 2VARIABLE, когда оно определило name. Программа ответственна за инициализацию содержимого. См.: 3.4.1 Синтаксический анализ, 6.1.2410 VARIABLE. 8.6.1.1040 D+ "d-plus" DOUBLE ( d1|ud1 d2|ud2 -- d3|ud3 ) Добавляет d2|ud2 к d1|ud1, возвращает сумму d3|ud3. 8.6.1.1050 D- "d-minus" DOUBLE ( d1|ud1 d2|ud2 -- d3|ud3 ) Вычитает d2|ud2 из d1|ud1, возвращает разницу d3|ud3. 8.6.1.1060 D. "d-dot" DOUBLE ( d -- ) Отображает d в формате свободного поля. 8.6.1.1070 D.R "d-dot-r" DOUBLE ( d n -- ) Отображает d выровненное вправо в поле шириной n символов. Если число символов требуемых для отображения d больше чем n, все цифры отображаются без ведущих пробелов в поле необходимой ширины. 8.6.1.1075 D0< "d-zero-less" DOUBLE ( d -- flag ) flag - true, если и только если d - меньше нуля. 8.6.1.1080 D0= "d-zero-equals" DOUBLE ( xd -- flag ) flag - true, если и только если xd - равно нулю. 8.6.1.1090 D2* "d-two-star" DOUBLE ( xd1 -- xd2 ) 81 xd2 - результат смещения xd1 на один бит к старшему двоичному разряду, заполнение освобожденного младшего бита нулем. 8.6.1.1100 D2/ "d-two-slash" DOUBLE ( xd1 -- xd2 ) xd2 - результат смещения xd1 на один бит к младшему двоичному разряду, оставляет старший бит неизменным. 8.6.1.1110 D< "d-less-than" DOUBLE ( d1 d2 -- flag ) flag - true, если и только если d1 - меньше чем d2. 8.6.1.1120 D= "d-equals" DOUBLE ( xd1 xd2 -- flag ) flag - true, если и только если xd1 - побитно равно xd2. 8.6.1.1140 D>S "d-to-s" DOUBLE ( d -- n ) n - эквивалент d. Неопределенная ситуация существует, если d находится вне диапазона знакового числа одна-ячейка. 8.6.1.1160 DABS "d-abs" DOUBLE ( d -- ud ) ud - абсолютное значение d. 8.6.1.1210 DMAX "d-max" DOUBLE ( d1 d2 -- d3 ) d3 большее из d1 и d2. 8.6.1.1220 DMIN "d-min" DOUBLE ( d1 d2 -- d3 ) d3 меньшее из d1 и d2. 8.6.1.1230 DNEGATE "d-negate" DOUBLE ( d1 -- d2 ) d2 - отрицание d1. 8.6.1.1820 M*/ "m-star-slash" DOUBLE ( d1 n1 +n2 -- d2 ) Умножает d1 на n1, производя промежуточный результат тройную-ячейку t. Делит t на +n2 возвращая частное d2 две-ячейки. Неопределенная ситуация существует, если +n2 нулевое или отрицательное, или частное находится вне диапазона целого числа со знаком двойной точности. 8.6.1.1830 M+ "m-plus" DOUBLE ( d1|ud1 n -- d2|ud2 ) Прибавляет n к d1|ud1, возвращая сумму d2|ud2. 8.6.2 _____________________________ Расширения слов двойных чисел 82 8.6.2.0420 2ROT "two-rote" DOUBLE EXT ( x1 x2 x3 x4 x5 x6 -- x3 x4 x5 x6 x1 x2 ) Вращает три верхних пары-ячеек на стеке, перенося пару-ячеек x1 x2 на вершину стека. 8.6.2.1270 DU< "d-u-less" DOUBLE EXT ( ud1 ud2 -- flag ) flag - true, если и только если ud1 - меньше чем ud2. 83 9. ____________________________________ Дополнительный набор слов исключений 9.1 ________ Введение 9.2 ________________________________ Дополнительные термины и нотации Нет. 9.3 _________________________________ Дополнительные условия применения 9.3.1 ______________ Значения THROW Значения THROW {-255...-1} должны использоваться только как определено этим Стандартом. Значения {-4095...-256} должны использоваться только как определено системой. Если наборы слов доступа к файлу или распределения памяти реализованы, рекомендуется чтобы ненулевые значения ior, располагались в пределах системного диапазона значений THROW, как определено выше. В среде операционной системы, это может иногда выполняться "смещением" диапазона кодов-исключений операционной системы, чтобы попасть в пределы диапазона THROW. Программы не должны определять значения для использования с THROW в диапазоне {-4095...-1}. 9.3.2 ____________________ Структура исключения Структура исключения - зависящий-от-реализаци набор информационных записей текущего состояния выполнения необходимый для надлежащего функционирования CATCH и THROW. Она часто включает глубину стека данных и стека возвратов. 9.3.3 _______________ Стек исключения Стек, используемый CATCH и THROW для вложенных структур исключений. Он может, но не обязательно, быть реализован с использованием стека возвратов. 9.3.4 ____________________ Запросы к окружению Добавьте таблицу 9.1 к таблице 3.5. См.: 3.2.6 Запросы к окружению. _________________________________________ Таблица 9.1 - Строки запросов к окружению Строка Тип Константа Значение ------------------------------------------------------------------ EXCEPTION flag no набор слов исключений присутствует EXCEPTION-EXT flag no дополнительный набор слов исключений присутствует ------------------------------------------------------------------ 9.3.5 _____________________________________________ Возможное действие на неопределенную ситуацию 84 Код Зарезервирован для Код Зарезервирован для -1 ABORT -2 ABORT" -3 переполнение стека -4 антипереполнение стека -5 переполнение стека возвратов -6 антипереполнение стека возвратов -7 do-loops вложен слишком глубоко в течение выполнения -8 переполнение словаря -9 неверный адрес памяти -10 деление на нуль -11 результат вне диапазона -12 несоответствие типа параметра -13 неопределенное слово -14 интерпретация слова только для компиляции -15 неверный FORGET -16 попытка использовать строку нулевой длины как name -17 переполнение выходной строки отображаемого числа -18 переполнение анализируемой строки -19 определение name слишком длинное -20 запись в место только для чтения -21 неподдерживаемая операция (например, AT-XY на слишком-примитивном терминале) -22 несоответствие управляющей структуры -23 исключение выравнивания адреса -24 неверный числовой параметр -25 несогласованность стека возвратов -26 недоступные параметры цикла -27 неверная рекурсия -28 пользовательское прерывание -29 вложенность компилятора -30 устаревшая функция -31 >BODY используется не в CREATE определении -32 неверный параметр name (например, TO xxx) -33 исключение блочного чтения -34 исключение блочной записи -35 неверный номер блока -36 неверная позиция файла -37 исключение ввода-вывода файла -38 несуществующий файл -39 неожиданный конец файла -40 неверная BASE для преобразования с плавающей запятой -41 потеря точности -42 деление на ноль с плавающей точкой -43 результат с плавающей точкой вне диапазона -44 переполнение стека с плавающей точкой -45 антипереполнение стека с плавающей точкой -46 неверный параметр с плавающей точкой -47 удаленный список слов компиляции -48 неверный POSTPONE -49 переполнение порядка поиска -50 антипереполнение порядка поиска -51 измененный список слов компиляции -52 переполнение стека потока управления -53 исключение переполнения стека -54 антипереполнение с плавающей точкой -55 неопознанная ошибка с плавающей точкой -56 QUIT -57 исключение при посылке или получении символа -58 исключение [IF], [ELSE], или [THEN] 9.3.6 ____________________ Обработка исключений 85 Есть несколько методов применения CATCH и THROW для использования в других процедурах. Обычные использования - выполнение определений, использование стека возвратов, использование циклов, реализация locals и использование входных источников (то есть, с LOAD, EVALUATE, или INCLUDE-FILE). Когда THROW возвращает управление на CATCH, система должна удалить не только определения, но также и, если присутствует, locals и спецификации входного источника, чтобы возвратить систему к ее надлежащему состоянию для дальнейшего выполнения после CATCH. 9.4 __________________________________________ Дополнительные документационные требования 9.4.1 ______________________ Системная документация 9.4.1.1 ______________________________ Опции определенные реализацией - Значения, используемые в системе 9.6.1.0875 CATCH и 9.6.1.2275 THROW (9.3.1 Значения THROW, 9.3.5 Возможное действие на неопределенную ситуацию). 9.4.1.2 _______________________ Неопределенные ситуации - нет дополнительных требований. 9.4.1.3 _____________________________ Другая системная документация - нет дополнительных требований. 9.4.2 ________________________ Программная документация - нет дополнительных требований. 9.5 _________________________ Соглашение и наименование 9.5.1 _________________ ANS Forth системы Фраза "Предоставляет набор слов исключений" должна быть добавлена к наименованию любой Стандартной системы, которая предоставляет весь набор слов исключений. Фраза "Предоставляет имена из расширения набора слов исключений" должна быть добавлена к наименованию любой Стандартной системы, которая предоставляет часть расширения набора слов исключений. Фраза "Предоставляет расширение набора слов исключений" должна быть добавлена к наименованию любой Стандартной системы, которая предоставляет весь набор слов исключений и расширение набора слов исключений. 9.5.2 ___________________ ANS Forth программы Фраза "Требуется набор слов исключений" должна быть добавлена к наименованию Стандартной программы, которая требует, чтобы система предоставила набор слов исключений. 86 Фраза "Требуются имена из расширения набора слов исключений" должна быть добавлена к наименованию Стандартной программы, которая требует, чтобы система предоставила часть расширения набора слов исключений. Фраза "Требуется расширение набора слов исключений" должна быть добавлена к наименованию Стандартной программы, которая требует, чтобы система предоставила весь набор слов исключений и расширение набора слов исключений. 9.6 _______ Словарь 9.6.1 ________________ Слова Исключений 9.6.1.0875 CATCH EXCEPTION ( i*x xt -- j*x 0 | i*x n ) Помещает структуру исключения на стек исключений, и затем выполняется идентификатор исполнения xt (как с EXECUTE) таким способом, что управление может быть передано в точку сразу после CATCH, если THROW выполнено в течение выполнения xt. Если выполнение xt завершается нормально (то есть, структура исключения помещенная этим CATCH не изъята выполнением THROW) изымает структуру исключения и возвращает ноль на вершине стека данных, выше тех элементов стека которые были бы возвращены xt EXECUTE. Иначе, остаток семантики выполнения определяется THROW. 9.6.1.2275 THROW EXCEPTION ( k*x n -- k*x | i*x n ) Если какие либо биты n ненулевые, выталкивает самую верхнюю структуру исключения со стека исключений, вместе со всем содержимым стека возвратов выше этой структуры. Затем восстанавливает спецификацию входного источника в состояние перед соответствующим CATCH и корректирует состояния всех стеков, определенных этим Стандартом так, чтобы они были те же самые как состояния, сохраненные в структуре исключения (i - то же самое число, что и i во входных параметрах для соответствующего CATCH), помещает n на вершину стека данных, и передает управление на точку сразу после CATCH, которое поместило эту структуру исключения. Если вершина стека - не нулевая и нет никакой структуры исключения на стеке исключения, поведение следующие: Если n - минус-один (-1), исполняет функцию 6.1.0670 ABORT (версия ABORT из основного набора слов), не отображая сообщение. Если n - минус-два, исполняет функцию 6.1.0680 ABORT" (версия ABORT" из основного набора слов), отображая символы ccc связанные с ABORT" которое генерировало THROW. Иначе, система может отображать зависящее-от-реализации сообщение, возвращающее информацию о состоянии связанном с кодом THROW n. Впоследствии система должна выполнить функцию 6.1.0670 ABORT (версия ABORT из основного набора слов). 87 9.6.2 __________________________ Расширения слов исключений 9.6.2.0670 ABORT EXCEPTION EXT Расширьте семантику 6.1.0670 ABORT, таким образом: ( i*x -- ) ( R: j*x -- ) Выполняет функцию -1 THROW. См.: 6.1.0670 ABORT. 9.6.2.0680 ABORT" "abort-quote" EXCEPTION EXT Расширьте семантику 6.1.0680 ABORT" таким образом: Интерпретация: Семантика интерпретации для этого слова не определена. Компиляция: ( "ccc" -- ) Выделяет ccc, ограниченную " (двойная кавычка). Добавляет семантику времени-выполнения данную ниже к текущему определению. Время-выполнения: ( i*x x1 -- | i*x ) ( R: j*x -- | j*x ) Удаляет x1 из стека. Если любой бит x1 - не нулевой, выполняет функцию -2 THROW, отображая ccc, если нет никакой структуры исключения на стеке исключения. См.: 3.4.1 Синтаксический анализ, 6.1.0680 ABORT". 88 10. ___________________________________ Дополнительный сервисный набор слов 10.1 ________ Введение 10.2 ________________________________ Дополнительные термины и нотации Нет. 10.3 _________________________________ Дополнительные условия применения 10.3.1 _______________ Символьные типы Программы, которые используют больше чем семь бит символа 10.6.2.1305 EKEY имеют зависимость от окружения. См.: 3.1.2 Символьные типы. __________________________________________ Таблица 10.1 - Строки запросов к окружению Строка Тип Константа Значение ----------------------------------------------------------------- FACILITY flag no сервисный набор слов присутствует FACILITY-EXT flag no дополнительный сервисный набор слов присутствует ----------------------------------------------------------------- 10.4 __________________________________________ Дополнительные документационные требования 10.4.1 ______________________ Системная документация 10.4.1.1 ______________________________ Опции определенные реализацией - кодирование событий клавиатуры (10.6.2.1305 EKEY); - длительность такта системных часов; - повторяемость ожидаемая от выполнения 10.6.2.1905 MS. 10.4.1.2 _______________________ Неопределенные ситуации - 10.6.1.0742 AT-XY операция не может быть выполнена на пользовательском устройстве вывода. 10.4.1.3 _____________________________ Другая системная документация - нет дополнительных требований. 89 10.4.2 ________________________ Программная документация 10.4.2.1 ________________________ Зависимости от окружения - Использование больше чем семь битов символа в 10.6.2.1305 EKEY. 10.4.2.2 _______________________________ Другая программная документация - нет дополнительных требований. 10.5 _________________________ Соглашение и наименование 10.5.1 _________________ ANS Forth системы Фраза "Предоставляет сервисный набор слов" должна быть добавлена к наименованию любой Стандартной системы, которая предоставляет весь сервисный набор слов. Фраза "Предоставляет имена из расширения сервисного набора слов" должна быть добавлена к наименованию любой Стандартной системы, которая предоставляет часть расширения сервисного набора слов. Фраза "Предоставляет расширение сервисного набора слов" должна быть добавлена к наименованию любой Стандартной системы, которая предоставляет весь сервисный набор слов и расширение сервисного набора слов. 10.5.2 ___________________ ANS Forth программы Фраза "Требуется сервисный набор слов" должна быть добавлена к наименованию Стандартной программы, которая требует, чтобы система предоставила сервисный набор слов. Фраза "Требуются имена из расширения сервисного набора слов" должна быть добавлена к наименованию Стандартной программы, которая требует, чтобы система предоставила часть расширения сервисного набора слов. Фраза "Требуется расширение сервисного набора слов" должна быть добавлена к наименованию Стандартной программы, которая требует, чтобы система предоставила весь сервисный набор слов и расширение сервисного набора слов. 10.6 _______ Словарь 10.6.1 _______________ Сервисные слова 10.6.1.0742 AT-XY "at-x-y" FACILITY ( u1 u2 -- ) Исполняет зависящие-от-реализации шаги так, чтобы следующий отображаемый символ появился в столбце u1, строке u2 пользовательского устройства вывода, верхний левый угол которого - нулевой столбец и нулевая строка. Неопределенная ситуация существует, если операция не может быть выполнена на пользовательском устройстве вывода с определенными параметрами. 90 10.6.1.1755 KEY? "key-question" FACILITY ( -- flag ) Если символ доступен, возвращает true. Иначе, возвращает false. Если не символьные события клавиатуры доступны перед первым допустимым символом, они будут отвергнуты и впоследствии недоступны. Символ должен быть возвращен следующим выполнением KEY. После возвращения KEY? со значением true, последующие выполнения KEY? до выполнения KEY или EKEY также возвращают true, без отмены событий клавиатуры. 10.6.1.2005 PAGE FACILITY ( -- ) Перемещение на другую страницу для вывода. Фактическая функция зависит от устройства вывода. На терминале, PAGE очищает экран и сбрасывает позицию курсора к верхнему левому углу. На принтере, PAGE исполняет прогон страницы. 10.6.2 _________________________ Расширения сервисных слов 10.6.2.1305 EKEY "e-key" FACILITY EXT ( -- u ) Получает одно событие клавиатуры u. Кодирование событий клавиатуры определенное реализацией. См.: 10.6.1.1755 KEY?, 6.1.1750 KEY. 10.6.2.1306 EKEY>CHAR "e-key-to-char" FACILITY EXT ( u -- u false | char true ) Если событие клавиатуры u соответствует символу в наборе символов определенном реализацией, возвращает этот символ и true. Иначе возвращает u и false. 10.6.2.1307 EKEY? "e-key-question" FACILITY EXT ( -- flag ) Если событие клавиатуры доступно, возвращает true. Иначе возвращает false. Событие должно быть возвращено следующим выполнением EKEY. После возвращения EKEY? со значением true, последующее выполнение EKEY? до выполнения KEY, KEY? или EKEY также возвращает true, ссылаясь на то же самое событие. 10.6.2.1325 EMIT? "emit-question" FACILITY EXT ( -- flag ) flag - true, если пользовательское устройство вывода готово принять данные и выполнение EMIT на месте EMIT? не испытывало бы неопределенной задержки. Если состояние устройства не определено, flag - true (? false). 10.6.2.1905 MS FACILITY EXT ( u -- ) Ожидание, по крайней мере, u миллисекунд. 91 Примечание: Фактическая длина и изменчивость периода времени зависят от определенной реализацией разрешающей способности системных часов и других системных и компьютерных характеристик, и находится вне контекста этого Стандарта. 10.6.2.2292 TIME&DATE "time-and-date" FACILITY EXT ( -- +n1 +n2 +n3 +n4 +n5 +n6 ) Возвращает текущее время и дату. +n1 - секунды {0...59}, +n2 минуты {0...59}, +n3 - часы {0...23}, +n4 - день {1...31} +n5 - месяц {1...12}, и +n6 - год (например, 1991). 92 11. __________________________________________ Дополнительный набор слов доступа к файлам 11.1 ________ Введение Эти слова предоставляют доступ к запоминающему устройству в форме "файлов" при следующих допущениях: - файлы предусмотрены базовой операционной системой; - имена файлов представлены как символьные строки; - формат имен файла определен базовой операционной системой; - открытый файл идентифицирован идентификатором файла одна-ячейка (fileid); - информация состояния файла (например, позиция, размер) управляется базовой операционной системой; - к содержанию файла обращаются как к последовательности символов; - операции чтения файла возвращают фактический размер передачи, который может отличиться от требуемого размера передачи. 11.2 ______________________ Дополнительные термины метод доступа к файлу: допустимые средства доступа к файлу, типа "чтения - записи" или "только для чтения". позиция файла: смещение символа от начала файла. входной файл: файл, содержащий последовательность строк, которая является входным источником. 11.3 _________________________________ Дополнительные условия применения 11.3.1 ___________ Типы данных Добавьте таблицу 11.1 к таблице 3.1. __________________________ Таблица 11.1 - Типы данных Символ Тип данных Размер на стеке ---------------------------------------------------------------- ior результат ввода-вывода 1 ячейка fam метод доступа к файлу 1 ячейка fileid идентификатора файла 1 ячейка ---------------------------------------------------------------- 11.3.1.1 ____________________ Идентификаторы файла Идентификаторы файла - это зависящие-от-реализации значения одна-ячейка, которые передаются к файловым операторам для обозначения конкретных файлов. Открытие файла назначает идентификатор файла, который остается действительным до закрытия файла. 11.3.1.2 _______________________ Результаты ввода-вывода Результат ввода-вывода - это числа одна-ячейка, указывающие результат операций ввода-вывода. Значение нуль указывает, что операция ввода-вывода завершилась успешно; другие значения и их смысл - определенное реализацией. Достижение конца файла должно быть сообщено как нуль. 93 Исключение ввода-вывода при выполнении слова доступа к файлу, которое может возвращать результат ввода-вывода не должно вызывать THROW; индикация исключений возвращается в ior. 11.3.1.3 ______________________ Методы доступа к файлу Методы доступа к файлу - это значение одна-ячейка определенное реализацией. 11.3.1.4 ___________ Имена файла Символьная строка, содержащая имя файла. Имя файла может включать зависящий-от- реализации путь имени. Формат имен файла - определенное реализацией. 11.3.2 ______________ Блоки в файлах Если набор слов доступа к файлу реализован, блочный набор слов должен быть реализован. Блоки могут находиться в файлах, но не обязательно. Тогда: - Номера блоков могут быть отображены на один или более файлов средствами определенными реализацией. Неопределенная ситуация существует, если требуемый номер блока в настоящее время не отображен; - Блок, для которого выполнен UPDATE, и который получен из файла, должен быть возвращен назад в тот же самый файл. 11.3.3 ___________________ Запросы к окружению Добавьте таблицу 11.2 к таблице 3.5. См.: 3.2.6 Запросы к окружению. __________________________________________ Таблица 11.2 - Строки запросов к окружению Строка Тип Константа Значение --------------------------------------------------------------------------- FILE flag no файловый набор слов представлен FILE-EXT flag no расширение файлового набора слов представлено --------------------------------------------------------------------------- 11.3.4 ________________ Входной источник Набор слов доступа к файлу создает другой входной источник для текстового интерпретатора. Когда входной источник - текстовый файл, BLK должен содержать нуль, SOURCE-ID должен содержать fileid этого текстового файла, и входной буфер должны содержать одну строку текстового файла. Ввод с INCLUDED, INCLUDE-FILE, LOAD и EVALUATE, должен иметь возможность вложения в любом порядке по крайней мере до восьми уровней. Программа, которая использует больше чем восемь уровней вложения входного файла, имеет зависимость от окружения. См.: 3.3.3.5 Входные буферы, 9. Дополнительный набор слов исключений. 94 11.3.5 ________________________ Другие временные области Список слов использующих память во временных областях расширен, для включения 11.6.1.2165 S". См.: 3.3.3.6 Другие временные области. 11.3.6 _____________________ Синтаксический анализ При синтаксическом анализе из текстового файла, использующего разделитель пробел, управляющие символы должны быть обработаны так же как пробел. Должны поддерживаться строки, по крайней мере, 128 символов. Программа, которая требует строки больше чем 128 символов, имеет зависимость от окружения. Программа может переустанавливать область анализа в пределах входного буфера, управляя содержанием >IN. Более обширное переустановление может быть выполнено, с использованием SAVE-INPUT и RESTORE-INPUT. См.: 3.4.1 Синтаксический анализ. 11.4 __________________________________________ Дополнительные документационные требования 11.4.1 ______________________ Системная документация 11.4.1.1 ______________________________ Опции определенные реализацией - методы доступа к файлу, используемые в 11.6.1.0765 BIN, 11.6.1.1010 CREATE-FILE, 11.6.1.1970 OPEN-FILE, 11.6.1.2054 R/O, 11.6.1.2056 R/W, and 11.6.1.2425 W/O; - файловые исключения; - признак конца строки файла (11.6.1.2090 READ-LINE); - формат имени файла (11.3.1.4 Имена файла); - информация, возвращаемая 11.6.2.1524 FILE-STATUS; - состояние входного файла после исключения (11.6.1.1717 INCLUDE-FILE, 11.6.1.1718 INCLUDED); - ior значения и смысл (11.3.1.2 Результаты ввода-вывода); - максимальная глубина вложенности файлового ввода (11.3.4 Входной источник); - максимальный размер входной строки (11.3.6 Синтаксический анализ); - методы отображения диапазона блоков на файлы (11.3.2 Блоки в файлах); - предусмотренное число строковых буферов (11.6.1.2165 S"); - размер строкового буфера, используемого в 11.6.1.2165 S". 11.4.1.2 _______________________ Неопределенные ситуации - попытка позиционировать файл вне его границ (11.6.1.2142 REPOSITION-FILE); - попытка читать из еще не записанной позиции файла (11.6.1.2080 READ-FILE, 11.6.1.2090 READ-LINE); - fileid неверен (11.6.1.1717 INCLUDE-FILE); - исключение ввода-вывода чтения или закрытия fileid (11.6.1.1717 INCLUDE-FILE, 11.6.1.1718 INCLUDED); 95 - указанный файл не может быть открыт (11.6.1.1718 INCLUDED); - требование не существующего номера блока (11.3.2 Блоки в файлах); - использование 11.6.1.2218 SOURCE-ID, когда 7.6.1.0790 BLK - не нулевой. 11.4.1.3 _____________________________ Другая системная документация - нет дополнительных требований. 11.4.2 ________________________ Программная документация 11.4.2.1 ________________________ Зависимости от окружения - требование строки больше 128 символов (11.3.6 Синтаксический анализ); - использование больше чем восемь уровней вложения входного файла (11.3.4 Входной источник). 11.4.2.2 _______________________________ Другая программная документация - нет дополнительных требований. 11.5 _________________________ Соглашение и наименование 11.5.1 _________________ ANS Forth системы Фраза "Предоставляет набор слов доступа к файлу" должна быть добавлена к наименованию любой Стандартной системы, которая предоставляет весь набор слов доступа к файлу. Фраза "Предоставляет имена из расширения набора слов доступа к файлу" должна быть добавлена к наименованию любой Стандартной системы, которая предоставляет часть расширения набора слов доступа к файлу. Фраза "Предоставляет расширение набора слов доступа к файлу" должна быть добавлена к наименованию любой Стандартной системы, которая предоставляет весь набор слов доступа к файлу и расширение набора слов доступа к файлу. 11.5.2 ___________________ ANS Forth программы Фраза "Требуется набор слов доступа к файлу" должна быть добавлена к наименованию Стандартной программы, которая требует, чтобы система предоставила набор слов доступа к файлу. Фраза "Требуются имена из расширения набора слов доступа к файлу" должна быть добавлена к наименованию Стандартной программы, которая требует, чтобы система предоставила часть расширения набора слов доступа к файлу. Фраза "Требуется расширение набора слов доступа к файлу" должна быть добавлена к наименованию Стандартной программы, которая требует, чтобы система предоставила весь набор слов доступа к файлу и расширение набора слов доступа к файлу. 11.6 _______ Словарь 11.6.1 _____________________ Слова доступа к файлу 96 11.6.1.0080 ( "paren" FILE ( "ccc" -- ) Расширьте семантику 6.1.0080 ( включив: При синтаксическом анализе из текстового файла, если конец области анализа достигнут прежде, чем найдена правая круглая скобка, снова наполняет входной буфер из следующей строки файла, обнуляет >IN, и возобновляет синтаксический анализ, повторяет этот процесс до нахождения правой круглой скобки или достижения конца файла. 11.6.1.0765 BIN FILE ( fam1 -- fam2 ) Изменяет метод доступа к файлу определенный реализацией fam1, дополнительно выбирая "binary", то есть не строко-ориентированный метод доступа к файлу, возвращая метод доступа fam2. См.: 11.6.1.2054 R/O, 11.6.1.2056 R/W, 11.6.1.2425 W/O. 11.6.1.0900 CLOSE-FILE FILE ( fileid -- ior ) Закрывает файл, идентифицированный fileid. ior - определенный реализацией код результата ввода-вывода. 11.6.1.1010 CREATE-FILE FILE ( c-addr u fam -- fileid ior ) Создает файл именованный символьной строкой, определенной c-addr и u, и открывает его с методом доступа к файлу fam. Смысл значений fam является определенным реализацией. Если файл с тем же самым именем уже существует, пересоздает его как пустой файл. Если файл был успешно создан и открыт, ior нулевой, fileid его идентификатор, и файл был позиционирован в начало. Иначе, ior - код результата ввода-вывода определенный реализацией и fileid неопределенное. 11.6.1.1190 DELETE-FILE FILE ( c-addr u -- ior ) Удаляет файл, именованный символьной строкой, определенной c-addr u. ior - определенный реализацией код результата ввода-вывода. 11.6.1.1520 FILE-POSITION FILE ( fileid -- ud ior ) ud - текущая позиция для файла идентифицированного fileid. ior является кодом результата ввода-вывода определенным реализацией. ud не определен если ior является ненулевым. 11.6.1.1522 FILE-SIZE FILE ( fileid -- ud ior ) 97 ud - размер в символах файла, идентифицированного fileid. ior является кодом результата ввода-вывода определенным реализацией. Эта операция не затрагивает значение, возвращаемое FILE-POSITION. ud не определен, если ior ненулевой. 11.6.1.1717 INCLUDE-FILE FILE ( i*x fileid -- j*x ) Удаляет fileid со стека. Сохраняет спецификацию текущего входного источника, включая текущее значение SOURCE-ID. Запоминает fileid в SOURCE-ID. Делает файл определенный fileid входным источником. Записывает нуль в BLK. Другое состояние стека по причине обработанных слов. Повторяет до конца файла: читает строку из файла, заполняет входной буфер содержимым этой строки, обнуляет >IN, и интерпретирует. Текстовая интерпретация начинается в позиции файла, где произошло бы следующее чтение файла. Когда достигнут конец файла, закрывает файл и восстанавливает спецификацию входного источника к ее сохраненному значению. Неопределенная ситуация существует, если fileid неверен, если есть исключение ввода-вывода чтения fileid, или если исключение ввода- вывода происходит при закрытии fileid. Когда неопределенная ситуация существует, состояние (открытый или закрытый) для любых файлов которые интерпретировались - определенное реализацией. См.: 11.3.4 Входной источник. 11.6.1.1718 INCLUDED FILE ( i*x c-addr u -- j*x ) Удаляет c-addr u со стека. Сохраняет спецификацию текущего входного источника, включая текущее значение SOURCE-ID. Открывает файл определенный c-addr u, сохраняет результирующий fileid в SOURCE-ID, и делает его входным источником. Сохраняет нуль в BLK. Другое состояние стека по причине включенных слов. Повторяет до конца файла: читает строку из файла, заполняет входной буфер содержимым этой строки, обнуляет >IN, и интерпретирует. Текстовая интерпретация начинается в позиции файла, где произошло бы следующее чтение файла. Когда достигнут конец файла, закрывает файл и восстанавливает спецификацию входного источника к ее сохраненному значению. Неопределенная ситуация существует, если заданный файл не может быть открыт, если исключение ввода-вывода происходит при чтении файла, или если исключение ввода-вывода происходит при закрытии файла. Когда неопределенная ситуация существует, состояние (открытый или закрытый) любых файлов которые интерпретировались - определенное реализацией. См.: 11.6.1.1717 INCLUDE-FILE. 98 11.6.1.1970 OPEN-FILE FILE ( c-addr u fam -- fileid ior ) Открывает файл заданный символьной строкой определенной c-addr u, с методом доступа к файлу, обозначенным fam. Смысл значений fam определенный реализацией. Если файл успешно открыт, ior нулевой, fam - его идентификатор, и файл был позиционирован начало. Иначе, ior - код результата ввода-вывода определенный реализацией и fam неопределенное. 11.6.1.2054 R/O "r-o" FILE ( -- fam ) fam - значение определенное реализацией для выбора метода доступа к файлу "только для чтения". См.: 11.6.1.1010 CREATE-FILE, 11.6.1.1970 OPEN-FILE. 11.6.1.2056 R/W "r-w" FILE ( -- fam ) fam - значение определенное реализацией для выбора метода доступа к файлу "чтение - запись". См.: 11.6.1.1010 CREATE-FILE, 11.6.1.1970 OPEN-FILE. 11.6.1.2080 READ-FILE FILE ( c-addr u1 fileid -- u2 ior ) Читает u1 последовательных символов в c-addr с текущей позиции файла, идентифицированного fileid. Если u1 символы читаются без исключения, ior нулевое, и u2 равно u1. Если конец файла достигнут, прежде прочтения u1 символов, ior нуль и u2 - число фактически прочитанных символов. Если операция инициализирована когда значение, возвращенное FILE- POSITION равно значению, возвращенному FILE-SIZE для файла идентифицированного fileid - ior нулевое, и u2 нулевое. Если происходит исключение, ior - код результата ввода-вывода определенный реализацией, и u2 - число символов переданное в c- addr без исключения. Неопределенная ситуация существует, если операция инициализирована когда значение, возвращенное FILE-POSITION большее чем значение, возвращенное FILE-SIZE для файла, идентифицированного fileid, или если требуемая операция пытается читать не записанные части файла. 99 При завершении операции, FILE-POSITION возвращает следующую позицию файла после последнего прочтенного символа. 11.6.1.2090 READ-LINE FILE ( c-addr u1 fileid -- u2 flag ior ) Читает следующую строку из файла, определенного fileid в память с адреса c-addr. Читаются максимум u1 символов. До двух символов завершения строки определенных реализацией могут читаться в память в конец строки, но не включаются в количество u2. Буфер строки, предусмотренный c-addr должен быть, по крайней мере, длиной u1+2 символов. Если операция успешная, flag - true, и ior нулевой. Если признак конца строки был получен прежде прочтения символов u1, тогда фактически читается u2-число символов, не включая признак конца строки(0 <= u2 <= u1). Когда u1 = u2, признак конца строки должен все же быть достигнут. Если операция инициализирована когда значение, возвращенное FILE- POSITION равно значению, возвращенному FILE-SIZE для файла, идентифицированного fileid, flag - false, ior нулевое, и u2 нулевое. Если ior ненулевое, в течение операции произошло исключение, и ior - определенный реализацией код завершения ввода- вывода. Неопределенная ситуация существует, если операция инициализирована когда значение, возвращенное FILE-POSITION больше чем значение, возвращенное FILE-SIZE для файла, идентифицированного fileid, или если требуемая операция пытается читать не записанные части файла. При завершении операции, FILE-POSITION возвращает следующую позицию файла после последнего прочтенного символа. 11.6.1.2142 REPOSITION-FILE FILE ( ud fileid -- ior ) Переустанавливает позицию файла, идентифицированного fileid на ud. ior - код завершения ввода-вывода определенный реализацией. Неопределенная ситуация существует если файл позиционирован вне границ файла. При завершении операции, FILE-POSITION возвращает значение ud. 11.6.1.2147 RESIZE-FILE FILE ( ud fileid -- ior ) Устанавливает размер файла, идентифицированного fileid на ud. ior - код завершения ввода-вывода определенный реализацией. Если результирующий файл больше чем файл перед операцией, часть файла добавленного в результате операции могла бы быть не записана. При завершении операции, FILE-SIZE возвращает значение ud и FILE- POSITION возвращает неопределенное значение. 100 См.: 11.6.1.2080 READ-FILE, 11.6.1.2090 READ-LINE. 11.6.1.2165 S" "s-quote" FILE Расширьте семантику 6.1.2165 S" так: Интерпретация: ( "ccc" -- c-addr u ) Выделяет ccc, ограниченную " (двойная кавычка). Сохраняет результирующую строку c-addr u во временном местоположении. Максимальная длина временного буфера зависящая-от-реализаци, но должна быть не меньше чем 80 символов. Последующие использования S" могут перезаписывать временный буфер. По крайней мере, один такой буфер должен быть предусмотрен. Компиляция: ( "ccc" -- ) Выделяет ccc, ограниченную " (двойная кавычка). Добавляет семантику времени-выполнения данную ниже к текущему определению. Время-выполнения: ( -- c-addr u ) Возвращает c-addr и u, которые описывают строку, состоящую из символов ccc. См.: 3.4.1 Синтаксический анализ, 6.2.0855 C", 6.1.2165 S", 11.3.5 Другие временные области. 11.6.1.2218 SOURCE-ID "source-i-d" FILE ( -- 0 | -1 | fileid ) Расширьте 6.2.2218 SOURCE-ID, чтобы включить ввод текстового файла следующим образом: SOURCE-ID Входной источник -------------------------------------------- fileid Текстовый файл "fileid" -1 Строка (через EVALUATE) 0 Пользовательское устройство ввода -------------------------------------------- Неопределенная ситуация существует, если SOURCE-ID используется, когда BLK содержит ненулевое значение. 11.6.1.2425 W/O "w-o" FILE ( -- fam ) fam - значение определенное реализацией для выбора метода доступа к файлу "только запись". См.: 11.6.1.1010 CREATE-FILE, 11.6.1.1970 OPEN-FILE. 11.6.1.2480 WRITE-FILE FILE ( c-addr u fileid -- ior ) Записывает u символов из c-addr в файл, идентифицированный fileid начиная с его текущей позиции. ior - определенный реализацией код результата ввода-вывода. 101 При завершении операции, FILE-POSITION возвращает следующую позицию файла после последнего символа записанного в файл, и FILE-SIZE возвращает значение большее или равное значению возвращенному FILE- POSITION. См.: 11.6.1.2080 READ-FILE, 11.6.1.2090 READ-LINE. 11.6.1.2485 WRITE-LINE FILE ( c-addr u fileid -- ior ) Записывает u символов из c-addr, сопровождаемых зависящим-от- реализации признаком конца строки в файл, идентифицированный fileid начиная с его текущей позиции. ior - определенный реализацией код результата ввода-вывода. При завершении операции, FILE-POSITION возвращает следующую позицию файла после последнего символа записанного в файл, и FILE-SIZE возвращает значение большее или равное значению возвращенному FILE- POSITION. См.: 11.6.1.2080 READ-FILE, 11.6.1.2090 READ-LINE. 11.6.2 _______________________________ Расширения слов доступа к файлу 11.6.2.1524 FILE-STATUS FILE EXT (c-addr u -- x ior ) Возвращает состояние файла, идентифицированного символьной строкой c-addr u. Если файл существует, ior нулевой; иначе ior - код завершения ввода-вывода определенный реализацией. x содержит определенную реализацией информацию о файле. 11.6.2.1560 FLUSH-FILE FILE EXT ( fileid -- ior ) Пытается инициировать запись на запоминающее устройство любую буферизированную информацию, записанную в файл, относящийся к fileid, и информация о размере файла будет записана в каталоге хранения при изменении. Если операция успешна, ior нулевой. Иначе, это - код завершения ввода-вывода определенный реализацией. 11.6.2.2125 REFILL FILE EXT ( -- flag ) Расширьте семантику выполнения 6.2.2125 REFILL следующим: Когда входной источник - текстовый файл, пытается читать следующую строку из текстового входного файла. Если успешно, делает результат текущим входным буфером, обнуляет >IN, и возвращает true. Иначе возвращает false. См.: 6.2.2125 REFILL, 7.6.2.2125 REFILL. 11.6.2.2130 RENAME-FILE FILE EXT ( c-addr1 u1 c-addr2 u2 -- ior ) 102 Переименовывает файл, именованный символьной строкой c-addr1 u1 в имя из символьной строки c-addr2 u2. ior - код завершения ввода- вывода определенный реализацией. 103 12. _____________________________________________ Дополнительный набор слов для плавающей точки 12.1 ________ Введение 12.2 ________________________________ Дополнительные термины и нотация 12.2.1 ____________________ Определение терминов С-плавающей-точкой-выровненный адрес: Адрес ячейки памяти, к которой можно обращаться как к числу с плавающей точкой. Двойной-с-плавающей-точкой-выровненный адрес: Адрес ячейки памяти, к которой можно обращаться как к 64 бит IEEE числу с плавающей точкой двойной точности. Одинарный-с-плавающей-точкой-выровненный адрес: Адрес ячейки памяти, к которой можно обращаться как к 32 бит IEEE числу с плавающей точкой одинарной точности. Число с плавающей точкой IEEE: Число с плавающей точкой одинарной или двойной точности, как определено в ANSI/IEEE 754-1985. 12.2.2 _______ Нотация 12.2.2.1 ________________ Числовая нотация Следующая нотация используется для определения синтаксиса внешнего представления числа с плавающей точкой: - Каждый компонент числа с плавающей точкой определен правилом, состоящим из имени компонента (выделенного курсивом в угловых скобках, например, <знак>), символов := и связанных лексем и метасимволов; - Лексемы могут быть литеральными символами (полужирным шрифтом, например, E) или правильными именами в угловых скобках (например, <цифра>); - Метасимвол * используется, чтобы определить нуль или большее количество появлений предшествующей лексемы (например, *); - Лексемы заключенные в [ и ] необязательные (например, [<знак>]); - Вертикальные линии отделяют выборы из списка лексем заключенных в фигурные скобки (например{ + | - }). 12.2.2.2 ________________ Стековая нотация Когда стек с плавающей точкой отделен от стека данных - стековая нотация с плавающей точкой такая: ( F: before -- after ) 12.3 _________________________________ Дополнительные условия применения 12.3.1 ___________ Типы данных Добавьте таблицу 12.1 к таблице 3.1. 104 __________________________ Таблица 12.1 - Типы данных Символ Тип данных Размер на стеке ------------------------------------------------------------------------- r числа с плавающей точкой определенное реализацией f-addr с-плавающей-точкой 1 ячейка выровненный адрес sf-addr одинарный-с-плавающей-точкой 1 ячейка выровненный адрес df-addr двойной-с-плавающей-точкой 1 ячейка выровненный адрес ------------------------------------------------------------------------- 12.3.1.1 ______ Адреса Набор с-плавающей-точкой-выровненных адресов - подмножество определенного реализацией набора выровненных адресов. Добавление размера числа с плавающей точкой к с-плавающей-точкой-выровненному адресу должно производить с-плавающей- точкой-выровненный адрес. Набор двойных-с-плавающей-точкой-выровненных адресов - подмножество определенного реализацией набора выровненных адресов. Добавление размера 64-бит IEEE числа с плавающей точкой двойной точности к двойному-с-плавающей-точкой- выровненному адресу должно произвести двойной-с-плавающей-точкой-выровненный адрес. Набор одинарных-с-плавающей-точкой-выровненных адресов - подмножество определенного реализацией набора выровненных адресов. Добавление размера 32-бит IEEE числа с плавающей точкой одинарной точности к одинарному-с-плавающей- точкой-выровненному адресу должно произвести одинарный-с-плавающей-точкой- выровненный адрес. 12.3.1.2 ________________________ Числа с плавающей точкой Внутреннее представление числа с плавающей точкой включая формат и точность мантиссы и формат и диапазон экспоненты, является определенным реализацией. Любое округление или усечение чисел с плавающей точкой - определенное реализацией. 12.3.2 ___________________________ Операции c плавающей точкой "Округление к ближайшему" означает округление результата операции с плавающей точкой к представимому значению ближайшему к результату. Если два ближайших представимых значения одинаково близки к результату, должен быть представлен тот, наименьший значащий бит которого нулевой. "Округление к отрицательной бесконечности" означает округление результата операции с плавающей точкой к представимому значению ближайшему и не большему чем результат. 12.3.3 _______________________ Стек с плавающей точкой Последний пришел, первым ушел список, который должен использоваться всеми операторами с плавающей точкой. Размер стека с плавающей точкой - определенный реализацией. По умолчанию стек с плавающей точкой должен быть отделен от стека данных и стека возвратов. Программа может определять, располагаются ли числа с плавающей точкой на стеке данных, посылая строку "FLOATING-STACK" в ENVIRONMENT?. 105 Размер стека с плавающей точкой должен быть, по крайней мере 6 элементов. Программа, которая зависит от стека с плавающей точкой, являющегося большим чем 6 элементов, имеет зависимость от окружения. 12.3.4 ___________________ Запросы к окружению Добавьте таблицу 12.2 к таблице 3.5. См.: 3.2.6 Запросы к окружению. __________________________________________ Таблица 12.2 - Строки запросов к окружению Строка Тип Константа Значение --------------------------------------------------------------------------- FLOATING flag no набор слов с плавающей точкой представлен FLOATING-EXT flag no расширенный набор слов с плавающей точкой представлен FLOATING-STACK n yes если n = нуль, числа с плавающей точкой располагаются на стеке данных; иначе n ¦ максимальная глубина отделенного стека с плавающей точкой MAX-FLOAT r yes самое большое пригодное для использования число с плавающей точкой --------------------------------------------------------------------------- 12.3.5 ___________________ Выравнивание адреса Так как адрес возвращенный словом созданным CREATE не обязательно выровнен для любой части класса данных с плавающей точкой, программа должна выровнять адрес (чтобы он был выровненным: с плавающей точкой, одинарным-с-плавающей-точкой, или двойным-с-плавающей-точкой) перед доступом по адресу к данным с плавающей точкой. См.: 3.3.3.1 Выравнивание адреса, 12.3.1.1 Адреса. 12.3.6 __________ Переменные Программа может адресовать память в зонах областей данных, сделанных доступными с помощью FVARIABLE. Эти области могут быть несмежными участками с зонами последовательно распределенными с помощью , (запятой) или ALLOT. См.: 3.3.3.3 Переменные. 12.3.7 ______________________________________________________ Преобразование входных чисел текстового интерпретатора Если набор слов с плавающей точкой присутствует в словаре, и текущее основание DECIMAL, входной алгоритм преобразования чисел должен быть расширен для распознавания чисел с плавающей точкой в такой форме: Преобразуемая строка := <мантисса><экспонента> <мантисса> := [<знак>]<цифры>[.<цифры0>] <экспонента> := E[<знак>]<цифры0> <знак> := { + | - } <цифры> := <цифра><цифры0> 106 <цифры0> := <цифра>* <цифра> := { 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 } Это - примеры допустимых представлений чисел с плавающей точкой в источнике программы: 1E 1.E 1.E0 +1.23E-1 -1.23E+1 См.: 3.4.1.3 Преобразование входных чисел текстового интерпретатора, 12.6.1.0558 >FLOAT. 12.4 __________________________________________ Дополнительные документационные требования 12.4.1 ______________________ Системная документация 12.4.1.1 ______________________________ Опции определенные реализацией - формат и диапазон чисел с плавающей точкой (12.3.1 Типы данных, 12.6.1.2143 REPRESENT); - результат 12.6.1.2143 REPRESENT, когда число с плавающей точкой находится вне диапазона; - округление или усечение чисел с плавающей точкой (12.3.1.2 Числа с плавающей точкой); - размер стека с плавающей точкой (12.3.3 Стек с плавающей точкой); - ширина стека с плавающей точкой (12.3.3 Стек с плавающей точкой). 12.4.1.2 _______________________ Неопределенные ситуации - DF@ или DF! используется с адресом, который - не выровнен как двойной-с-плавающей-точкой; - F@ или F! используется с адресом, который - не выровнен как с плавающей точкой; - результат с плавающей точкой вне диапазона (например, в 12.6.1.1430 F/); - SF@ или SF! используется с адресом, который - не выровнен как единственный-с-плавающей-точкой; - BASE - не десятичная (12.6.1.2143 REPRESENT, 12.6.2.1427 F., 12.6.2.1513 FE., 12.6.2.1613 FS.); - оба параметра равняются нулю (12.6.2.1489 FATAN2); - косинус параметра нулевой для 12.6.2.1625 FTAN; - d точно не может быть представлено как число с плавающей точкой в 12.6.1.1130 D>F; - деление на нуль (12.6.1.1430 F/); - экспонента слишком большая для преобразования (12.6.2.1203 DF!, 12.6.2.1204 DF@, 12.6.2.2202 SF!, 12.6.2.2203 SF@); - число с плавающей точкой меньше чем один (12.6.2.1477 FACOSH); - число с плавающей точкой меньше чем или равно минус-один (12.6.2.1554 FLNP1); - число с плавающей точкой меньше чем или равно нулю (12.6.2.1553 FLN, 12.6.2.1557 FLOG); - число с плавающей точкой меньше чем нуль (12.6.2.1487 FASINH, 12.6.2.1618 FSQRT); - модуль числа с плавающей точкой больше чем один (12.6.2.1476 FACOS, 12.6.2.1486 FASIN, 12.6.2.1491 FATANH); - целая часть числа с плавающей точкой не может быть представлена как d в 12.6.1.1470 F>D; - строка больше чем область вывода отображаемого числа (12.6.2.1427 F., 12.6.2.1513 FE., 12.6.2.1613 FS.). 12.4.1.3 _____________________________ Другая системная документация - нет дополнительных требований. 107 12.4.2 ________________________ Программная документация 12.4.2.1 ________________________ Зависимости от окружения - требование стека с плавающей точкой большего чем 6 элементов (12.3.3 Стек с плавающей точкой). 12.4.2.2 _______________________________ Другая программная документация - нет дополнительных требований. 12.5.1 _________________ ANS Forth системы Фраза "Предоставляет набор слов с плавающей точкой" должна быть добавлена к наименованию любой Стандартной системы, которая предоставляет весь набор слов с плавающей точкой. Фраза "Предоставляет имена из расширения набора слов с плавающей точкой" должна быть добавлена к наименованию любой Стандартной системы, которая предоставляет часть расширения набора слов с плавающей точкой. Фраза "Предоставляет расширение набора слов с плавающей точкой" должна быть добавлена к наименованию любой Стандартной системы, которая предоставляет весь набор слов с плавающей точкой и расширение набора слов с плавающей точкой. 12.5.2 ___________________ ANS Forth программы Фраза "Требуется набор слов с плавающей точкой" должна быть добавлена к наименованию Стандартной программы, которая требует, чтобы система предоставила набор слов с плавающей точкой. Фраза "Требуются имена из расширения набора слов с плавающей точкой" должна быть добавлена к наименованию Стандартной программы, которая требует, чтобы система предоставила часть расширения набора слов с плавающей точкой. Фраза "Требуется расширение набора слов с плавающей точкой" должна быть добавлена к наименованию Стандартной программы, которая требует, чтобы система предоставила весь набор слов с плавающей точкой и расширение набора слов с плавающей точкой. 12.6 _______ Словарь 12.6.1 ________________________ Слова с плавающей точкой 12.6.1.0558 >FLOAT "to-float" FLOATING ( c-addr u -- true | false ) ( F: -- r | ) или ( c-addr u -- r true | false ) Пытается выполнить преобразование строки определенной c-addr и u во внутреннее представление с плавающей точкой. Если строка представляет допустимое число с плавающей точкой в синтаксисе ниже, возвращает его значение r и true. Если строка не представляет допустимое число с плавающей точкой, возвращает только false. 108 Строка пробелов должна быть обработана как специальный случай представления нуля. Синтаксис преобразуемой строки := <мантисса>[<экспонента>] <мантисса> := [<знак>]{<цифры>[.<цифры0>] | .<цифры> } <экспонента> := <маркер><цифры0> <маркер> := { | <знак-форма>} := [<знак-форма>] <знак-форма> := { + | - } := { D | d | E | e } 12.6.1.1130 D>F "d-to-f" FLOATING ( d -- ) ( F: -- r ) or ( d -- r ) r - число с плавающей точкой эквивалентное d. Неопределенная ситуация существует если d точно не может быть представлено как значение с плавающей точкой. 12.6.1.1400 F! "f-store" FLOATING ( f-addr -- ) ( F: r -- ) or ( r f-addr -- ) Сохраняет r в f-addr. 12.6.1.1410 F* "f-star" FLOATING ( F: r1 r2 -- r3 ) or ( r1 r2 -- r3 ) Умножает r1 на r2, возвращает r3. 12.6.1.1420 F+ "f-plus" FLOATING ( F: r1 r2 -- r3 ) or ( r1 r2 -- r3 ) Прибавляет r1 к r2, возвращает сумму r3. 12.6.1.1425 F- "f-minus" FLOATING ( F: r1 r2 -- r3 ) or ( r1 r2 -- r3 ) Вычитает r2 из r1, возвращает r3. 12.6.1.1430 F/ "f-slash" FLOATING ( F: r1 r2 -- r3 ) or ( r1 r2 -- r3 ) Делит r1 на r2, возвращает частное r3. Неопределенная ситуация существует если r2 нулевое, или частное находится вне диапазона числа с плавающей точкой. 12.6.1.1440 F0< "f-zero-less-than" FLOATING ( -- flag ) ( F: r -- ) or ( r -- flag ) flag - true, если и только если r - меньше чем нуль. 12.6.1.1450 F0= "f-zero-equals" FLOATING ( -- flag ) ( F: r -- ) or ( r -- flag ) flag - true, если и только если r - равно нулю. 12.6.1.1460 F< "f-less-than" FLOATING ( -- flag ) ( F: r1 r2 -- ) or ( r1 r2 -- flag ) flag - true, если и только если r1 - меньше чем r2. 109 12.6.1.1470 F>D "f-to-d" FLOATING ( -- d ) ( F: r -- ) or ( r -- d ) d - целое число со знаком две-ячейки эквивалентное целой части из r. Дробная часть r откинута. Неопределенная ситуация существует, если целая часть r точно не может быть представлена как целое число со знаком две-ячейки. 12.6.1.1472 F@ "f-fetch" FLOATING ( f-addr -- ) ( F: -- r ) or ( f-addr -- r ) r - значение, сохраненное в f-addr. 12.6.1.1479 FALIGN "f-align" FLOATING ( -- ) Если указатель области данных - не выровнен с плавающей точкой, резервирует достаточно пространства данных для выравнивания. 12.6.1.1483 FALIGNED "f-aligned" FLOATING ( addr -- f-addr ) f-addr - первый с-плавающей-точкой-выровненный адрес больший или равный addr. 12.6.1.1492 FCONSTANT "f-constant" FLOATING ( "name" -- ) ( F: r -- ) or ( r "name" -- ) Пропускает ведущие разделители пробелы. Выделяет name, ограниченное пробелом. Создает определение для name с семантикой выполнения определенной ниже. name объявлено как "f-constant". name Выполнение: ( -- ) ( F: -- r ) or ( -- r ) Помещает r на стек с плавающей точкой. См.: 3.4.1 Синтаксический анализ. 12.6.1.1497 FDEPTH "f-depth" FLOATING ( -- +n ) +n - число значений, содержащихся на отделенном по умолчанию стеке с плавающей точкой. Если числа с плавающей точкой сохраняются на стеке данных, +n является текущим числом возможных значений с плавающей точкой, содержащихся на стеке данных. 12.6.1.1500 FDROP "f-drop" FLOATING ( F: r -- ) or ( r -- ) Удаляет r со стека с плавающей точкой. 12.6.1.1510 FDUP "f-dupe" FLOATING ( F: r -- r r ) or ( r -- r r ) Дублирует r. 12.6.1.1552 FLITERAL "f-literal" FLOATING Интерпретация: Семантика интерпретации для этого слова не определена. 110 Компиляция: ( F: r -- ) or ( r -- ) Добавляет семантику времени-выполнения, данную ниже к текущему определению. Время-выполнения: ( F: -- r ) or ( -- r ) Помещает r на стек с плавающей точкой. 12.6.1.1555 FLOAT+ "float-plus" FLOATING ( f-addr1 -- f-addr2 ) Добавляет размер в адресуемых элементах числа с плавающей точкой к f-addr1, возвращает f-addr2. 12.6.1.1556 FLOATS FLOATING ( n1 -- n2 ) n2 - размер в адресуемых элементах n1 чисел с плавающей точкой. 12.6.1.1558 FLOOR FLOATING ( F: r1 -- r2 ) or ( r1 -- r2 ) Округление r1 к целому значению, использующему правило "округления к отрицательной бесконечности", возвращает r2. 12.6.1.1562 FMAX "f-max" FLOATING ( F: r1 r2 -- r3 ) or ( r1 r2 -- r3 ) r3 большее из r1 и r2. 12.6.1.1565 FMIN "f-min" FLOATING ( F: r1 r2 -- r3 ) or ( r1 r2 -- r3 ) r3 меньшее из r1 и r2. 12.6.1.1567 FNEGATE "f-negate" FLOATING ( F: r1 -- r2 ) or ( r1 -- r2 ) r2 - отрицание r1. 12.6.1.1600 FOVER "f-over" FLOATING ( F: r1 r2 -- r1 r2 r1 ) or ( r1 r2 -- r1 r2 r1 ) Помещает копию r1 на вершину стека с плавающей точкой. 12.6.1.1610 FROT "f-rote" FLOATING ( F: r1 r2 r3 -- r2 r3 r1 ) or ( r1 r2 r3 -- r2 r3 r1 ) Вращает три верхних элемента стека с плавающей точкой. 12.6.1.1612 FROUND "f-round" FLOATING ( F: r1 -- r2 ) or ( r1 -- r2 ) Округляет r1 к целому значению, использующему правило "округления к ближайшему", возвращает r2. См.: 12.3.2 Операции c плавающей точкой. 12.6.1.1620 FSWAP "f-swap" FLOATING ( F: r1 r2 -- r2 r1 ) or ( r1 r2 -- r2 r1 ) Меняет два верхних элемента стека с плавающей точкой. 111 12.6.1.1630 FVARIABLE "f-variable" FLOATING ( "name" -- ) Пропускает ведущие разделители пробелы. Выделяет name, ограниченное пробелом. Создает определение для name с семантикой выполнения определенной ниже. Резервирует 1 FLOATS адресуемый элемент области данных как с-плавающей-точкой-выровненный адрес. name объявлено как "f-variable". name Выполнение: ( --f-addr ) f-addr - адрес области данных, зарезервированной FVARIABLE когда оно создавало name. Программа ответственна за инициализацию содержимого зарезервированного пространства. См.: 3.4.1 Синтаксический анализ. 12.6.1.2143 REPRESENT FLOATING ( c-addr u -- n flag1 flag2 ) (F: r -- ) или ( r c-addr u -- n flag1 flag2 ) В c-addr, помещает символьное-строковое внешнее представление мантиссы числа с плавающей точкой r. Возвращает n как экспоненту в десятичном основании, знак как flag1 и "допустимый результат" как flag2. Символьная строка должна состоять из u самых старших цифр мантиссы представленной как десятичная дробь с подразумеваемой десятичной точкой слева от первой цифры, и нулевой первой цифрой только если все цифры нулевые. Мантисса округлена к u цифрам в соответствии с правилом "округления к ближайшему"; n откорректирован, в случае необходимости, чтобы соответствовать округленной величине мантиссы. Если flag2 - true тогда r было в диапазоне определенных реализацией чисел с плавающей точкой. Если flag1 - true тогда r - отрицательное. Неопределенная ситуация существует, если значение BASE - не десятичное десять. Когда flag2 - false, n и flag1 - определенное реализацией, как содержимое c-addr. При этих обстоятельствах, строка в c-addr должна состоять из графических символов. См.: 3.2.1.2 Преобразование цифр, 6.1.0750 BASE, 12.3.2 Операции c плавающей точкой. 12.6.2 __________________________________ Расширение слов с плавающей точкой 12.6.2.1203 DF! "d-f-store" FLOATING EXT ( df-addr -- ) ( F: r -- ) or ( r df-addr -- ) Сохраняет число с плавающей точкой r в df-addr как 64-бит IEEE число с двойной точностью. Если мантисса внутреннего представления r имеет большую точность, чем IEEE формат с двойной точностью, оно должно быть округлено, используя правило "округления к ближайшему". Неопределенная ситуация существует, если экспонента r слишком большая, для размещения в IEEE формате с двойной точностью. 112 См.: 12.3.1.1 Адреса, 12.3.2 Операции c плавающей точкой. 12.6.2.1204 DF@ "d-f-fetch" FLOATING EXT ( df-addr -- ) ( F: -- r ) or ( df-addr -- r ) Выбирает 64-бит IEEE число с двойной точностью, сохраненное в df- addr на стек с плавающей точкой как r во внутреннем представлении. Если IEEE мантисса с двойной точностью имеет большую точность, чем внутреннее представление, оно будет округлено к внутреннему представлению, используя правило "округления к ближайшему". Неопределенная ситуация существует если экспонента IEEE представления с двойной точностью слишком большая, для размещения во внутреннем представлении. См.: 12.3.1.1 Адреса, 12.3.2 Операции c плавающей точкой. 12.6.2.1205 DFALIGN "d-f-align" FLOATING EXT ( -- ) Если указатель области данных - выровнен не на двойное-с-плавающей- точкой, резервирует достаточно пространства данных для выравнивания. См.: 12.3.1.1 Адреса. 12.6.2.1207 DFALIGNED "d-f-aligned" FLOATING EXT ( addr -- df-addr ) df-addr - первый двойное-с-плавающей-точкой-выровненный адрес больший или равный addr. См.: 12.3.1.1 Адреса. 12.6.2.1208 DFLOAT+ "d-float-plus" FLOATING EXT ( df-addr1 -- df-addr2 ) Добавляет размер в адресуемых элементах 64-бит IEEE числа с двойной точностью к df-addr1, возвращает df-addr2. См.: 12.3.1.1 Адреса. 12.6.2.1209 DFLOATS "d-floats" FLOATING EXT ( n1 -- n2 ) n2 - размер в адресуемых элементах n1 64-бит IEEE числа с двойной точностью. 12.6.2.1415 F** "f-star-star" FLOATING EXT ( F: r1 r2 -- r3 ) or ( r1 r2 -- r3 ) Возводит r1 в степень r2, возвращает результат r3. 12.6.2.1427 F. "f-dot" FLOATING EXT ( -- ) ( F: r -- ) or ( r -- ) Отображает с конечным пробелом верхнее число со стека с плавающей точкой, используя нотацию с фиксированной точкой: [-] <цифры>.<цифры0> 113 Неопределенная ситуация существует, если значение BASE - не (десятичное) десять или если символьное строковое представление превышает размер буфера выходной строки отображаемого числа. См.: 12. 12.6.1.0558 >FLOAT. 12.6.2.1474 FABS "f-abs" FLOATING EXT ( F: r1 -- r2 ) or ( r1 -- r2 ) r2 - абсолютное значение r1. 12.6.2.1476 FACOS "f-a-cos" FLOATING EXT ( F: r1 -- r2 ) or ( r1 -- r2 ) r2 - главный угол в радианах, чей косинус - r1. Неопределенная ситуация существует, если |r1| больше единицы. 12.6.2.1477 FACOSH "f-a-cosh" FLOATING EXT ( F: r1 -- r2 ) or ( r1 -- r2 ) r2 - значение с плавающей точкой, чей гиперболический косинус - r1. Неопределенная ситуация существует, если r1 - меньше единицы. 12.6.2.1484 FALOG "f-a-log" FLOATING EXT ( F: r1 -- r2 ) or ( r1 -- r2 ) Возводит десять в степень r1, возвращает r2. 12.6.2.1486 FASIN "f-a-sine" FLOATING EXT ( F: r1 -- r2 ) or ( r1 -- r2 ) r2 - главный угол в радианах, чей синус - r1. Неопределенная ситуация существует, если |r1| больше единицы. 12.6.2.1487 FASINH "f-a-cinch" FLOATING EXT ( F: r1 -- r2 ) or ( r1 -- r2 ) r2 - значение с плавающей точкой, чей гиперболический синус - r1. Неопределенная ситуация существует, если r1 - меньше единицы. 12.6.2.1488 FATAN "f-a-tan" FLOATING EXT ( F: r1 -- r2 ) or ( r1 -- r2 ) r2 - главный угол в радианах, чей тангенс - r1. 12.6.2.1489 FATAN2 "f-a-tan-two" FLOATING EXT ( F: r1 r2 -- r3 ) or ( r1 r2 -- r3 ) r3 - угол в радианах, чей тангенс - r1/r2. Неопределенная ситуация существует, если r1 и r2 нулевые. 12.6.2.1491 FATANH "f-a-tan-h" FLOATING EXT ( F: r1 -- r2 ) or ( r1 -- r2 ) r2 - значение с плавающей точкой, чей гиперболический тангенс - r1. Неопределенная ситуация существует, если r1 - вне диапазона с -1E0 по 1E0. 114 12.6.2.1493 FCOS "f-cos" FLOATING EXT ( F: r1 -- r2 ) or ( r1 -- r2 ) r2 - косинус угла r1 в радианах. 12.6.2.1494 FCOSH "f-cosh" FLOATING EXT ( F: r1 -- r2 ) or ( r1 -- r2 ) r2 - гиперболический косинус r1. 12.6.2.1513 FE. "f-e-dot" FLOATING EXT ( -- ) ( F: r -- ) or ( r -- ) Отображает с конечным пробелом верхнее число со стека с плавающей точкой используя инженерную нотацию, где мантисса больше или равна 1.0 и меньше чем 1000.0 и десятичная экспонента - множитель трех. Неопределенная ситуация существует, если значение BASE - не (десятичное) десять или если символьное строковое представление превышает размер буфера выходной строки отображаемого числа. См.: 6.1.0750 BASE, 12.3.2 Операции c плавающей точкой, 12.6.1.2143 REPRESENT. 12.6.2.1515 FEXP "f-e-x-p" FLOATING EXT ( F: r1 -- r2 ) or ( r1 -- r2 ) Возводит e в степень r1, возвращает r2. 12.6.2.1516 FEXPM1 "f-e-x-p-m-one" FLOATING EXT ( F: r1 -- r2 ) or ( r1 -- r2 ) Возводит e в степень r1, и вычитает один, возвращает r2. 12.6.2.1553 FLN "f-l-n" FLOATING EXT ( F: r1 -- r2 ) or ( r1 -- r2 ) r2 - натуральный логарифм r1. Неопределенная ситуация существует если r1 - меньше или равно нулю. 12.6.2.1554 FLNP1 "f-l-n-p-one" FLOATING EXT ( F: r1 -- r2 ) or ( r1 -- r2 ) r2 - натуральный логарифм величины r1 плюс один. Неопределенная ситуация существует если r1 - меньше или равно минус один. 12.6.2.1557 FLOG "f-log" FLOATING EXT ( F: r1 -- r2 ) or ( r1 -- r2 ) r2 - десятичный логарифм r1. Неопределенная ситуация существует если r1 меньше или равно нулю. 12.6.2.1613 FS. "f-s-dot" FLOATING EXT ( -- ) ( F: r -- ) or ( r -- ) Отображает, с конечным пробелом, верхнее число со стека с плавающей точкой в экспоненциальном формате: 115 <мантисса><экспонента> где: <мантисса> := [-]<цифра>.<цифры0> <экспонента> := E[-]<цифры> Неопределенная ситуация существует, если значение BASE - не (десятичное) десять или если символьное строковое представление превышает размер буфера выходной строки отображаемого числа. См.: 6.1.0750 BASE, 12.3.2 Операции c плавающей точкой, 12.6.1.2143 REPRESENT. 12.6.2.1614 FSIN "f-sine" FLOATING EXT ( F: r1 -- r2 ) or ( r1 -- r2 ) r2 - синус угла r1 в радианах. 12.6.2.1616 FSINCOS "f-sine-cos" FLOATING EXT ( F: r1 -- r2 r3 ) or ( r1 -- r2 r3 ) r2 - синус угла r1 в радианах. r3 - косинус угла r1 в радианах. 12.6.2.1617 FSINH "f-cinch" FLOATING EXT ( F: r1 -- r2 ) or ( r1 -- r2 ) r2 - гиперболический синус r1. 12.6.2.1618 FSQRT "f-square-root" FLOATING EXT ( F: r1 -- r2 ) or ( r1 -- r2 ) r2 - квадратный корень r1. Неопределенная ситуация существует, если r1 - меньше нуля. 12.6.2.1625 FTAN "f-tan" FLOATING EXT ( F: r1 -- r2 ) or ( r1 -- r2 ) r2 - тангенс угла r1 в радианах. Неопределенная ситуация существует если cos(r1) нулевое. 12.6.2.1626 FTANH "f-tan-h" FLOATING EXT ( F: r1 -- r2 ) or ( r1 -- r2 ) r2 - гиперболический тангенс r1. 12.6.2.1640 F~ "f-proximate" FLOATING EXT ( -- flag ) ( F: r1 r2 r3 -- ) or ( r1 r2 r3 -- flag ) Если r3 положительно, flag - true если абсолютное значение (r1 минус r2) меньше чем r3. Если r3 нулевое, flag - true если зависящее-от-реализации кодирование r1 и r2 точно идентично (положительный и отрицательный нуль неравны если они имеют различное кодирование). 116 Если r3 - отрицательное, flag - true если абсолютное значение (r1 минус r2) меньше чем абсолютное значение r3 умноженное на сумму абсолютных значений r1 и r2. 12.6.2.2035 PRECISION FLOATING EXT ( -- u ) Возвращает число u значащих цифр, в настоящее время используемых в F., FE., или FS.. 12.6.2.2200 SET-PRECISION FLOATING EXT ( u -- ) Устанавливает число u значащих цифр, в настоящее время используемых в F., FE., или FS.. 12.6.2.2202 SF! "s-f-store" FLOATING EXT ( sf-addr -- ) ( F: r -- ) or ( r sf-addr -- ) Сохраняет число с плавающей точкой r как 32-бит IEEE с одинарной точностью число в sf-addr. Если мантисса внутреннего представления r имеет большую точность чем IEEE формат с одинарной точностью, оно будет округленно с использованием правила "округления к ближайшему". Неопределенная ситуация существует если экспонента r слишком большая, чтобы быть размещенной в формате IEEE с одинарной точностью. См.: 12.3.1.1 Адреса, 12.3.2 Операции c плавающей точкой. 12.6.2.2203 SF@ "s-f-fetch" FLOATING EXT ( sf-addr -- ) ( F: -- r ) or ( sf-addr -- r ) Выбирает 32-бит IEEE число с одинарной точностью, сохраненное в sf- addr на стек с плавающей точкой как r во внутреннем представлении. Если IEEE мантисса с одинарной точностью имеет большую точность чем внутреннее представление, оно будет округлено к внутреннему представлению с использованием правила "округления к ближайшему". Неопределенная ситуация существует если экспонента IEEE представления с одинарной точностью слишком большая, чтобы быть размещенной во внутреннем представлении. См.: 12.3.1.1 Адреса, 12.3.2 Операции c плавающей точкой. 12.6.2.2204 SFALIGN "s-f-align" FLOATING EXT ( -- ) Если указатель области данных - выровнен не на одинарное-с- плавающей-точкой, резервирует достаточно пространства данных для выравнивания. См.: 12.3.1.1 Адреса. 12.6.2.2206 SFALIGNED "s-f-aligned" FLOATING EXT ( addr -- sf-addr ) sf-addr - первый одинарный-с-плавающей-точкой-выровненный адрес больший или равный addr. См.: 12.3.1.1 Адреса. 117 12.6.2.2207 SFLOAT+ "s-float-plus" FLOATING EXT ( sf-addr1 -- sf-addr2 ) Прибавляет размер в адресуемых элементах 32-бит IEEE числа с одинарной точностью к sf-addr1, возвращает sf-addr2. См.: 12.3.1.1 Адреса. 12.6.2.2208 SFLOATS "s-floats" FLOATING EXT ( n1 -- n2 ) n2 - размер в адресуемых элементах n1 32-бит IEEE чисел с одинарной точностью. См.: 12.3.1.1 Адреса. 118 13. ________________________________ Дополнительный набор слов Locals 13.1 ________ Введение См.: Приложение A.13 Locals набор слов. 13.2 ________________________________ Дополнительные термины и нотации Нет. 13.3 _________________________________ Дополнительные условия применения 13.3.1 ______ Locals local - объект данных, чья семантика выполнения должна возвратить его значение, чей контекст должен быть ограничен определением в котором он объявлен, и чье использование в определении не должно препятствовать повторной входимости или рекурсии. 13.3.2 ___________________ Запросы к окружению Добавьте таблицу 13.1 к таблице 3.5. См.: 3.2.6 Запросы к окружению. __________________________________________ Таблица 13.1 - Строки запросов к окружению Строка Тип Константа Значение --------------------------------------------------------------------------- #LOCALS n yes максимальное число local переменных в определении LOCALS flag no locals набор слов присутствует LOCALS-EXT flag no дополнительный locals набор слов присутствует --------------------------------------------------------------------------- 13.3.3 ________________ Обработка locals Чтобы поддерживать набор слов locals, система должна предоставить механизм для получения сообщений определенных с помощью(LOCAL) и реагировать как описано здесь. В течение компиляции определения после : (двоеточие), :NONAME, или DOES>, программа может начинать посылать системе сообщения local идентификатора. Процесс должен начаться, когда послано первое сообщение. Процесс должен закончиться, когда послано "последнее local" сообщение. Система должна отслеживать имена, порядок, и число идентификаторов, содержащихся в законченной последовательности. 13.3.3.1 ____________________ Семантика компиляции Система при получении последовательности сообщения local-идентификатора должна выполнять следующие действия во время компиляции: 119 a) Создать временные входы словаря для каждого из идентификаторов, переданного в (LOCAL) так, что каждый идентификатор будет вести себя как local. Эти временные входы словаря должны исчезнуть в конце определения обозначенного ; (точка с запятой), ;CODE, или DOES>. Система не обязана поддерживать эти идентификаторы таким же образом как она делает другие входы словаря, чтобы они могли быть найдены нормальным процессом поиска в словаре. Кроме того, если набор слов Search-Order присутствует, идентификаторы local должны всегда искаться перед любым из списков слов в любом определимом порядке поиска, и ни одно из слов Search-Order не должно изменять locals' привилегированную позицию в порядке поиска. Local идентификаторы могут находиться на запоминающем устройстве. b) Для каждого идентификатора переданного в (LOCAL), система должна генерировать соответствующую кодовую последовательность, которая делает следующее во время выполнения: 1) Распределяет ресурс памяти, способный содержать значение local. Память должна быть распределена способом, который не препятствует повторной входимости или рекурсии в определении использующем local. 2) Инициализирует значение, используя верхний элемент на стеке данных. Если объявлен больше чем один local, верхний элемент на стеке должен быть перемещен в local идентифицированный первым, следующий элемент должен быть перемещен во второй, и так далее. Ресурс памяти может быть стеком возвратов или может быть реализован другим способом, таким как регистры. Ресурс памяти не должен быть стеком данных. Использование locals не должно ограничивать использование стека данных прежде или после точки объявления. c) Принимается, что любой из законных методов завершения выполнения определения, конкретно: ; (точка с запятой), ;CODE, DOES> или EXIT, освободит ресурс памяти распределенный для locals, если таковые вообще имеются, объявленный в этом определении. ABORT должно освободить все ресурсы памяти local, и CATCH / THROW (если реализовано) должны освободить такие ресурсы для всех определений, чье выполнение заканчивается. d) Отдельные наборы locals могут быть объявлены в определяющих словах перед DOES> для использования определяющим словом, и после DOES> для использования определяемым словом. Система, реализующая набор слов Locals должна поддерживать объявление по крайней мере восьми locals в определении. 13.3.3.2 ______________________ Ограничения Синтаксиса Слова немедленного исполнения в программе могут использовать (LOCAL), чтобы осуществить синтаксисы для объявлений local со следующими ограничениями: a) Программа не должна компилировать никакой выполнимый код в текущее определение между временем выполнения (LOCAL), чтобы идентифицировать первый local для этого определения и временем посылки единственного требуемого "последнего local" сообщения; b) Позиция в источнике программы в которой послана последовательность (LOCAL) сообщений, упомянутая здесь как точка в которой объявлен locals, не должна лежать в пределах области любой управляющей структуры; c) Locals не должны быть объявлены пока не были удалены значения, предварительно помещенные на стек возвратов в пределах определения; d) После того, как locals определения были объявлены, программа может помещать данные на стек возвратов. Однако если это сделано, locals не будут доступны, пока эти значения не будут удалены со стека возвратов; e) Слова, которые возвращают идентификаторы исполнения, типа ' (tick), ['], или FIND, не должны использоваться с local именами; f) Программа, которая объявляет больше чем восемь locals в отдельном определении, имеет зависимость от окружения; 120 g) Locals могут быть доступны или модифицированы в пределах управляющих структур, включая do-loops; h) На local имена нельзя ссылаться посредством POSTPONE и [COMPILE]. См.: 3.4 Интерпретатор текста Forth. 13.4 __________________________________________ Дополнительные документационные требования 13.4.1 ______________________ Системная документация 13.4.1.1 ______________________________ Опции определенные реализацией - максимальное число locals в определении (13.3.3 Обработка locals, 13.6.2.1795 LOCALS|). 13.4.1.2 _______________________ Неопределенные ситуации - выполнение именованного local, в состоянии интерпретации (13.6.1.0086 (LOCAL)); - имя, не определенное с помощью VALUE или LOCAL (13.6.1.2295 TO). 13.4.1.3 _____________________________ Другая системная документация - нет дополнительных требований. 13.4.2 ________________________ Программная документация 13.4.2.1 ________________________ Зависимости от окружения - объявление больше чем восемь locals в отдельном определении (13.3.3 Обработка locals). 13.4.2.2 _______________________________ Другая программная документация - нет дополнительных требований. 13.5 _________________________ Соглашение и наименование 13.5.1 _________________ ANS Forth системы Фраза "Предоставляет Locals набор слов" должна быть добавлена к наименованию любой Стандартной системы, которая предоставляет весь Locals набор слов. Фраза "Предоставляет имена из расширения Locals набора слов" должна быть добавлена к наименованию любой Стандартной системы, которая предоставляет часть расширения Locals набора слов. Фраза "Предоставляет расширение Locals набора слов" должна быть добавлена к наименованию любой Стандартной системы, которая предоставляет весь Locals набор слов и расширение Locals набора слов. 13.5.2 ___________________ ANS Forth программы 121 Фраза "Требуется Locals набор слов" должна быть добавлена к наименованию Стандартной программы, которая требует, чтобы система предоставила Locals набор слов. Фраза "Требуются имена из расширения Locals набора слов" должна быть добавлена к наименованию Стандартной программы, которая требует, чтобы система предоставила часть расширения Locals набора слов. Фраза "Требуется расширение Locals набора слов" должна быть добавлена к наименованию Стандартной программы, которая требует, чтобы система предоставила весь Locals набор слов и расширение Locals набора слов. 13.6 _______ Словарь 13.6.1 ____________ Locals слова 13.6.1.0086 (LOCAL) "paren-local-paren" LOCAL Интерпретация: Семантика интерпретации для этого слова не определена. Выполнение: ( c-addr u -- ) Когда выполнено в течение компиляции, (LOCAL) посылает сообщение системе, которое имеет одно из двух значений. Если u ненулевое, сообщение идентифицирует новый local, чье имя определения дается строкой символов идентифицированной c-addr u. Если u нулевое, сообщение - "последний local" и c-addr не имеет никакого значения. Результат выполнения (LOCAL) в течение компиляции определения - создание набора именованных local идентификаторов, каждый из которых - имя определения которое имеет только семантику выполнения в пределах этого источника определений. local Выполнение: ( -- x ) Помещает значение local, x на стек. Значение local инициализировано как описано в 13.3.3 Обработка locals, и может быть изменено с помощью TO предшествующим имени local. Неопределенная ситуация существует когда local выполнено в состоянии интерпретации. Примечание: Это слово не имеет специальной семантики компиляции в обычном смысле, потому что оно предоставляет доступ к системной возможности использования другими пользователем-определенными словами, которые его включают. Однако, средство locals в целом и последовательность посылаемых сообщений, определяет специфические правила использования с семантическими значениями, которые описаны подробно в разделе 13.3.3 Обработка locals. Примечание: Это слово не предназначено для прямого использования в определении, для объявления этих locals определений. Оно вместо этого используется системными или пользовательскими компилирующими словами. Эти компилирующие слова в свою очередь определяют их собственный синтаксис, и могут использоваться непосредственно в определениях для объявления locals. В этом контексте, синтаксис для (LOCAL) определен в терминах последовательности сообщений времени- компиляции и описан подробно в разделе 13.3.3 Обработка locals. 122 Примечание: Набор слов Locals изменяет синтаксис и семантику 6.2.2295 TO как определено в расширении основного набора слов. См.: 3.4 Интерпретатор текста Forth. 13.6.1.2295 TO LOCAL Расширьте семантику 6.2.2295 TO таким образом: Интерпретация: ( x "name" -- ) Пропускает ведущие пробелы, и выделяет name, ограниченное пробелом. Сохраняет x в name. Неопределенная ситуация существует, если name не было определено с помощью VALUE. Компиляция: ( "name" -- ) Пропускает ведущие пробелы, и выделяет name, ограниченное пробелом. Добавляет семантику времени-выполнения, данную ниже к текущему определению. Неопределенная ситуация существует, если name не было определено с помощью VALUE или (LOCAL). Время-выполнения: ( x -- ) Сохраняет x в name. Примечание: Неопределенная ситуация существует, если POSTPONE или [COMPILE], применяется к TO. См.: 3.4.1 Синтаксический анализ, 6.2.2295 TO, 6.2.2405 VALUE, 13.6.1.0086 (LOCAL). 13.6.2 ______________________ Расширения Locals слов 13.6.2.1795 LOCALS| "locals-bar" LOCAL EXT Интерпретация: Семантика интерпретации для этого слова не определена. Компиляция: ( "name1" "name2" ... "namen" "|" -- ) Создает до восьми идентификаторов local, периодически пропуская ведущие пробелы, выделя name, и выполняя 13.6.1.0086 (LOCAL). Список locals, который будет определен, заканчивается |. Добавляет семантику времени-выполнения данную ниже к текущему определению. Время-выполнения: ( xn ... x2 x1 -- ) Инициализирует до восьми идентификаторов local как описано в 13.6.1.0086 (LOCAL), каждый из которых берет как его начальное значение верхний элемент стека, удаляя его со стека. Идентификатор name1 инициализирован x1, идентификатор name2 - x2, и т.д. При вызове, каждый local будет возвращать его значение. Значение local может быть изменено, использованием 13.6.1.2295 TO. 123 14. ______________________________________________ Дополнительный набор слов распределения памяти 14.1 ________ Введение 14.2 ________________________________ Дополнительные термины и нотация Нет. 14.3 _________________________________ Дополнительные условия применения 14.3.1 __________________________________ Тип данных результата ввода-вывода Результат ввода - числа одна-ячейка, указывающие результат операций ввода- вывода. Значение нуль указывает, что операция ввода-вывода завершилась успешно; другие значения и их смысл - определенное реализацией. Добавьте таблицу 14.1 к таблице 3.1. __________________________ Таблица 14.1 - Типы данных Символ Тип данных Размер на стеке ---------------------------------------------------------------- ior результат ввода-вывода 1 ячейка ---------------------------------------------------------------- 14.3.2 ___________________ Запросы к окружению Добавьте таблицу 14.2 к таблице 3.5. См.: 3.2.6 Запросы к окружению. __________________________________________ Таблица 14.2 - Строки запросов к окружению Строка Тип Константа Значение -------------------------------------------------------------------------- MEMORY-ALLOC flag no набор слов распределения памяти присутствует MEMORY-ALLOC-EXT flag no дополнительный набор слов распределения памяти присутствует -------------------------------------------------------------------------- 14.3.3 ______________________ Распределенные области Программа может адресовать память в зонах области данных, сделанных доступными с помощью ALLOCATE или RESIZE и еще не освобожденными с помощью FREE. См.: 3.3.3 Области данных. 14.4 __________________________________________ Дополнительные документационные требования 14.4.1 ______________________ Системная документация 124 14.4.1.1 ______________________________ Опции определенные реализацией - смысл и значение ior (14.3.1 Тип данных результата ввода-вывода, 14.6.1.0707 ALLOCATE, 14.6.1.1605 FREE, 14.6.1.2145 RESIZE). 14.4.1.2 _______________________ Неопределенные ситуации - нет дополнительных требований. 14.4.1.3 _____________________________ Другая системная документация - нет дополнительных требований. 14.4.2 ________________________ Программная документация - нет дополнительных требований. 14.5 _________________________ Соглашение и наименование 14.5.1 _________________ ANS Forth системы Фраза "Предоставляет набор слов распределения памяти" должна быть добавлена к наименованию любой Стандартной системы, которая предоставляет весь набор слов распределения памяти. Фраза "Предоставляет имена из расширения набора слов распределения памяти" должна быть добавлена к наименованию любой Стандартной системы, которая предоставляет часть расширения набора слов распределения памяти. Фраза "Предоставляет расширение набора слов распределения памяти" должна быть добавлена к наименованию любой Стандартной системы, которая предоставляет весь набор слов распределения памяти и расширение набора слов распределения памяти. 14.5.2 ___________________ ANS Forth программы Фраза "Требуется набор слов распределения памяти" должна быть добавлена к наименованию Стандартной программы, которая требует, чтобы система предоставила набор слов распределения памяти. Фраза "Требуются имена из расширения набора слов распределения памяти" должна быть добавлена к наименованию Стандартной программы, которая требует, чтобы система предоставила часть расширения набора слов распределения памяти. Фраза "Требуется расширение набора слов распределения памяти" должна быть добавлена к наименованию Стандартной программы, которая требует, чтобы система предоставила весь набор слов распределения памяти и расширение набора слов распределения памяти. 14.6 _______ Словарь 14.6.1 __________________________ Слова распределения памяти 14.6.1.0707 ALLOCATE MEMORY ( u -- a-addr ior ) 125 Распределяет u адресуемых элементов непрерывной области данных. Указатель области данных не затронут этой операцией. Начальное содержимое распределенного пространства не определено. Если распределение успешное, a-addr - выровненный стартовый адрес распределенного пространства и ior нулевое. Если операция ошибочна, a-addr не представляет допустимый адрес и ior - код завершения ввода-вывода определенный реализацией. См.: 6.1.1650 HERE, 14.6.1.1605 FREE, 14.6.1.2145 RESIZE. 14.6.1.1605 FREE MEMORY ( a-addr -- ior ) Возвращает непрерывную зону области данных, обозначенную a-addr в систему для последующего распределения. a-addr должен указать зону области данных, которая была предварительно получена с помощью ALLOCATE или RESIZE. Указатель области данных не затронут этой операцией. Если операция успешна, ior нулевое. Если операция ошибочна, ior - код завершения ввода-вывода определенный реализацией. См.: 6.1.1650 HERE, 14.6.1.0707 ALLOCATE, 14.6.1.2145 RESIZE. 14.6.1.2145 RESIZE MEMORY ( a-addr1 u -- a-addr2 ior ) Изменяет распределение непрерывной области данных, начинающейся с адреса a-addr1, предварительно распределенной ALLOCATE или RESIZE, до u адресуемых элементов. u может быть или больше или меньше чем текущий размер зоны. Указатель области данных не затронут этой операцией. Если операция успешна, a-addr2 - выровненный стартовый адрес u адресуемых элементов распределенной памяти и ior нулевое. a-addr2 может быть, но не обязательно, такой же как a-addr1. Если они - не равны, значения содержащиеся в области a-addr1 скопированы в a- addr2, до минимального размера любой из этих двух областей. Если они равны, значения содержащиеся в области сохраняются по минимуму u или первоначального размера. Если a-addr2 - не такой же как a- addr1, область памяти a-addr1 возвращается системе согласно операции FREE. Если операция ошибочна, a-addr2 равен a-addr1, область памяти a- addr1 не затронута, и ior - код результата ввода-вывода определенный реализацией. См.: 6.1.1650 HERE, 14.6.1.0707 ALLOCATE, 14.6.1.1605 FREE. 14.6.2 ____________________________________ Расширения слов распределения памяти Нет. 126 15. ________________________________ Дополнительный набор слов утилит 15.1 ________ Введение Этот дополнительный набор слов содержит слова, наиболее часто используемые в течение разработки приложения. 15.2 ________________________________ Дополнительные термины и нотация Нет. 15.3 _________________________________ Дополнительные условия применения 15.3.1 ___________________ Запросы к окружению Добавьте таблицу 15.1 к таблице 3.5. См.: 3.2.6 Запросы к окружению. __________________________________________ Таблица 15.1 - Строки запросов к окружению Строка Тип Константа Значение --------------------------------------------------------------------------- TOOLS flag no набор слов утилит присутствует TOOLS-EXT flag no дополнительный набор слов утилит присутствует --------------------------------------------------------------------------- 15.3.2 _____________ Словарь Forth Программа, использующая слова CODE или ;CODE, связанные с кодом ассемблера имеет зависимость от окружения на этой специфической системе команд и нотации ассемблера. Программы, использующие слова EDITOR или ASSEMBLER требуют набора слов Порядка поиска или эквивалентную определенную реализацией возможность. См.: 3.3 Словарь Forth. 15.4 __________________________________________ Дополнительные документационные требования 15.4.1 ______________________ Системная документация 15.4.1.1 ______________________________ Опции определенные реализацией - завершающая последовательность для входного потока 15.6.2.0470 ;CODE и 15.6.2.0930 CODE; - способ обработки входного потока 15.6.2.0470 ;CODE и 15.6.2.0930 CODE; - возможность порядка поиска для 15.6.2.1300 EDITOR и 15.6.2.0740 ASSEMBLER (15.3.3 Словарь Forth); - источник и формат отображения с помощью 15.6.1.2194 SEE. 15.4.1.2 _______________________ Неопределенные ситуации 127 - удаление списка слов компиляции (15.6.2.1580 FORGET); - количество элементов на стеке потока управления меньше чем u+1 (15.6.2.1015 CSPICK, 15.6.2.1020 CSROLL); - имя не может быть найдено (15.6.2.1580 FORGET); - имя не определено через 6.1.1000 CREATE (15.6.2.0470 ;CODE); - 6.1.2033 POSTPONE применено к 15.6.2.2532 [IF]; - достижение конца входного источника перед согласованием 15.6.2.2531 [ELSE] или 15.6.2.2533 [THEN] (15.6.2.2532 [IF]); - удаление необходимого определения (15.6.2.1580 FORGET). 15.4.1.3 _____________________________ Другая системная документация - нет дополнительных требований. 15.4.2 ________________________ Программная документация 15.4.2.1 ________________________ Зависимости от окружения - использование слов 15.6.2.0470 ;CODE или 15.6.2.0930 CODE. 15.4.2.2 _______________________________ Другая программная документация - нет дополнительных требований. 15.5 _________________________ Соглашение и наименование 15.5.1 _________________ ANS Forth системы Фраза "Предоставляет набор слов утилит" должна быть добавлена к наименованию любой Стандартной системы, которая предоставляет весь набор слов утилит. Фраза "Предоставляет имена из расширения набора слов утилит" должна быть добавлена к наименованию любой Стандартной системы, которая предоставляет часть расширения набора слов утилит. Фраза "Предоставляет расширение набора слов утилит" должна быть добавлена к наименованию любой Стандартной системы, которая предоставляет весь набор слов утилит и расширение набора слов утилит. 15.5.2 ___________________ ANS Forth программы Фраза "Требуется набор слов утилит" должна быть добавлена к наименованию Стандартной программы, которая требует, чтобы система предоставила набор слов утилит. Фраза "Требуются имена из расширения набора слов утилит" должна быть добавлена к наименованию Стандартной программы, которая требует, чтобы система предоставила часть расширения набора слов утилит. Фраза "Требуется расширение набора слов утилит" должна быть добавлена к наименованию Стандартной программы, которая требует, чтобы система предоставила весь набор слов утилит и расширение набора слов утилит. 128 15.6 _______ Словарь 15.6.1 ____________ Слова Утилит 15.6.1.0220 .S "dot-s" TOOLS ( -- ) Копирует и отображает значения находящиеся на стеке данных. Формат отображения зависящий-от-реализаци. .S может быть реализовано с использованием слов вывода отображаемых чисел. Следовательно, его использование может разрушать временную область, идентифицированную #>. См.: 3.3.3.6 Другие временные области. 15.6.1.0600 ? "question" TOOLS ( a-addr -- ) Отображает значение, сохраненное в a-addr. ? может быть реализовано, с использованием слов вывода отображаемых чисел. Следовательно, его использование может разрушать временную область, идентифицированную #>. См.: 3.3.3.6 Другие временные области. 15.6.1.1280 DUMP TOOLS ( addr u -- ) Отображает содержание u последовательных адресов, начинающихся с addr. Формат отображения зависящий от реализации. DUMP может быть реализовано, с использованием слов вывода отображаемых чисел. Следовательно, его использование может разрушать временную область, идентифицированную #>. См.: 3.3.3.6 Другие Временные Области. 15.6.1.2194 SEE TOOLS ( "name" -- ) Отображает удобочитаемое представление определения именованного слова. Источник представления (декомпиляция объектного кода, блок источника, и т.д.) и специфическая форма отображения - определенное реализацией. SEE может быть реализовано, с использованием слов вывода отображаемых чисел. Следовательно, его использование может разрушать временную область, идентифицированную #>. См.: 3.3.3.6 Другие временные области. 15.6.1.2465 WORDS TOOLS ( -- ) Перечисляет имена определений в первом списке слов порядка поиска. Формат отображения зависящий-от-реализаци. 129 WORDS может быть реализовано, с использованием слов вывода отображаемых чисел. Следовательно, его использование может разрушать временную область, идентифицированную #>. См.: 3.3.3.6 Другие Временные Области. 15.6.2 ______________________ Расширения слов Утилит 15.6.2.0470 ;CODE "semicolon-code" TOOLS EXT Интерпретация: Семантика интерпретации для этого слова не определена. Компиляция: ( C: colon-sys -- ) Добавляет семантику времени-выполнения ниже к текущему определению. Заканчивает текущее определение, позволяя ему быть найденным в словаре, и вводит состояние интерпретации, потребляя colon-sys. Последующие символы в области анализа типично представляют исходный текст на языке программирования, обычно некоторой формы ассемблера. Эти символы, обработанные определенным реализацией способом, производят соответствующий машинный код. Процесс продолжается, пополнением входного буфера по мере необходимости, до обработки определенной реализацией завершающей последовательности. Время-выполнения: ( -- ) ( R: nest-sys -- ) Заменяет семантику выполнения самого последнего определения на семантику выполнения name, данную ниже. Возвращает управление на вызывающее определение, определенное nest-sys. Неопределенная ситуация существует если самое последнее определение не было определено с помощью CREATE или определенного пользователем слова, которое вызывает CREATE. name Выполнение: ( i*x -- j*x ) Исполняет машинную последовательность кода, которая была сгенерирована после ;CODE. См.: 6.1.1250 DOES>. 15.6.2.0702 AHEAD TOOLS EXT Интерпретация: Семантика интерпретации для этого слова не определена. Компиляция: ( C: -- orig ) Помещает адрес ячейки новой неразрешенной ссылки вперед orig на стек потока управления. Добавляет семантику времени-выполнения, данную ниже к текущему определению. Семантика не завершена, пока orig не разрешена (например, с помощью THEN). Время-выполнения: ( -- ) Продолжает выполнение с адреса ячейки, определенного разрешением orig. 15.6.2.0740 ASSEMBLER TOOLS EXT ( -- ) Заменяет первый список слов в порядке поиска на список слов ASSEMBLER. См.: 16. Дополнительный набор слов порядка поиска. 130 15.6.2.0830 BYE TOOLS EXT ( -- ) Возвращает управление в базовую операционную систему, если существует. 15.6.2.0930 CODE TOOLS EXT ( "name" -- ) Пропускает ведущие разделители пробелы. Выделяет name, ограниченное пробелом. Создает определение для name, обозначенное "code definition", с семантикой выполнения определенной ниже. Последующие символы в области анализа типично представляют исходный текст на языке программирования, обычно некоторой формы ассемблера. Эти символы, обработанные определенным реализацией способом, производят соответствующий машинный код. Процесс продолжается, пополнением входного буфера по мере необходимости, до обработки определенной реализацией завершающей последовательности. name Выполнение: ( i*x -- j*x ) Исполняет машинную последовательность кода, которая была сгенерирована после CODE. См.: 3.4.1 Синтаксический анализ. 15.6.2.1015 CS-PICK "c-s-pick" TOOLS EXT Интерпретация: Семантика интерпретации для этого слова не определена. Выполнение:( C: destu ... orig0|dest0 -- destu ... orig0|dest0 destu ) ( S: u -- ) Удаляет u. Копирует destu на вершину стека потока управления. Неопределенная ситуация существует, если есть меньше чем u+1 элементов, каждый из которых должен быть orig или dest, на стеке потока управления перед выполнением CS-PICK. Если стек потока управления реализован с использованием стека данных, u должен быть самым верхним элементом на стеке данных. 15.6.2.1020 CS-ROLL "c-s-roll" TOOLS EXT Интерпретация: Семантика интерпретации для этого слова не определена. Выполнение: ( C: origu|destu origu-1|destu-1 ... orig0|dest0 -- origu-1|destu-1 ... orig0|dest0 origu|destu ) ( S: u -- ) Удаляет u. Вращает u+1 элементов на вершине стека потока управления так, чтобы origu|destu находились на вершине стека потока управления. Неопределенная ситуация существует, если есть меньше чем u+1 элементов, каждый из которых должен быть orig или dest, на стеке потока управления перед выполнением CS-ROLL. Если стек потока управления реализован с использованием стека данных, u должен быть самым верхним элементом на стеке данных. 131 15.6.2.1300 EDITOR TOOLS EXT ( -- ) Заменяет первый список слов в порядке поиска на список слов EDITOR. См.: 16. Дополнительный набор слов порядка поиска. 15.6.2.1580 FORGET TOOLS EXT ( "name" -- ) Пропускает ведущие разделители пробелы. Выделяет name, ограниченное пробелом. Находит name, затем удаляет name из словаря наряду со всеми словами, добавленными в словарь после name. Неопределенная ситуация существует, если name не может быть найдено. Если набор слов Порядка поиска присутствует, FORGET исследует список слов компиляции. Неопределенная ситуация существует если список слов компиляции удален. Неопределенная ситуация существует, если FORGET, удаляет слово, требуемое для правильного выполнения. Примечание: Это слово устаревшее и включено как уступка существующим реализациям. См.: 3.4.1 Синтаксический анализ. 15.6.2.2250 STATE TOOLS EXT ( -- a-addr ) Расширьте семантику 6.1.2250 STATE, чтобы позволить ;CODE, изменить значение в STATE. Программа непосредственно не должна изменять содержимое STATE. См.: 3.4 Интерпретатор текста Forth, 6.1.0450 :, 6.1.0460 ;, 6.1.0670 ABORT, 6.1.2050 QUIT, 6.1.2250 STATE, 6.1.2500 [, 6.1.2540 ], 6.2.0455 :NONAME, 15.6.2.0470 ;CODE. 15.6.2.2531 [ELSE] "bracket-else" TOOLS EXT Компиляция: Исполняет семантику выполнения, данную ниже. Выполнение: ( "name ... " -- ) Пропускает ведущие пробелы, выделяет и снимает ограниченные пробелом слова из области анализа, включая вложенные ссылки [IF] ... [THEN] и [IF] ... [ELSE] ... [THEN], пока слово [THEN] не будет проанализировано и снято. Если область анализа становится исчерпанной, она пополняется как с помощью REFILL. [ELSE] - слово немедленного исполнения. См.: 3.4.1 Синтаксический анализ. 15.6.2.2532 [IF] "bracket-if" TOOLS EXT 132 Компиляция: Исполняет семантику выполнения, данную ниже. Выполнение: ( flag | flag "name ... " -- ) Если flag - true, не делает ничего. Иначе, пропускает ведущие пробелы, выделяет и снимает ограниченные пробелом слова из области анализа, включая вложенные ссылки [IF] ... [THEN] и [IF] ... [ELSE] ... [THEN], пока слово [ELSE] или слово [THEN] не будет проанализировано и снято. Если область анализа становится исчерпанной, она пополняется как с помощью REFILL. [IF] - слово немедленного исполнения. Неопределенная ситуация существует, если [IF] - следствие выполнения POSTPONE, или если достигнут конец входного буфера и не может быть пополнен перед анализом ограничителей [ELSE] или [THEN]. 15.6.2.2533 [THEN] "bracket-then" TOOLS EXT Компиляция: Исполняет семантику выполнения, данную ниже. Выполнение: ( -- ) Не делает ничего. [THEN] - слово немедленного исполнения. 133 16. ________________________________________ Дополнительный набор слов порядка поиска 16.1 ________ Введение 16.2 ________________________________ Дополнительные термины и нотация Список слов компиляции: Список слов, в который помещаются новые имена определений. Порядок поиска: Список списков слов, определяющих порядок, в котором будет просмотрен словарь. 16.3 _________________________________ Дополнительные условия применения 16.3.1 ___________ Типы данных Идентификаторы списка слов - зависящие-от-реализации одна-ячейка значения, которые идентифицируют списки слов. Добавьте таблицу 16.1 к таблице 3.1. __________________________ Таблица 16.1 - Типы данных Символ Тип данных Размер на стеке ---------------------------------------------------------------- wid идентификатор списка слов 1 ячейка ---------------------------------------------------------------- См.: 3.1 Типы данных, 3.4.2 Поиск имен определений, 3.4 Интерпретатор текста Forth. 16.3.2 ___________________ Запросы к окружению Добавьте таблицу 16.2 к таблице 3.5. См.: 3.2.6 Запросы к окружению. __________________________________________ Таблица 16.2 - Строки запросов к окружению Строка Тип Константа Значение --------------------------------------------------------------------------- SEARCH-ORDER flag no набор слов порядка поиска присутствует SEARCH-ORDER-EXT flag no дополнительный набор слов порядка поиска присутствует WORDLISTS n yes максимальное число списков слов используемых в порядке поиска --------------------------------------------------------------------------- 16.3.3 ______________________ Поиск имен определений При просмотре списка слов для имени определения, система должна просматривать каждый список слов от его последнего определения до первого. Просмотр может охватывать только отдельный список слов, как с SEARCH-WORDLIST, или все списки слов в порядке поиска, как в текстовом интерпретаторе и FIND. 134 Изменение порядка поиска должно затрагивать только последующий поиск имен определений в словаре. Система с набором слов Порядка поиска должна позволять, по крайней мере, восемь списков слов в порядке поиска. Неопределенная ситуация существует, если программа изменяет список слов компиляции в течение компиляции определения или перед модификацией поведения последнего откомпилированного определения с помощью ;CODE, DOES>, или IMMEDIATE. Программа, которая требует больше чем восемь списков слов в порядке поиска, имеет зависимость от окружения. См.: 3.4.2 Поиск имен определений 16.3.4 ___________________ Непрерывные области Зоны области данных созданной операциями, описанными в 3.3.3.2 Непрерывные области, могут быть состоящими из нескольких несмежных участков, если WORDLIST выполнимо в пределах распределений. 16.4 __________________________________________ Дополнительные документационные требования 16.4.1 ______________________ Системная документация 16.4.1.1 ______________________________ Опции определенные реализацией - максимальное число списков слов в порядке поиска (16.3.3 Поиск имен определений, 16.6.1.2197 SET-ORDER); - минимальный порядок поиска (16.6.1.2197 SET-ORDER, 16.6.2.1965 ONLY). 16.4.1.2 _______________________ Неопределенные ситуации - изменение списка слов компиляции (16.3.3 Поиск имен определений); - пустой порядок поиска (16.6.2.2037 PREVIOUS); - слишком много списков слов в порядке поиска (16.6.2.0715 ALSO). 16.4.1.3 _____________________________ Другая системная документация - нет дополнительных требований. 16.4.2 ________________________ Программная документация 16.4.2.1 ________________________ Зависимости от окружения - требование больше чем восьми списков слов в порядке поиска (16.3.3 Поиск имен определений). 16.4.2.2 _______________________________ Другая программная документация - нет дополнительных требований. 135 16.5 _________________________ Соглашение и наименование 16.5.1 _________________ ANS Forth системы Фраза "Предоставляет набор слов порядка поиска" должна быть добавлена к наименованию любой Стандартной системы, которая предоставляет весь набор слов порядка поиска. Фраза "Предоставляет имена из расширения набора слов порядка поиска" должна быть добавлена к наименованию любой Стандартной системы, которая предоставляет часть расширения набора слов порядка поиска. Фраза "Предоставляет расширение набора слов порядка поиска" должна быть добавлена к наименованию любой Стандартной системы, которая предоставляет весь набор слов порядка поиска и расширение набора слов порядка поиска. 16.5.2 ___________________ ANS Forth программы Фраза "Требуется набор слов порядка поиска" должна быть добавлена к наименованию Стандартной программы, которая требует, чтобы система предоставила набор слов порядка поиска. Фраза "Требуются имена из расширения набора слов порядка поиска" должна быть добавлена к наименованию Стандартной программы, которая требует, чтобы система предоставила часть расширения набора слов порядка поиска. Фраза "Требуется расширение набора слов порядка поиска" должна быть добавлена к наименованию Стандартной программы, которая требует, чтобы система предоставила весь набор слов порядка поиска и расширение набора слов порядка поиска. 16.6 _______ Словарь 16.6.1 ____________________ Слова порядка поиска 16.6.1.1180 DEFINITIONS SEARCH ( -- ) Делает список слов компиляции таким же, как первый список слов в порядке поиска. Определяет, что имена последующих определений будут помещены в список слов компиляции. Последующие изменения в порядке поиска не будут затрагивать список слов компиляции. См.: 16.3.3 Поиск имен определений. 16.6.1.1550 FIND SEARCH Расширьте семантику 6.1.1550 FIND, таким образом: ( c-addr -- c-addr 0 | xt 1 | xt -1 ) Ищет определение именованное в строке со счетчиком в c-addr. Если определение не найдено после поиска всех списков слов в порядке поиска, возвращает c-addr и нуль. Если определение найдено, возвращяет xt. 136 Если определение немедленного исполнения, также возвращает один (1); иначе также возвращает минус-один (-1). Для данной строки, значения возвращенные FIND во время компиляции, могут отличаться от возвращенных при не компиляции. См.: 3.4.2 Поиск имен определений, 6.1.0070 ', 6.1.1550 FIND, 6.1.2033 POSTPONE, 6.1.2510 ['], D.6.7 Immediate-ности. 16.6.1.1595 FORTH-WORDLIST SEARCH ( -- wid ) Возвращает wid, идентификатор списка слов, который включает все стандартные слова, предоставленные реализацией. Этот список слов - первоначально список слов компиляции и - часть начального порядка поиска. 16.6.1.1643 GET-CURRENT SEARCH ( -- wid ) Возвращает wid, идентификатор списка слов компиляции. 16.6.1.1647 GET-ORDER SEARCH ( -- widn ... wid1 n ) Возвращает число списков слов n в порядке поиска и идентификаторы списков слов widn ... wid1 идентифицирующие эти списки слов. wid1 идентифицирует список слов, который просматривается первым, и widn список слов, который просматривается последним. Порядок поиска не затронут. 16.6.1.2192 SEARCH-WORDLIST SEARCH ( c-addr u wid -- 0 | xt 1 | xt -1 ) Ищет определение, идентифицированное строкой c-addr u в списке слов идентифицированном wid. Если определение не найдено, возвращает нуль. Если определение найдено, возвращает его идентификатор исполнения xt и один (1) если определение немедленного исполнения, и минус-один (-1) иначе. 16.6.1.2195 SET-CURRENT SEARCH ( wid -- ) Устанавливает список слов компиляции на список слов, идентифицированный wid. 16.6.1.2197 SET-ORDER SEARCH ( widn ... wid1 n -- ) Устанавливает порядок поиска на список слов, идентифицированный widn ... wid1. Впоследствии, список слов wid1 будет просматриваться первым, и список слов widn просматриваться последним. Если n нулевой, порядок поиска пуст. Если n - минус один, установит порядок поиска на определенный реализацией минимальный порядок поиска. Минимальный порядок поиска должен включать слова FORTH- WORDLIST и SET-ORDER. Система должна позволять быть n по крайней мере восьми. 16.6.1.2460 WORDLIST SEARCH ( -- wid ) Создает новый пустой список слов, возвращая его идентификатор списка слов wid. Новый список слов может быть возвращен из пула предварительно размещенных списков слов или может быть динамически распределен в области данных. Система должна позволять создание, по крайней мере, 8 новых списков слов в дополнение к любым предоставленным как часть системы. 137 16.6.2 ______________________________ Расширения слов порядка поиска 16.6.2.0715 ALSO SEARCH EXT ( -- ) Преобразует порядок поиска, состоящий из widn, ... wid2, wid1 (где wid1 просматривается первым) в widn, ... wid2, wid1, wid1. Неопределенная ситуация существует, если есть слишком много списков слов в порядке поиска. 16.6.2.1590 FORTH SEARCH EXT ( -- ) Преобразует порядок поиска, состоящий из widn, ... wid2, wid1 (где wid1 просматривается первым) в widn, ... wid2, widFORTH-WORDLIST. 16.6.2.1965 ONLY SEARCH EXT ( -- ) Устанавливает порядок поиска на определенный реализацией минимальный порядок поиска. Минимальный порядок поиска должен включать слова FORTH-WORDLIST и SET-ORDER. 16.6.2.1985 ORDER SEARCH EXT ( -- ) Отображает списки слов в порядке поиска в их последовательности порядка поиска, от первого просматриваемого до последнего. Также отображает список слов, в который будут помещены новые определения. Формат отображения - зависящий от реализации. ORDER может быть реализован с использованием слов вывода отображаемых чисел. Следовательно, их использование может разрушать временную область, идентифицированную #>. См.: 3.3.3.6 Другие временные области. 16.6.2.2037 PREVIOUS SEARCH EXT ( -- ) Преобразует порядок поиска, состоящий из widn, ... wid2, wid1 (где wid1 просматривается первым) в widn, ... wid2. Неопределенная ситуация существует, если порядок поиска был пуст прежде, чем было выполнено PREVIOUS. 138 17. ___________________________________ Дополнительный строковый набор слов 17.1 ________ Введение 17.2 ________________________________ Дополнительные термины и нотация Нет. 17.3 _________________________________ Дополнительные условия применения Добавьте таблицу 17.1 к таблице 3.5. См.: 3.2.6 Запросы к окружению. __________________________________________ Таблица 17.1 - Строки запросов к окружению Строка Тип Константа Значение ----------------------------------------------------------------- STRING flag no строковый набор слов присутствует STRING-EXT flag no дополнительный строковый набор слов присутствует ----------------------------------------------------------------- 17.4 __________________________________________ Дополнительные документационные требования Нет. 17.5 _________________________ Соглашение и наименование 17.5.1 ___________________ ANS Forth программы Фраза "Предоставляет строковый набор слов" должна быть добавлена к наименованию любой Стандартной системы, которая предоставляет весь строковый набор слов. Фраза "Предоставляет имена из расширения строкового набора слов" должна быть добавлена к наименованию любой Стандартной системы, которая предоставляет часть расширения строкового набора слов. Фраза "Предоставляет расширение строкового набора слов" должна быть добавлена к наименованию любой Стандартной системы, которая предоставляет весь строковый набор слов и расширение строкового набора слов. 17.5.2 ___________________ ANS Forth программы Фраза "Требуется строковый набор слов" должна быть добавлена к наименованию Стандартной программы, которая требует, чтобы система предоставила строковый набор слов. Фраза "Требуются имена из расширения строкового набора слов" должна быть добавлена к наименованию Стандартной программы, которая требует, чтобы система предоставила часть расширения строкового набора слов. Фраза "Требуется расширение строкового набора слов" должна быть добавлена к наименованию Стандартной программы, которая требует, чтобы система предоставила весь строковый набор слов и расширение строкового набора слов. 139 17.6 _______ Словарь 17.6.1 _______________ Строковые слова 17.6.1.0170 -TRAILING "dash-trailing" STRING ( c-addr u1 -- c-addr u2 ) Если u1 больше чем нуль, u2 равно u1 минус число пробелов в конце символьной строки, определенной c-addr u1. Если u1 нуль или вся строка состоит из пробелов, u2 нулевой. 17.6.1.0245 /STRING "slash-string" STRING ( c-addr1 u1 n -- c-addr2 u2 ) Корректирует символьную строку c-addr1, n символами. Результирующая символьная строка, определенная c-addr2 u2, начинается с c-addr1 плюс n символов, и длиной u1 минус n символов. 17.6.1.0780 BLANK STRING ( c-addr u -- ) Если u больше чем нуль, сохраняет символьное значение пробела в u последовательных символьных позициях, начинающихся с c-addr. 17.6.1.0910 CMOVE "c-move" STRING ( c-addr1 c-addr2 u -- ) Если u больше чем нуль, копирует u последовательных символов из области данных начинающейся с c-addr1 в область, начинающуюся с c- addr2, выполняя посимвольно с наименьших адресов к наибольшим. Отличие с: 17.6.1.0920 CMOVE>. 17.6.1.0920 CMOVE> "c-move-up" STRING ( c-addr1 c-addr2 u -- ) Если u больше чем нуль, копирует u последовательных символов из области данных начинающейся с c-addr1 в область, начинающуюся с c- addr2, выполняя посимвольно с наибольших адресов к наименьшим. Отличие с: 17.6.1.0910 CMOVE. 17.6.1.0935 COMPARE STRING ( c-addr1 u1 c-addr2 u2 -- n ) Сравнивает строку, определенную c-addr1 u1 со строкой, определенной c-addr2 u2. Строки сравниваются, начиная с заданных адресов, посимвольно, до длины более короткой строки или до нахождения различия. Если две строки идентичны - n нулевое. Если две строки идентичны до длины более короткой строки, n равно минус-один (-1) если u1 - меньше чем u2, иначе один (1). Если две строки - не идентичны до длины более короткой строки, n равно минус-один (-1) если первый несоответствующий символ в строке определенной c-addr1 u1 имеет меньшее числовое значение чем соответствующий символ в строке, определенной c-addr2 u2, иначе один (1). 140 17.6.1.2191 SEARCH STRING ( c-addr1 u1 c-addr2 u2 -- c-addr3 u3 flag ) Ищет строку, определенную c-addr1 u1 в строке, определенной c-addr2 u2. Если flag - true, соответствие было найдено с c-addr3 и с u3 оставшимися символами. Если flag - false не было никакого соответствия и c-addr3 равен c-addr1, и u3 равно u1. 17.6.1.2212 SLITERAL STRING Интерпретация: Семантика интерпретации для этого слова не определена. Компиляция: ( c-addr1 u -- ) Добавляет семантику времени-выполнения, данную ниже к текущему определению. Время-выполнения: ( -- c-addr2 u ) Возвращает c-addr2 u описание строки, состоящей из символов определенных c-addr1 u в течение компиляции. Программа не должна изменять возвращенную строку. 17.6.2 _________________________ Расширения строковых слов Нет 141 A. _______________________________________ Разъяснения (информационное приложение) A.1 ________ Введение A.1.1 ____ Цель A.1.2 __________ Назначение Этот Стандарт более обширен, чем предыдущие промышленные стандарты для языка Forth. Несколько факторов сделали это необходимым: - желание разрешить конфликты между предыдущими стандартами; - потребность устранить семантические двусмысленности и другие несоответствия; - требование стандартизировать обычную практику, где возможно разрешение расхождений способом, который минимизирует стоимость соглашения; - желание стандартизировать общие системные методы, включая соответствующие аппаратным средствам. Результат усилий удовлетворения всех этих требований - Стандарт устроенный так, чтобы требуемый набор слов остался маленьким. Таким образом, ANS Forth может быть предоставлен для ресурсо-ограниченных встраиваемых систем. Слова вне требуемого набора слов организованы во множество дополнительных наборов слов и их расширений, допуская реализацию адаптированных систем, которые являются Стандартными. При оценке относительных достоинств, члены X3J14 Технического Комитета руководствовались следующими целями (перечисленными в алфавитном порядке): Последовательность Стандарт предоставляет функционально законченный набор слов с минимальным функциональным перекрытием. Стоимость соглашения Эта цель включает такие проблемы как обычная практика, сколько существующего кода было бы сломано предложенным изменением, и количество усилий требуемых для приведения существующих приложений и систем в соответствие со Стандартом. Эффективность Скорость выполнения, компактность памяти. Переносимость Слова, выбранные для включения должны быть свободны от зависящих от системы функций. Удобочитаемость Имена определений Forth должны ясно очерчивать их поведение. Это поведение должно иметь очевидную простоту, которая обеспечивает быстрое понимание. Forth должен быть легко познаваем, и обеспечивать легко поддерживаемый код. Полезность Считается, имеет достаточно существенные функциональные возможности и частоту использования, чтобы считать подходящим для включения. 142 A.1.3 _____________________ Организация Документа A.1.3.1 ___________ Наборы слов С начала, X3J14 Технический Комитет столкнулся не только с противоречивыми идеями относительно того каким является "реальный" Forth, но также и противоречивыми потребностями различных групп в пределах Forth сообщества. В одной крайности были те, кто требовали "пустого" Forth. В другой крайности были те, кто хотели "жирного" Forth. Многие были где-то по середине. Все были убеждены в справедливости их собственной позиции и не правильности, по крайней мере, одной из этих двух крайностей. Состав комитета отразил этот полный диапазон интересов. Подход, который мы приняли, состоит в определении Основного набора слов устанавливающего самый нижний предел требуемой системной функциональности, и предоставлении портфеля дополнительных наборов слов для специальных целей. Этот простой подход соответствует фундаментальной природе Forth как расширяемого языка, и таким образом достигает своего рода мета-расширяемости. В этом ключе, высокоуровневый компромисс, независимо от фактического состава индивидуального набора слов, на долгий срок установлена твердая и реальная структура. Могут соглашаться или не соглашаться, что должен быть набор слов Locals, или что слово COMPILE, принадлежит расширению основного набора слов. Но, по крайней мере, есть механизм посредством которого такие вещи могут быть включены логичным и организованным способом. Важно несколько следствий этой схемы дополнительных наборов слов. Первое, ANS Forth системы могут по-прежнему быть реализованы на большем диапазоне аппаратных средств, чем может быть заявлено почти любым другим отдельным языком. Так как требуется только Основной набор слов, даже очень ограниченные аппаратные средства будут способны вмещать ANS Forth реализацию. Второе, ожидается большая степень переносимости приложений, и программистов. Дополнительные наборы слов стандартизируют различные функции (например, с плавающей точкой), это было широко реализовано прежде, но не с однородными именами определений и методологий, ни с равными уровнями полноты. С такими словами, теперь стандартизированными в дополнительные наборы слов, связь между программистами - устно, через журнал или газетные статьи, и т.д. - прыгнут к новому уровню возможностей, и совместноиспользуемость кода и приложений должна повыситься впечатляюще. Третье, ANS Forth системы могут быть разработаны, чтобы предложить пользователю возможность выборочно, даже динамически, включать или исключать один или большее количество дополнительных наборов слов или их частей. Также, более дешевые изделия могут быть предложены пользователю, который нуждается в Основном наборе слов и не более. Таким образом, пользователю будет доступна фактически неограниченная гибкость. Но эти преимущества имеют цену. Бремя находится на пользователе, чтобы решить какие свойства желательны, и соответственно выбирать предложенные изделия, особенно когда важна переносимость приложения. Мы не ожидаем от большинства разработчиков попыток предоставлять все наборы слов, а скорее выбирать наиболее ценные для их рыночного предназначения. Основное требование - это, если разработчик утверждает что имеет частичный дополнительный набор слов, должна быть доступна полная требуемая часть этого набора слов. Если разработчик желает предложить только часть дополнительного набора слов, приемлемо говорить, например "Эта система предлагает части [названного] набора слов", особенно если выбранные или исключенные слова перечислены ясно. 143 Каждый дополнительный набор слов будет вероятно апеллировать к специфической клиентуре. Например, ученые, выполняющие сложные математические анализы могут возлагать большее значение на набор слов с плавающей точкой, чем программисты разрабатывающие простые внедряемые контроллеры. Как в случае основных расширений мы ожидаем, что разработчики предложат те наборы слов, которые по их мнению будут оценены их пользователями. Дополнительные наборы слов можно предлагать в исходной форме или иначе факторизованными так, чтобы пользователь мог выборочно их загружать. Расширения к дополнительным наборам слов включают слова, которые считаются менее обязательными для выполнения основной деятельности поддерживаемой набором слов, хотя, несомненно, для этого уместны. Как в случае основных расширений, разработчики могут выборочно добавлять описанные подмножества расширения набора слов, предусматривая наименование не вводящее в заблуждение пользователя относительно мысли, что все слова присутствуют. A.2 _________________ Термины и нотация A.2.1 ____________________ Определения терминов неопределенная ситуация Реакция Стандартной системы на неопределенную ситуацию оставлена на усмотрение разработчика. Стандартная система не нуждается в явном обнаружении или сообщении о случаях неопределенных ситуаций. кросс компилятор Кросс компиляторы могут использоваться для подготовки программы к выполнению во внедренной системе, или могут использоваться для генерации ядра Forth для той же самой или другой среды времени-выполнения. поле данных В более ранних стандартах, поля данных были известны как "поля параметров". В Forth системах с подпрограммным шитым кодом, все - объектный код. Нет традиционных полей кода или данных. Только слово, определенное с помощью CREATE или словом, которое вызывает CREATE, имеет поле данных. Только поле данных, определенное через CREATE, может обрабатываться переносимо. набор слов Этот Стандарт признает, что некоторые функции, хотя и полезны в некоторых прикладных областях, не достаточно общие, чтобы оправдывать требование их во всех системах Forth. Но они являются полезными для группирования слов Forth по родственным функциям. Эти вопросы имеют дело с использованием концепции наборов слов. "Основной" набор слов содержит неотъемлемое тело слов в Forth системе. Только этот - "требуемый" набор слов. Другие наборы слов определенные в этом Стандарте ¦ это необязательные добавления делающие возможным предоставление Стандартной системы с приспособленными уровнями функциональности. A.2.2 _______ Нотация 144 A.2.2.2 ________________ Стековая нотация Использование -sys, orig, и dest типов данных в диаграммах стекового эффекта передает две части информации. Первое, это предупреждает читателя, что много реализаций используют стек данных не установленным способом для их целей, так что элементы ниже стеков потока управления или данных являются недоступными. Второе, в случаях, где используются orig и dest, документированы явные правила спаривания при допущении, что все системы осуществят такую модель, чтобы ее результат был эквивалентен применению некоторого стека, и фактически многие реализации используют стек данных для этой цели. Однако ничто в этом Стандарте не требует, чтобы реализации фактически использовали стек данных (или любой другой) для этой цели, при условии, что поддержано подразумеваемое поведение модели. A.3 __________________ Условия применения Системы Forth необычно просты для развития, по сравнению с компиляторами для более традиционных языков типа C. В дополнение к системам Forth, поддерживаемым производителями, общедоступные реализации и руководства по реализации были широко доступны почти двадцать лет, и большое количество людей разработали их собственные Forth системы. В результате, сформировалось разнообразие подходов реализации, каждый оптимизированный для специфической платформы или конкретного рынка. X3J14 Технический Комитет пытался приспособить это разнообразие, сдерживая разработчиков так мало насколько это возможно, совместимо с целью определения стандартного интерфейса между основной Системой Forth и прикладной программой, разрабатываемой на нем. Так же мы не будем ручаться, в этом разделе сообщать Вам, как реализовать Forth систему, а скорее предусмотреть некоторое руководство относительно того, какие минимальные требования имеются для системы, которая может должным образом претендовать на соответствие этому Стандарту. А.3.1 Типы данных Большинство компьютеров имеет дело с произвольными наборами двоичных разрядов. Нет никакого способа установить контроль, содержит ли ячейка адрес или целое число без знака. Единственное значение, которым данная величина обладает - это значение, назначенное приложением. Когда данные используются, значение результата зависит от значения, назначенного для входных величин. Некоторые комбинации входных значений производят бессмысленный результат: например, какое значение может быть назначено для арифметической суммы ASCII представления символа "A" и TRUE флага? Ответ может быть "никакое значение"; или альтернативно, эта операция могла бы быть первым шагом в создании контрольной суммы. Контекст - определяющий. Порядок ограничения значений, которые программа может назначить различным комбинациям наборов двоичных разрядов - иногда называется типизация данных. Много машинных языков устанавливают явную типизацию данных, и имеются компиляторы, которые предотвращают неточные операции. Forth редко явно налагает ограничения типа данных. Однако типы данных неявно существуют, и требуется дисциплина, особенно если переносимость программ - цель. В Forth, возложено на программиста (скорее чем на компилятор) определение того, что данные точно типизированы. Этот раздел пытается предлагать руководство относительно фактической типизации данных в Forth. 145 А.3.1.2 _______________ Символьные типы Forth не принуждает к применению типа данных посредством глубины стека, для правильной идентификации и надлежащей манипуляции символьным типом данных. Символы не обязательно занимают значимыми данными всю ширину их единственного элемента стека. В то время как различие между знаковым и без знаковым символом полностью отсутствует в формальной спецификации Forth, практическая тенденция состоит в том, чтобы рассматривать символы как короткие положительные целые числа, когда входят в силу математические операции. a) Стандартный набор символов 1) Элемент памяти для символьного типа данных (C@, C!, FILL, и т.д.) должен быть способен содержать числа без знака от 0 до 255. 2) Реализация не требует ограничения символьной памяти этим диапазоном, но стандартная программа без зависимостей от окружения не должна быть способна сохранять числа вне этого диапазона в "char" адресе ячейки. 3) Разрешенные представления чисел - дополнительный код (дополнение до двух), обратный код (дополнение до единицы), и знаковая величина. Заметьте, что все эти системы счисления сходятся в представлении положительных чисел. 4) Так как "char" может хранить маленькие положительные числа и так как символьный тип данных - это под диапазон типа данных целого числа без знака, C! должен хранить n младших бит ячейки (8 <= n <= биты/ячейка). Учитывая диапазон допустимых представлений числа и их известное кодирование, "TRUE xx C! xx C@" должно оставить элемент стека с некоторым набором битов, который будет принят словом IF как ненулевой. 5) Для целей ввода (KEY, ACCEPT, и т.д.) и вывода (EMIT, TYPE, и т.д.), кодирование между числами и удобочитаемыми символами - это ISO646/IRV (ASCII) в пределах диапазона от 32 до 126 (пробел в ~). EBCDIC - исключен (большинство компьютерных систем "EBCDIC" также поддерживает ASCII). Вне этого диапазона, это - на уровне реализации. Очевидный выбор реализации это использовать управляющие символы ASCII для диапазона от 0 до 31, по крайней мере, для "отображаемых" символов в этом диапазоне (TAB, RETURN, LINEFEED, FORMFEED). Однако это - не столь же ясно, как это может казаться, из-за различий между операционными системами в трактовке этих символов. Например, в некоторых системах TAB по 4 символьным границам, в других по 8 символьным границам, и в иных по предварительно устанавливаемым табуляторам. Некоторые системы исполняют автоматический перевод строки после перевода каретки, другие исполняют автоматический перевод каретки после перевода строки, и другие не делают ни чего. Коды от 128 до 255 могут, в конечном счете, быть стандартизированы формально или неформально для использования как интернациональных символов, типа символов с диакритическими знаками, находимых во многих Европейских языках. Одно такое кодирование - 8-bit ISO Latin-1 набор символов. Компьютерный рынок в целом, в конечном счете, решит, какой набор кодирования этих символов будет преобладать. Для реализаций Forth выполняющихся под операционной системой (большинство их выполняется на стандартных платформах этих дней), большинство разработчиков Forth будет вероятно делать выбор не зависимо от того что делает система, без выполнения какого либо перекодирования в пределах самой системы Forth. 146 6) Стандартная программа может зависеть от способности получать любой символ в диапазоне 32 ... 126 посредством KEY, и подобно отображать тот же самый набор символов с помощью EMIT. Если программа должна мочь получать или отображать любой специфический символ вне этого диапазона, она может объявить зависимость от окружения на способность получать или отображать этот символ. 7) Стандартная программа не может использовать управляющие символы в именах определений. Однако Стандартная система не требует устанавливать это запрещение. Таким образом, существующие системы, которые в настоящее время позволяют управляющие символы в именах слов из BLOCK источника, могут продолжать позволять их, и программы, выполняющиеся на этих системах, продолжат работать. В источнике текстового файла, действие синтаксического анализа с пробелом как разделителем (например, BL WORD) обрабатывает управляющие символы так же как пробелы. Это эффективно подразумевает, что Вы не можете использовать управляющие символы в именах определений из источника текстового файла, так как текстовый интерпретатор обработает управляющие символы как разделители. Заметьте, что это "сворачивание управляющего символа" применяется только когда разделитель пробел, таким образом фраза "CHAR ) WORD" может забирать строку содержащую управляющие символы. b) Хранение и поиск Символы передаются со стека данных в память с помощью C! и из памяти на стек данных с помощью C@. Число младших значащих бит эквивалентное звисящей-от- реализации ширине символа передается из вытолкнутого элемента стека данных в адрес выполнением C! без воздействия на любые биты в адресе назначения, которые могут включать старшую значащую часть ячейки; однако действие C@ очищает все биты старшей значащей части элемента стека данных, который оно туда помещает - вне зависящей-от-реализациой ширины символа (который может включать информацию дисплея определенную реализацией в битах старшей значащей части). Программист должен иметь в виду, что использование с произвольными элементами стека слов предназначенных для символьного типа данных может приводить к усечению таких данных. c) Манипуляции на стеке В дополнение к C@ и C!, символы перемещаются на стек, из стека и на стеке данных следующими словами: >R ?DUP DROP DUP OVER PICK R> R@ ROLL ROT SWAP d) Дополнительные операции Следующие математические операторы допустимы для символьных данных: + - * / /MOD MOD Следующие сравнения и поразрядные операторы могут быть допустимы для символов, имеющих в виду, что отображаемая информация, кэшируемая в самых старших битах символов определенным реализацией способом, может быть замаскирована или иначе имеет дело с: AND OR > < U> U< = <> 0= 0<> MAX MIN LSHIFT RSHIFT 147 А.3.1.3 ________________ Типы одна-ячейка Элемент стека одна-ячейка, рассматриваемый без отношения к типизации - фундаментальный тип данных Forth. Все другие типы данных фактически представлены одним или более элементами стека одна-ячейка. a) Хранение и поиск Данные одна-ячейка передаются со стека в память посредством !; из памяти на стек посредством @. Все биты передаются в обоих направлениях, и никакой контроль соответствия типов любой разновидности не выполняется; также Стандартная система не проверяет что адрес памяти, используемый ! или @ должным образом выровнен или имеет должный размер для размещения данной величины, таким способом передаваемой. b) Манипуляции на стеке Вот выбор наиболее важных слов, которые перемещают данные одна-ячейка на стек, из стека и на стеке данных: ! @ >R ?DUP DROP DUP OVER PICK R> R@ ROLL ROT SWAP c) Операторы сравнения Следующие операторы сравнения универсально допустимы для одной или более одна- ячеек: = <> 0= 0<> А.3.1.3.1 _____ Флаги FALSE флаг - величина данных одна-ячейка со всеми сброшенными битами, и TRUE флаг - величина данных одна-ячейка со всеми установленными битами. Там где слова Forth, которые проверяют флаги, принимают любой ненулевой битовый образец как true, там существует понятие правильно построенного флага. Если операция, чей результат должен использоваться как флаг, может производить любую битовую маску иную, чем TRUE или FALSE, рекомендуемый порядок состоит в преобразовании результата к правильно построенному флагу посредством слова Forth 0<> так, чтобы результат любых последующих логических операций на флаге был предсказуемый. В дополнение к словам, которые перемещают, выбирают и сохраняют элементы одна- ячейка, следующие слова допустимы для операций на одном или более флаговых данных, находящихся на стеке данных: AND OR XOR INVERT А.3.1.3.2 ___________ Целые числа Величина данных одна-ячейка может быть обработана Стандартной программой как целое число со знаком. Перемещение и сохранение таких данных выполняется как для любых данных одна-ячейка. В дополнение к универсально применимым операторам для данных одна-ячейка, определенным выше, следующие математические и операторы сравнения допустимы для целых чисел со знаком одна-ячейка: * */ */MOD /MOD MOD + +! - / 1+ 1- ABS MAX MIN NEGATE 0< 0> < > 148 Учитывая одно и то же число битов, целые числа без знака обычно представляют вдвое большую величину абсолютного значения, представимую целыми числами со знаком. Величина данных одна-ячейка может быть обработана Стандартной программой как целое число без знака. Перемещение и сохранение таких данных выполняется как для любых данных одна-ячейка. Кроме того, следующие математические и операторы сравнения допустимы для целых чисел без знака одна-ячейка: UM* UM/MOD + +! - 1+ 1- * U< U> А.3.1.3.3 ______ Адреса Адрес уникально представлен как число без знака одна-ячейка и может быть обработан как такой когда перемещается на стек, из стека или на стеке. И наоборот, каждое число без знака представляет уникальный адрес (который - не обязательно адрес доступной памяти). Это один к одному отношение между адресами и числами без знака устанавливает эквивалентность между адресной арифметикой и соответствующими операциями на числах без знака. Несколько операторов предусмотрено специально для адресной арифметики: CHAR+ CHARS CELL+ CELLS и, если набор слов с плавающей точкой присутствует: FLOAT+ FLOATS SFLOAT+ SFLOATS DFLOAT+ DFLOATS Стандартная программа может никогда не предполагать специфическое соответствие между адресом Forth и физическим адресом, на который он отображен. А.3.1.3.4 ___________________ Строки со счетчиком Тенденция в ANS Forth должна переместиться к непротиворечивому использованию "c-addr u" представления строк на стеке. Использование альтернативного представления стека "адрес строки со счетчиком" не одобряется. Традиционные слова Forth WORD и FIND продолжают использовать представление "адрес строки со счетчиком" по историческим причинам. Новое слово C", добавленное как помощь перенесения для существующих программ, также использует представление строки со счетчиком. Строки со счетчиком остаются полезными как способ сохранить строки в памяти. Это использование - не запрещается, но когда ссылки к таким строкам появляются на стеке, предпочтительно использовать "c-addr u" представление. А.3.1.3.5 _________________________ Идентификаторы исполнения Ассоциация между идентификатором исполнения и определением статическая. Однажды сделанная, она не изменяется с изменениями в порядке поиска или чем-нибудь еще. Однако она не может быть уникальна, например, фразы ' 1+ и ' CHAR+ могут возвращать одно и то же значение. 149 3.1.4 _______________ Типы пара-ячеек a) Хранение и поиск Чтобы выбирать и сохранять пары-ячеек, предусмотрены два оператора: 2@ 2! b) Манипуляции на стеке Дополнительно, эти операторы могут использоваться для перемещения пары-ячеек из стека, на стек и на стеке: 2>R 2DROP 2DUP 2OVER 2R> 2SWAP 2ROT c) Сравнение Следующие операции сравнения универсально допустимы для пары-ячеек: D= D0= А.3.1.4.1 ______________________ Целые числа две-ячейки Если целое число две-ячейки должно быть обработано как знаковое, допустимы следующие операции сравнения и математические операции: D+ D- D< D0< DABS DMAX DMIN DNEGATE M*/ M+ Если целое число две-ячейки должно быть обработано как без знаковое, допустимы следующие операции сравнения и математические операции: D+ D- UM/MOD DU< А.3.1.4.2 _________________ Символьные строки См.: 3.1.3.4 Строки со счетчиком. А.3.2 _________________ Среда Реализации А.3.2.1 _____ Числа Традиционно, Forth был реализован на машинах с дополнительным кодом (дополнение до двух), где есть взаимно-однозначное соответствие чисел со знаком и чисел без знака - любой элемент одна-ячейка может рассматриваться или как знаковое или без знаковое число. Действительно, знаковое представление любого положительного числа идентично эквивалентному представлению без знака. Далее, адреса обрабатываются как числа без знака: нет никакого отдельного указателя типа. 150 Арифметика, предписываемая на машинах с дополнительным кодом позволяет выполнять + и - со знаковыми и без знаковыми числами. Это арифметическое поведение глубоко внедрено в обычную практику Forth. Как следствие этих поведений, возможные диапазоны знаковых и без знаковых чисел, для реализаций базирующихся на каждой из допустимых арифметических архитектур, таковы: ------------------------------------------------------------------ Арифметическая архитектура Числа со знаком Числа без знака ------------------------------------------------------------------ Дополнительный код -n-1 to n 0 to 2n+1 Обратный код -n to n 0 to n Величина со знаком -n to n 0 to n ------------------------------------------------------------------ где n - самое большое положительное число со знаком. Для всех трех архитектур, знаковые числа в диапазоне от 0 до n поразрядно идентичны соответствующим числам без знака. Заметьте, что числа без знака на машине с арифметикой величины со знаком эквивалентны знаковым не отрицательным числам как следствие необходимого соответствия между адресами и числами без знака и требуемым поведением + и -. Для ссылок, эти представления чисел могут быть определены способом, в котором применено NEGATE: Дополнительный код: : NEGATE INVERT 1+ ; Обратный код: : NEGATE INVERT ; Величина со знаком: : NEGATE HIGH-BIT XOR ; где HIGH-BIT - битовая маска только на самый старший бит. Заметьте, что все эти системы счисления соглашаются в представлении неотрицательных чисел. Посредством 3.2.1.1 Внутреннее представление числа и 6.1.0270 0=, разработчик должен гарантировать, что никакое стандартное или поддерживаемое слово не возвращает отрицательный нуль для любого числового (не булевого или флагового) результата. Иначе будет нарушено много существующих программистских допущений. Не требуется реализовывать ни круговую без знаковую арифметику, ни устанавливать диапазон чисел без знака на полный размер ячейки. Есть исторический прецедент для ограничения диапазона u величиной +n, который является допустимым, когда размер ячейки больше 16 бит. А.3.2.1.2 ___________________ Преобразование цифр Например, реализация могла бы преобразовывать символы с "a" по "z" тождественно в символы с "A" по "Z", или она могла бы обрабатывать символы с " [ " по "~" как дополнительные цифры с десятичной величиной с 36 по 71, соответственно. А.3.2.2 __________ Арифметика А.3.2.2.1 _____________________ Целочисленное деление Forth-79 Стандарт определяет что знаковые операторы деления (/, /MOD, MOD, */MOD, и */) округляют частные нецелого числа к нулю (симметричное деление). Forth 83 изменяет семантику этих операторов на округление к отрицательной бесконечности (минимальное деление). 151 Некоторые в семействе Forth отказались преобразовывать системы и приложения из Forth-79 деления в Forth-83 деление. Чтобы разрешить эту проблему, ANS Forth системе разрешается поставлять или минимальные или симметричные операторы. Кроме того, ANS Forth системы должны предоставлять примитив минимального деления (FM/MOD), примитив симметричного деления (SM/REM), и оператор умножения смешанной точности (M*). Этот компромисс защищает инвестиции, сделанные в текущие приложения Forth; Forth-79 и Forth-83 программы автоматически совместимы с ANS Forth относительно деления. На практике, направление округления редко имеет значение для приложений. Однако если программа требует специфического направления округления, она может использовать примитив минимального деления FM/MOD или примитив симметричного деления SM/REM, для создания оператора деления желательной разновидности. Эта простая методика может использоваться для преобразования Forth-79 и Forth-83 программ в ANS Forth, без какого либо анализа исходных программ. А.3.2.2.2 _____________________________ Другие целочисленные операции Происходит ли антипереполнение, зависит от типа данных результата. Например, фраза 1 2 - дает антипереполнение, если результат без знака и производит допустимый знаковый результат -1. А.3.2.3 _____ Стеки Единственный тип данных в Forth, который скорее имеется реально, чем существует абстрактно - это вход стека. Даже эта примитивная типизация Forth предписывается только жесткой действительностью антипереполнения или переполнения стека. Программист должен иметь ясное представление относительно количества стековых входов, которые будут использованы выполнением слова и количества входов, которые будут помещены назад на стек выполнением слова. Наблюдение аномальных случаев на стеке данных - первая линия обороны, посредством чего программист может распознать ошибки в прикладной программе. Также стоит помнить, что множество ошибок стека вызванных ошибочным прикладным кодом, имеют часто равную и противоположную величину, вызывая комплиментарный (и вводящий в заблуждение) результат. По этим причинам и массе других причин, одна недвусмысленная, бесспорная, и необходимая дисциплина программирования, наблюдаемая начиная с самых ранних дней Forth - это обеспечение стековых диаграмм для всех добавлений к прикладному словарю за исключением статических конструкций типа VARIABLE и CONSTANT. А.3.2.3.2 ______________________ Стек потока управления Самое простое использование слов потока управления это реализовать базовые управляющие структуры, показанные на рисунке А.1. --------------------------------------------------------------- | _____ | _____ | < >----- IF | \| BEGIN | \| BEGIN | | | +-------+ | +-------+ +-------+ | | | | | | | | | | | +-------+ | +-------+ +-------+ | | | | | | _____| -----< > UNTIL ------ AGAIN |/ THEN | | | --------------------------------------------------------------- Рисунок А.1 - Базовые образцы потока управления. 152 В потоке управления каждый переход или передача управления должны заканчиваться в некотором месте назначения. Естественная реализация использует стек, чтобы помнить начала переходов вперед и назначения ветвлений назад. Как минимум, только местоположение каждого начала или назначения должно быть обозначено, хотя другая зависящая-от-реализации информация также может быть сохранена. Начало - это непосредственно местоположение перехода. Назначение - то, где управление будет продолжено, если переход был принят. Назначение необходимо для разрешения адреса перехода для каждого начала, и наоборот, если каждая цепочка потока управления завершена, не может остаться никакое неиспользованное назначение. С добавлением только трех слов (AHEAD, CS-ROLL и CS-PICK), базовые слова потока управления поставляют примитивы, необходимые для компиляции разнообразных переносимых структур управления. Требуемые способности - компиляция прямого и обратного условного и безусловного переходов и организация во время компиляции начал и назначений переходов. Таблица 1 показывает желаемое поведение. Требование, чтобы слова потока управления были должным образом сбалансированы другими словами потока управления, делает разумным описание определенного реализацией стека потока управления во время компиляции. Нет никакого предписания относительно того, как стек потока управления реализован, например, стек данных, связанный список, специальный массив. Каждый элемент упомянутого выше стека потока управления - одинакового размера. Таблица А.1 - Поведение компиляции слов потока управления --------------------------------------------------------------------------- во время компиляции, слово: поставки: разрешения: используется для: --------------------------------------------------------------------------- IF orig отмечает начало условного перехода вперед THEN orig разрешает IF или AHEAD BEGIN dest отмечает назначение назад AGAIN dest разрешает безусловный переход назад UNTIL dest разрешает условный переход назад AHEAD orig отмечает начало безусловного перехода вперед CS-PICK копирует элемент на стеке потока управления CS-ROLL переупорядочивает элементы на стеке потока управления --------------------------------------------------------------------------- С этим инструментарием могут быть определены оставшиеся базовые элементы управляющих структур, показанные на рисунке А.2; стековая нотация, используемая здесь для слов немедленного исполнения - это ( компиляция / выполнение). : WHILE ( dest -- orig dest / flag -- ) \ условный выход из циклов POSTPONE IF \ условный переход вперед 1 CS-ROLL \ сохранить dest на верху ; IMMEDIATE 153 : REPEAT ( orig dest -- / -- ) \ разрешение единственного WHILE и возврат к BEGIN POSTPONE AGAIN \ безусл. переход назад к dest POSTPONE THEN \ разрешение перехода вперед из orig ; IMMEDIATE : ELSE ( orig1 -- orig2 / -- ) \ разрешение IF обеспечивающего альтернативное выполнение POSTPONE AHEAD \ безусловный переход вперед orig2 1 CS-ROLL \ положить orig1 снова наверх POSTPONE THEN \ разрешение перехода вперед из orig1 ; IMMEDIATE ----------------------------------------------- | _____ | < >----- IF | \| BEGIN | | | +-------+ +-------+ | | | | | | | | +-------+ +-------+ | | | | _____| | < >----- WHILE _____/ / ELSE | | | | | | +-------+ | | +-------+ | | | | | | | | +-------+ | | +-------+ | | | |_____ | |_____/ _____| \| THEN / REPEAT | | ---------------------------------------------- Рисунок А.2 - Дополнительные базовые образцы потока управления. Поток управления Forth предоставляет решение для известной проблематики строго структурированного программирования. Базовые управляющие структуры могут быть дополнены, как показано в примерах на рисунке А.3, с дополнительными WHILE в BEGIN ... UNTIL и BEGIN ... WHILE ... REPEAT структурах. Однако, для каждого дополнительного, WHILE должен быть THEN в конце структуры. THEN завершает синтаксис с WHILE и указывает где продолжить выполнение, когда WHILE передаст управление. Использование больше чем одного дополнительного WHILE возможно, но не общепринято. Заметьте, что если пользователь находит это использование THEN нежелательным, может быть определен псевдоним с более приятным именем. Дополнительные действия могут быть выполнены между словом потока управления (REPEAT или UNTIL) и THEN, которое соответствует дополнительному WHILE. Далее, если для нормального завершения и раннего завершения желательны дополнительные действия, альтернативные действия могут быть разделены обычным Forth ELSE. Действия завершения - все определены после тела цикла. 154 -------------------------------------------------- _____ | _____ | | \| BEGIN | \| BEGIN | +-------+ | +-------+ | | | | | | | +-------+ | +-------+ | | | | | < >------ WHILE | < >----- WHILE | | | | | | | +-------+ | | +-------+ | | | | | | | | | | +-------+ | | +-------+ | | | | | | | | < >---- | WHILE -----< > | UNTIL | | | | | | | +-------+ | | +-------+ | | | | | | | | | | +-------+ | | +-------+ | | | ____| | | _____/ \____/ / | REPEAT _____/ / ELSE | | | | +-------+ | | +-------+ | | | | | | +-------+ | | +-------+ | ______/ \____ | |/ THEN \| THEN | | --------------------------------------------------- Рисунок А.3 - Примеры расширения образцов потока управления. Заметьте, что REPEAT создает аномалию при сопоставлении WHILE с ELSE или THEN, более примечательную по сравнению с BEGIN...UNTIL случаем. То есть будет меньше одним ELSE или THEN чем есть WHILE, потому что REPEAT разрешает один THEN. Как и выше, если пользователь находит это число несоответствий нежелательным, REPEAT могло быть заменено его собственным действующим определением. Могут быть определены другие слова потока управления выхода из цикла, и даже другие циклы. Единственное требование - это что стек потока управления должным образом обслуживается и управляется. Простая реализация ANS Forth CASE структуры ниже - пример расширения управляющей структуры. Заметьте, обслуживание стека данных не допускает вмешательство со стороны возможного использования стека потока управления. 0 CONSTANT CASE IMMEDIATE ( иниц. счетчика OF ) : OF ( #of -- orig #of+1 / x -- ) 1+ ( счетчик OF ) >R ( переместить со стека в случае, если ) ( стек потока управления это стек данных. ) POSTPONE OVER POSTPONE = ( копир. и тест параметра case ) POSTPONE IF ( добавить orig на стек потока управления ) POSTPONE DROP ( удалить case параметр если = ) R> ( мы должны теперь вернуть счетчик назад ) ; IMMEDIATE 155 : ENDOF ( orig1 #of -- orig2 #of ) >R ( переместить со стека в случае, если ) ( стек потока управления это стек данных. ) POSTPONE ELSE R> ( мы должны теперь вернуть счетчик назад ) ; IMMEDIATE : ENDCASE ( orig1..orign #of -- ) POSTPONE DROP ( удалить case параметр ) 0 ?DO POSTPONE THEN LOOP ; IMMEDIATE А.3.2.3.3 ______________ Стек возвратов Ограничения в разделе, 3.2.3.3 Стек возвратов - являются необходимым, если реализации разрешают помещать параметры цикла на стеке возвратов. А.3.2.6 ___________________ Запросы к окружению Размер в адресуемых элементах различных типов данных может быть определен фразами типа 1 CHARS. Точно так же выравнивание может быть определено фразами типа 1 ALIGNED. Запросы к окружению разделены на две группы: те, что всегда производят одно и тот же значение и те, которые не могут. Первые группы включают входы типа MAX- N. Эта информация фиксирована аппаратными средствами или конструкцией системы Forth; пользователю гарантируется, что выяснение вопроса однажды является достаточным. Другая группа запросов - для вещей, которые могут законно изменяться через какое-то время. Например, приложение могло бы проверить присутствие набора слов двойных чисел, используя запрос среды. Если он отсутствует, система могла бы вызывать зависимый от системы процесс для загрузки набора слов. Системе разрешается изменить ENVIRONMENT? базу данных так, чтобы последующие запросы об этом указывали, что он присутствует. Заметьте что запрос, который возвращает "unknown" ответ, может производить "known" результат на последующий запрос. А.3.3 _____________ Словарь Forth Стандартная Программа может переопределять стандартное слово на слово с нестандартным определением. Программа все еще Стандартная (так как она может быть построена на любой Стандартной системе), но результат делает объединенный объект (Стандартная система плюс Стандартная программа) нестандартной системой. А.3.3.1 _____________ Область имени 156 А.3.3.1.2 _________________ Имена определений Язык в этом разрезе должен гарантировать переносимость Стандартных Программ. Если программа использует кое-что вне Стандарта, что она не предоставляет самостоятельно, нет гарантии, что другая реализация будет иметь то, что необходимо программе для работы. Нет намерения, вообще предполагать, что все программы Forth будут так или иначе недостаточными или худшими, потому что они - не стандартные; некоторые из самых прекрасных драгоценных камней программистского искусства будут нестандартными. В то же самое время, комитет пытается гарантировать что программа, помеченная как "стандартная" будет соответствовать некоторым ожиданиям, особенно в отношении переносимости. Во многих системных средах входной источник не способен поставлять некоторые неграфические символы из-за внешних факторов, типа использования этих символов для управления потоком данных или редактирования. Кроме того, при интерпретации из текстового файла, функция синтаксического анализа специфически обрабатывает неграфические символы подобно пробелам; таким образом, слова полученные текстовым интерпретатором не будут содержать внедренные неграфические символы. Разрешение реализациям в таких средах называть себя Стандартными, является необходимым незначительным ограничением на Стандартные программы. Стандартной системе позволяется разрешать создание имен определений, содержащих неграфические символы. Исторически, такие имена использовались для функций редактирования с клавиатуры, и "невидимых" слов. А.3.3.2 ____________ Область кода А.3.3.3 ______________ Область данных Слова #TIB, >IN, BASE, BLK, SCR, SOURCE, SOURCE-ID, STATE, и TIB содержат информацию, используемую системой Forth в ее операциях, и могут быть использованы приложениями. Любое предположение сделанное приложением о данных доступных в системе Forth, которые хранятся иначе, чем данные только что перечисленные - зависимость от окружения. Нет никакого смысла в определении (в Стандарте) что является, и что не является адресуемым. Стандартная Программа НЕ может адресовать: - Непосредственно в стеки данных или возвратов; - В поле данных определения, если не сохраненное приложением. Ограничения только для чтения возникают потому, что некоторые системы Forth работают из ROM и некоторого разделения буферов ввода-вывода с другими пользователями или системами. Переносимые программы не могут знать, какие области затронуты, отсюда общие ограничения. А.3.3.3.1 ___________________ Выравнивание адреса Много процессоров имеют ограничения на адреса, которые могут использоваться командами доступа к памяти. Например, на Motorola 68000, 16-бит или 32-бит данные могут быть доступны только в четных адресах. Другие примеры включают архитектуру RISC, где 16-бит данные могут быть загружены или сохранены только в четных адресах и 32-бит данные только в адресах, которые кратны четырем. 157 Разработчик ANS Forth может справляться с этими ограничениями выравнивания одним из двух способов. Слова доступа к памяти Forth (@, !, +!, и т.д.) мог быть реализованы в терминах инструкций доступа меньшей-ширины, которые не имеют ограничений выравнивания. Например, на 68000 Forth с 16-бит ячейками, @ могло быть реализовано двумя 68000 командами выборки байта и повторной сборкой байтов в 16-бит ячейке. Хотя это скрывает аппаратные ограничения от программиста, это неэффективно, и может иметь непреднамеренные побочные эффекты в некоторых аппаратных средах. Альтернативная реализация ANS Forth могла определять каждое слово доступа к памяти, с использованием родных команд, которые наиболее близко соответствуют функциям слов. В 68000 Forth с 16-бит ячейками, @ использовало бы 68000 16-бит команду перемещения. В этом случае, ответственность за передачу к @ правильно выровненного адреса ложится на программиста. Переносимая ANS Forth программа должна предполагать, что выравнивание может требоваться и следовать требованиям этого раздела. А.3.3.3.2 ___________________ Непрерывные области Область данных системы Forth входит в прерывистые области! Местоположение некоторых областей предоставлено системой, некоторых - программой. Область данных непрерывна в пределах областей, позволяя адресной арифметике генерировать допустимые адреса только в пределах отдельной области. Стандартная Программа не может делать никакие предположения об относительном размещении множественных областей в памяти. Раздел 3.3.3.2 предписывает условия, при которых могут быть получены непрерывные зоны области данных. Например: CREATE TABLE 1 C, 2 C, ALIGN 1000 , 2000 , делает таблицу, чей адрес возвращается TABLE. При доступе к этой таблице, TABLE C@ возвратит 1 TABLE CHAR+ C@ возвратит 2 TABLE 2 CHARS + ALIGNED @ возвратит 1000 TABLE 2 CHARS + ALIGNED CELL+ @ возвратит 2000. Точно так же, CREATE DATA 1000 ALLOT делает массив в размере 1000 адресуемых элементов. Более переносимая стратегия определила бы массив в прикладных элементах, типа: 500 CONSTANT NCELLS CREATE CELL-DATA NCELLS CELLS ALLOT Этот массив может быть индексирован подобно этому: : LOOK NCELLS 0 DO CELL-DATA I CELLS + ? LOOP ; А.3.3.3.6 ________________________ Другие временные области Во многих существующих системах Forth, эти области - в HERE или сразу вне ее, отсюда многие ограничения. 158 (2*n)+2 - размер символьной строки, содержащей без знаков препинания двоичное представление максимального двойного числа с ведущим знаком "минус" и завершающим пробелом. Примечание реализации: Так как минимальное значение n - это 16, абсолютный минимальный размер выходной строки отображаемого числа - 34 символа. Но если ваша реализация имеет больший n, вы должны также увеличить размер выходной строки отображаемого числа. А.3.4 __________________________ Интерпретатор текста Forth А.3.4.3 _________ Семантика "Семантика инициирования" соответствуют коду, который выполняется после входа в определение, аналогично коду, выполняемому EXIT после выхода из определения. "Семантика времени-выполнения" соответствует кодовым фрагментам, типа литералов или ветвлений, которые откомпилированы внутри определения через двоеточие словами с явной семантикой компиляции. В кросс-компиляторе Forth может быть определена семантика выполнения, чтобы иметь место только в главной системе, только в целевой системе, или в обеих системах. Например, это может быть свойственно словам типа CELLS выполняющимся на главной системе и возвращающим значение описывающее целевую, для определений через двоеточие выполняющимся только на целевой, и для CONSTANT и VARIABLE имеющих поведение при выполнении на обеих системах. Подробности поведения кросс-компилятора вне контекста этого Стандарта. А.3.4.3.2 _______________________ Семантика интерпретации Ввиду разнообразных причин, этот Стандарт не определяет семантику интерпретации для каждого слова. Примеры этих слов - >R, .", DO, и IF. Ничто в этом Стандарте не препятствует реализациям обеспечивать семантику интерпретации для этих слов, типа интерактивные слова потока управления. Однако, Стандартные Программы не могут использовать их в состоянии интерпретации. А.3.4.5 __________ Компиляция Рекурсия компилятора на уровне определения потребляет чрезмерные ресурсы, особенно поддержка locals. Технический Комитет не полагает, что выгоды покрывают затраты. Вложение определений - также не общая практика и не будет работать на многих системах. А.4 ___________________________ Документационные требования А.4.1 ______________________ Системная документация А.4.2 ________________________ Программная документация А.5 _________________________ Соглашение и наименование А.5.1 _________________ ANS Forth системы 159 Раздел 5.1 определяет критерии, которым система должна удовлетворять, чтобы оправдывать обозначение "ANS Forth Система". Кратко, минимальное требование - это система должна "реализовать" Основной набор слов. Есть несколько путей, которыми это требование может быть выполнено. Наиболее очевидное - что все Основные слова могут быть в пред-откомпилированном ядре. Однако это не единственный путь удовлетворения требования. Например, некоторые слова могут быть предоставлены в исходных блоках или файлах с командами, объясняющими как добавлять их в систему, если они необходимы. Пока слова предоставлены таким способом, что пользователь может получить доступ к ним с ясной и прямой процедурой, они могут рассматриваться как присутствующие. Кросс-компилятор Forth имеет много характерного общего с ANS Forth Системой, в том числе оба используют подобные средства компиляции для обработки программы. Однако чтобы полностью определить ANS Forth кросс-компилятор, было бы необходимо обращаться к сложным проблемам, имеющим дело с компиляцией и семантикой выполнения в ведущих и целевых средах также как проблемам ROM- базирования. Степень усилий для выполнения этого должным образом, оказывается не практичной в это время. В результате, хотя может быть возможно для Forth кросс-компилятора правильно готовить ANS Forth программу к выполнению в целевой среде, неуместно для кросс-компилятора быть обозначенным ANS Forth Системой. А.5.2 ___________________ ANS Forth программы А.5.2.2 ________________________ Программное наименование Объявление зависимости от окружения не должно рассматриваться нежелательным, просто подтверждение, что автор воспользовался преимуществом некоторой принятой архитектуры. Например, большинство компьютеров в обычном использовании основано на двоичной арифметике дополнительного кода (дополнение до двух). Подтверждая зависимость от окружения на этой архитектуре, программист становится имеющим право использовать число -1, чтобы представить весь набор битов без значительного ограничения переносимости программы. Поскольку все программы требуют пространства для данных и команд, и времени, чтобы выполнить эти команды, они зависят от присутствия среды, предоставляющей эти ресурсы. Невозможно предсказать как мало некоторых из этих ресурсов (например, стековое пространство) может быть необходимо для исполнения некоторой задачи, поэтому этот Стандарт так не делает. С другой стороны, поскольку программа требует увеличивающихся уровней ресурсов, будет вероятно постепенно меньшее количество систем, на которых она выполнится успешно. Алгоритм требующий массива 109 ячеек мог бы работать на меньшем количестве компьютеров чем требующий только 103. Так как нет также никакого способа знать, какой минимальный уровень ресурсов будет реализован в системе полезной, по крайней мере, для некоторых задач, любая программа, выполняющая реальную работу, и помеченная просто "ANS Forth Программа" вряд ли помечена правильно. 160 A.6 _______ Словарь В этом и последующих разделах мы представляем объяснения для обработки специфических слов: почему мы включили их, почему мы поместили их в некоторые наборы слов, или почему мы так определили их имена или значение. Слова в этом разделе организованы в наборы слов, с сохранением их индексных номеров для простой системы перекрестных ссылок к словарю. Исторически, много систем Forth были написаны в Forth. Многие из слов в Forth первоначально имели как первичную цель непосредственно поддержку системы Forth. Например, WORD и FIND часто используются как основные инструменты интерпретатора текста Forth, и CREATE во многих системах - примитив для формирования входов словаря. В определении слов типа этих стандартным способом, мы пытались не препятствовать их использованию разработчиками. Одна из возможностей Forth, который вызвал любовь к нему его пользователей - это то, что одни и те же инструментальные средства, использующиеся для реализации системы, являются доступными прикладному программисту - результат этого подхода это компактность и эффективность, которая характеризует большинство реализаций Forth. A.6.1 ______________ Основные слова A.6.1.0070 ' Типичное использование: ... ' name . Много систем Forth используют это изящное слово. Многие нет. ANS Forth наследует использование Forth 83. См.: 3.4.3..2 Семантика интерпретации, A.6.1.1550 FIND. A.6.1.0080 ( Типичное использование: ... ( ccc) ... A.6.1.0140 +LOOP Типичное использование: : X ... limit first DO ... step +LOOP ; A.6.1.0150 , Использование , (запятая) для компиляции идентификаторов исполнения - не переносимое. См.: 6.2.0945 COMPILE,. A.6.1.0190 ." Типичное использование: : X ... ." ccc" ... ; Реализация может определять семантику интерпретации для ." если желательно. В одной вероятной реализации, интерпретация ." отобразила бы разграниченное сообщение. В другой вероятной реализации, интерпретация ." компилировала бы код для отображения сообщения позже. В еще другой вероятной реализации, интерпретация ." была бы обработана как исключение. Обусловленная этими вариантами Стандартная Программа не может использовать ." при интерпретации. Точно так же Стандартная Программа не может компилировать POSTPONE ." внутри нового слова, и затем использовать это слово при интерпретации. 161 A.6.1.0320 2* Исторически 2* было реализовано на машинах с дополнительным кодом (дополнение до двух) как логическая команда левого сдвига. Умножение на два - эффективный побочный эффект на этих машинах. Однако смещение подразумевает знание значения и позиции битов в ячейке. В то время как имя подразумевает умножение, большинство разработчиков использует аппаратный левый сдвиг для реализации 2*. A.6.1.0330 2/ Это слово имеет то же самое общее использование и следствие неверного названия как 2*. Оно часто реализовано на машинах с дополнительным кодом (дополнение до двух) с аппаратным правым сдвигом, который распространяет знаковый разряд. A.6.1.0350 2@ Для 2@ порядок сохранения определен Стандартом. A.6.1.0450 : Типичное использование: : name ... ; В Forth 83, это слово было определено для изменения порядка поиска. Эта спецификация явно удалена в этом Стандарте. Мы полагаем, что в большинстве случаев это не имеет никакого эффекта; однако системы, которые разрешают много порядков поиска, нашли Forth-83 поведение двоеточия очень нежелательным. Заметьте, что двоеточие самостоятельно не вызывает компилятор. Двоеточие устанавливает состояние компиляции так, чтобы более поздние слова в области анализа были откомпилированы. A.6.1.0460 ; Типичное использование: : name ... ; Одна функция выполняемая ; и ;CODE это позволить текущему определению быть найденным в словаре. Если текущее определение было создано с помощью :NONAME текущее определение не имеет имя определения и таким образом не может быть найдено в словаре. Если :NONAME реализовано, компилятор Forth должен сохранить достаточно информации о текущем определении, чтобы позволить ; и ;CODE определить, действительно ли должно быть предпринято какое либо действие, чтобы позволить ему быть найденным. A.6.1.0550 >BODY a-addr - адрес, который HERE возвратило бы, если бы было выполнено немедленно после выполнения CREATE которое определило xt. A.6.1.0680 ABORT" Типичное использование: : X ... test ABORT" ccc" ... ; A.6.1.0695 ACCEPT Предыдущие стандарты определяли, что накопление входной строки заканчивается, когда получен "возврат" или когда было получено +n1 символов. Завершение, когда было получено +n1 символов, трудно, дорого, или невозможно осуществить в некоторых системных средах. Следовательно, множество существующих реализаций не подчиняется с этим требованиям. 162 Так как редактирование строки и функции накопления часто реализуются системными компонентами вне контроля реализацией Forth, этот Стандарт не налагает никакое такое требование. Стандартная Программа может только предполагать, что она может получать ввод строки от ACCEPT или EXPECT. Детальная последовательность пользовательских действий, необходимых для подготовки и передачи этой строки, вне контекста этого Стандарта. Спецификация ненулевого, положительного целочисленного счетчика (+n1) для ACCEPT позволяет некоторым разработчикам продолжать их практику использования нуля или отрицательной величины как флага для вызова специального поведения. Поскольку такое поведение вне Стандарта, Стандартные программы не могут зависеть от этого, но Технический Комитет не желает излишне препятствовать этому. Так как фактические значения - почти всегда маленькие целые числа, никакие функциональные возможности не повреждаются этим ограничением. ACCEPT и EXPECT исполняют схожие функции. ACCEPT рекомендуется для новых программ, и будущее использование EXPECT, не одобряется. Рекомендуется, чтобы все неграфические символы были зарезервированы для функций редактирования или управления и не были сохранены во входной строке. Обычно, когда пользователь готовит входную строку, которая будет передана программе, система позволяет пользователю редактировать эту строку и исправлять ошибки перед передачей заключительной версии строки. Функция редактирования предоставлена иногда непосредственно Forth системой, и иногда внешним системным программным обеспечением или аппаратными средствами. Таким образом, управляющие символы и функции не могут быть доступны на всех системах. В обычном случае конец процесса редактирования и заключительной передачи строки обозначается пользователем нажатием клавиши "Return" или "Enter". Как в предыдущих стандартах, EXPECT возвращает входную строку немедленно после ввода требуемого числа символов, а также когда получен признак конца строки. Широко рассматриваемое поведение "автоматического завершения, после того как было введено определенное количество символов" нежелательно, потому что пользователь "потеряет контроль" процесса входного редактирования в потенциально неизвестное время (пользователь не обязательно знает, сколько символов требовалось от, EXPECT). Таким образом, EXPECT и SPAN были сделаны устаревшими и существуют в Стандарте только как уступка существующим реализациям. Если EXPECT существует в Стандартной Системе, оно должно иметь поведение "автоматического завершения". ACCEPT не имеет поведения "автоматического завершения" EXPECT. Однако, потому что внешние системные аппаратные средства и программное обеспечение могут исполнять функцию ACCEPT, когда получен признак конца строки действие курсора, и, следовательно, отображение - определенное реализацией. Рекомендуется, чтобы курсор остался немедленно после введенного текста после получения признака конца строки. A.6.1.0705 ALIGN В этом Стандарте мы попытались предусмотреть переносимость между различными CPU архитектурами. Одна из частых причин проблем переносимости - требование выровненных на ячейку адресов на некоторых CPU. На этих системах ALIGN и ALIGNED могут требоваться, чтобы формировать и прослеживать структуры данных, сформированные с помощью C,. Разработчики могут определять эти слова как пустые команды на системах, для которых они - не функциональны. A.6.1.0706 ALIGNED См.: A.6.1.0705 ALIGN. 163 A.6.1.0760 BEGIN Типичное использование: : X ... BEGIN ... test UNTIL ; или : X ... BEGIN ... test WHILE ... REPEAT ; A.6.1.0770 BL Поскольку пробел используется повсюду в Forth как стандартный разделитель, это слово единственный путь программе найти и использовать системное значение "пробела". Значение символа пробела не может быть получено с помощью CHAR, например. A.6.1.0880 CELL+ Как ALIGN и ALIGNED, слова CELL и CELL+ были добавлены, чтобы помочь в переносимости между системами с различными размерами ячейки. Они предназначены для использования в управлении индексами и адресами в целых числах размеров ячеек. Пример: 2VARIABLE DATA 0 100 DATA 2! DATA @ . 100 DATA CELL+ @ . 0 A.6.1.0890 CELLS См.: A.6.1.0880 CELL+. Пример: CREATE NUMBERS 100 CELLS ALLOT ( Назначает пространство в массиве NUMBERS для 100 ячеек данных.) A.6.1.0895 CHAR Типичное использование: ... CHAR A CONSTANT "A" ... A.6.1.0950 CONSTANT Типичное использование: ... DECIMAL 10 CONSTANT TEN ... A.6.1.1000 CREATE Адрес области данных слова, определенного CREATE, дается указателем области данных немедленно после выполнения CREATE. Резервирование пространства поля данных типично делается с помощью ALLOT. Типичное использование: ... CREATE SOMETHING ... 164 A.6.1.1240 DO Типичное использование: : X ... limit first DO ... LOOP ; или : X ... limit first DO ... step +LOOP ; A.6.1.1250 DOES> Типичное использование: : X ... DOES> ... ; Относительно DOES>, Стандартная Программа не может делать какие-либо предположения относительно способности находить имя определения содержащего DOES> или любое предыдущее определение чье имя может быть скрыто этим. DOES> эффективно заканчивает одно определение и начинает другое насколько заинтересованы переменные local и структуры потока управления. Поведение компиляции проясняет, что пользователь не имеет право помещать DOES> внутри любых структур потока управления. A.6.1.1310 ELSE Типичное использование: : X ... test IF ... ELSE ... THEN ; A.6.1.1345 ENVIRONMENT? В Стандартной Системе, которая содержит только Основной набор слов, эффективное использование ENVIRONMENT? требует или его использования в пределах определения, или использования обеспеченного пользователем вспомогательного определения. Основной набор слов испытывает недостаток прямого метода сборки строки в состоянии интерпретации (11.6.1.2165 S" находится в дополнительном наборе слов), а также средства для проверки возвращенного флага в состоянии интерпретации (например, дополнительный 15.6.2.2532 [IF]). Комбинация 6.1.1345 ENVIRONMENT?, 11.6.1.2165 S", 15.6.2.2532 [IF], 15.6.2.2531 [ELSE], and 15.6.2.2533 [THEN] составляет эффективный набор слов для условной компиляции, которая работает в состоянии интерпретации. A.6.1.1360 EVALUATE Технический Комитет знает, что эта функция обычно записывается как EVAL. Однако существуют реализации, которые могут страдать от определения слова сделанного так как здесь. Мы также находим EVALUATE более читабельным и ясным. Было некоторое мнение для вызова INTERPRET, но это также имело бы нежелательные действия на существующий код. Длинное написание не считали существенным, так как это - не то слово, которое должно использоваться часто в исходном тексте. A.6.1.1380 EXIT Типичное использование: : X ... test IF ... EXIT THEN ... ; 165 A.6.1.1550 FIND Одна из более трудных проблем, которые Комитет решал, была проблема отделения спецификации механизмов реализации от спецификации Forth языка. Могут быть быстро перечислены три основных подхода реализации: 1) Механизмы шитого кода. Это традиционные подходы к реализации Forth, но могут использоваться другие методы. 2) Подпрограммный шитый с "макрорасширением" (копирование кода). Короткие подпрограммы, подобно коду для DUP, скорее скопированы в определение, чем скомпилирована JSR ссылка. 3) Непосредственное кодирование с оптимизацией. Это может включать оптимизацию стека (заменяющую такие фразы как SWAP ROT + одной или двумя машинными командами, например), распараллеливание (тенденция в более новых чипах RISC - это иметь несколько функциональных подэлементов которые могут выполняться параллельно), и так далее. Первоначальное требование (унаследованное от Forth 83) это адреса компиляции откомпилированы в словарь, исключая типы реализации 2 и 3. Типа 3 механизмы и оптимизации типа 2 реализаций, были затруднены явной спецификацией непосредственного исполнения или не непосредственного исполнения всех стандартных слов. POSTPONE позволяет де-спецификацию непосредственного исполнения или не непосредственного исполнения для всех кроме нескольких слов Forth, чье поведение должно быть STATE -независимо. Один тип 3 реализации, cmForth Чарльза Мура, имеет версии компиляции и интерпретации многих слов Forth. В настоящем, это, кажется общим подходом для типа 3 реализации. Комитет чувствовал, что этот подход реализации должен быть разрешенным. Следовательно, возможно, что слова без семантики интерпретации могут быть найдены только в течение компиляции, и другие слова могут существовать в двух версиях: версия компиляции и версия интерпретации. Следовательно, значения возвращенные FIND, могут зависеть от STATE, и ' и ['] могут быть не способны найти слова без семантики интерпретации. A.6.1.1561 FM/MOD Представляя требование для "минимального" деления, Forth 83 произвел много споров и беспокойств со стороны тех, кто предпочли более обычную практику, поддерживаемую в других языках, реализации деления согласно поведению ведущего CPU, которое наиболее часто симметричное (округленное к нулю). В попытке найти компромиссную позицию, этот Стандарт предусматривает примитивы для обеих общих разновидностей, минимального и симметричного (см. SM/REM). FM/MOD - минимальная версия. Технический Комитет рассмотрел обеспечение двух законченных наборов явно именованных операторов деления, и отказался делать так на том основании, что это незаконно увеличило бы и усложнило Стандарт. Вместо этого, разработчики могут определять нормальные слова деления в терминах или FM/MOD или SM/REM, предоставляя обоснование их выбора. Пожелание людей иметь явно именованные наборы операторов поощряются. FM/MOD может использоваться, например, для определения: 166 : /_MOD ( n1 n2 -- n3 n4) >R S>D R> FM/MOD ; : /_ ( n1 n2 -- n3) /_MOD SWAP DROP ; : _MOD ( n1 n2 -- n3) /_MOD DROP ; : */_MOD ( n1 n2 n3 -- n4 n5) >R M* R> FM/MOD ; : */_ ( n1 n2 n3 -- n4 ) */_MOD SWAP DROP ; A.6.1.1700 IF Типичное использование: : X ... test IF ... THEN ... ; или : X ... test IF ... ELSE ... THEN ... ; A.6.1.1710 IMMEDIATE Типичное использование: : X ... ; IMMEDIATE A.6.1.1720 INVERT Слово NOT было первоначально предусмотрено в Forth как оператор флага, чтобы делать структуры управления читаемыми. При его назначенном использовании следующие два определения произвели бы идентичный результат: : ONE ( flag -- ) IF ." true" ELSE ." false" THEN ; : TWO ( flag -- ) NOT IF ." false" ELSE ." true" THEN ; Это было обычное использование до Forth-83 Стандарта, который переопределил NOT как в ячейку шириной операцию обратного кода (дополнение до единицы), функционально эквивалентную фразе -1 XOR. В то же самое время, тип данных, управляемый этим словом был изменен от флага до набора битов в ячейку шириной, и стандартное значения для true было изменено с "1" (набор только бита младшего разряда) на "-1" (весь набор битов). Поскольку эти определения TRUE и NOT были несовместимы с их предыдущими определениями, много пользователей Forth продолжают полагаться на старые определения. Следовательно, обе версии находятся в общем использовании. Поэтому использование NOT не может быть стандартизировано в это время. Два традиционных значения NOT - это отрицание смысла флага и выполнение операции обратного кода (дополнение до единицы) - сделаны доступными благодаря 0= и INVERT, соответственно. A.6.1.1730 J J может только использоваться со вложенными, DO...LOOP, DO...+LOOP, ?DO...LOOP, or ?DO...+LOOP, например, в форме: : X ... DO ... DO ... J ... LOOP ... +LOOP ... ; 167 A.6.1.1760 LEAVE Заметьте, что LEAVE немедленно завершает цикл. Никакие слова после LEAVE в пределах цикла не будут выполнены. Типичное использование: : X ... DO ... IF ... LEAVE THEN ... LOOP ... ; A.6.1.1780 LITERAL Типичное использование: : X ... [ x ] LITERAL ... ; A.6.1.1800 LOOP Типичное использование: : X ... limit first DO ... LOOP ... ; или : X ... limit first ?DO ... LOOP ... ; A.6.1.1810 M* Это слово - полезный ранний шаг в вычислениях, давая реальную дополнительную точность. Это было в использовании, начиная с Forth систем начала 1970-ых. A.6.1.1900 MOVE CMOVE и CMOVE> - первичные операторы перемещения в Forth 83. Они определяют поведение для перемещения, которое предполагает размножение, если перемещение вызвано соответствующим образом. В некоторых аппаратных средствах, это специфическое поведение не может быть достигнуто, используя самую лучшую команду перемещения. Кроме того, CMOVE и CMOVE> перемещают символы; ANS Forth нуждается в команде перемещения, способной иметь дело с адресуемыми элементами. Таким образом, MOVE было определено и добавлено к Основному набору слов, и CMOVE и CMOVE> были перемещены в Строковый набор слов. A.6.1.2033 POSTPONE Типичное использование: : ENDIF POSTPONE THEN ; IMMEDIATE : X ... IF ... ENDIF ... ; POSTPONE заменяет большинство функциональных возможностей COMPILE и [COMPILE]. COMPILE и [COMPILE] используются для той же самой цели: отложить поведение компиляции следующего слова в области анализа. COMPILE было предназначено для применения к словам не немедленного исполнения и [COMPILE] к словам немедленного исполнения. Это отягощает программиста необходимостью знать, какие слова в системе немедленного исполнения. Следовательно, стандарты Forth должны были определить немедленное исполнение или не немедленное исполнение всех слов, охваченных Стандартом. Это излишне сдерживает разработчиков. Вторая проблема с COMPILE - это что некоторые программисты договорились предполагать и использовать специфическую реализацию, а именно: : COMPILE R> DUP @ , CELL+ >R ; 168 Эта реализация не будет работать на системе Forth с непосредственным кодом. В непосредственном коде Forth использующем inline расширение кода и локальную оптимизацию, размер произведенного объектного кода изменяется; эту информацию трудно сообщить "тупому" COMPILE. "Разумный" (то есть, немедленного исполнения) COMPILE, не имел бы этой проблемы, но это запрещали предыдущие стандарты. По этим причинам, COMPILE не был включен в Стандарт, и [COMPILE] был перемещен в пользу POSTPONE. Дополнительное обсуждение может быть найдено в Hayes, J.R., "Postpone", Доклады 1989 Rochester Forth Conference. A.6.1.2120 RECURSE Типичное использование: : X ... RECURSE ... ; Это - оператор рекурсии Forth; на некоторых реализациях оно вызывает САМО СЕБЯ. Обычный пример - кодирование функции факториала. : FACTORIAL ( +n1 -- +n2) DUP 2 < IF DROP 1 EXIT THEN DUP 1- RECURSE * ; n2 = n1(n1-1)(n1-2)...(2)(1), произведение n1 со всеми положительными целыми числами меньше чем оно само (как специальный случай, нулевой факториал равняется одному). Хотя возлюбленная компьютерными учеными, рекурсия делает необычно тяжелым использование обоих стеков и должна, поэтому быть использована с осторожностью. См. альтернативное определение A.6.1.2140 REPEAT. A.6.1.2140 REPEAT Типичное использование: : FACTORIAL ( +n1 -- +n2) DUP 2 < IF DROP 1 EXIT THEN DUP BEGIN DUP 2 > WHILE 1- SWAP OVER * SWAP REPEAT DROP ; A.6.1.2165 S" Типичное использование: : X ... S" ccc" ... ; Это слово найдено во многих системах под именем " (кавычка). Однако текущая практика состоит в почти равномерном разделении в использовании ": многие системы, используют семантику выполнения учитываемую здесь, в то время как другие возвращают адрес строки со счетчиком. Мы делаем здесь попытку удовлетворить оба лагеря, предусматривая два слова, S" и Расширение Основного слова C" так, чтобы пользователи могли иметь любое поведение ими ожидаемое с простой операцией переименования. 169 A.6.1.2214 SM/REM См. предыдущее обсуждение деления под FM/MOD. SM/REM - примитив симметричного деления, который позволяет программам определять следующие операторы симметричного деления: : /-REM ( n1 n2 -- n3 n4 ) >R S>D R> SM/REM ; : /- ( n1 n2 -- n3 ) /-REM SWAP DROP ; : -REM ( n1 n2 -- n3 ) /-REM DROP ; : */-REM ( n1 n2 n3 -- n4 n5 ) >R M* R> SM/REM ; : */- ( n1 n2 n3 -- n4 ) */-REM SWAP DROP ; A.6.1.2216 SOURCE SOURCE упрощает процесс непосредственного доступа к входному буферу, скрывая различия между его местоположением для различных входных источников. Это также дает разработчикам больше гибкости в их реализациях механизмов буферизации для различных входных источников. Комитет удалился от входной буферной спецификации состоящей из коллекции индивидуальных переменных, объявляя TIB и #TIB устаревшими. SOURCE в этой форме существует в F83, POLYFORTH, LMI's Forths и других. В обычных системах это эквивалентно фразе BLK @ IF BLK @ BLOCK 1024 ELSE TIB #TIB @ THEN A.6.1.2250 STATE Хотя EVALUATE, LOAD, INCLUDE-FILE, и INCLUDED не перечислены как слова, которые изменяют STATE, текст, интерпретируемый любым из этих слов, может включать одно или более слов, которые явно изменяют STATE. EVALUATE, LOAD, INCLUDE-FILE, и INCLUDED сами не делают изменения в STATE. STATE не вложено при вложении текстового интерпретатора. Например, последовательность кода: : FOO S" ]" EVALUATE ; FOO оставит систему в состоянии компиляции. Точно так же после выполнения LOAD с блоком содержащим ], система будет в состоянии компиляции. Заметьте, что ] не затрагивает область анализа и что единственное влияние которое : оказывает на область анализа, это выделить слово. Это дает право программе использовать эти слова для установки состояния с известными побочными эффектами на область анализа. Например: : NOP : POSTPONE ; IMMEDIATE ; NOP ALIGN NOP ALIGNED Некоторые не-ANS Forth совместимые системы имеют ] вызывающее цикл компилятора в дополнение к установке STATE. Такая система неуместно пыталась бы компилировать второе использование NOP. 170 Также заметьте, что ничто в Стандарте не мешает программе искать идентификаторы исполнения ] или [ и использовать их для изменения STATE. Эти факты предлагают, что реализации ] будут делать только установку STATE и единственный цикл интерпретатора/компилятора будет контролировать STATE. A.6.1.2270 THEN Типичное использование: : X ... test IF ... THEN ... ; или : X ... test IF ... ELSE ... THEN ... ; A.6.1.2380 UNLOOP Типичное использование: : X ... limit first DO ... test IF ... UNLOOP EXIT THEN ... LOOP ... ; UNLOOP позволяет использование EXIT в пределах контекста, DO ... LOOP и связанной do-loop конструкции. UNLOOP как функция был назван UNDO. UNLOOP более выражает действие: ничто не отменяется - мы просто прекращаем делать это. A.6.1.2390 UNTIL Типичное использование: : X ... BEGIN ... test UNTIL ... ; A.6.1.2410 VARIABLE Типичное использование: ... VARIABLE XYZ ... A.6.1.2430 WHILE Типичное использование: : X ... BEGIN ... test WHILE ... REPEAT ... ; A.6.1.2450 WORD Типичное использование: char WORD ccc 171 A.6.1.2500 [ Типичное использование: : X ... [ 4321 ] LITERAL ... ; A.6.1.2510 ['] Типичное использование: : X ... ['] name ... ; См.: A.6.1.1550 FIND. A.6.1.2520 [CHAR] Типичное использование: : X ... [CHAR] ccc ... ; A.6.1.2540 ] Типичное использование: : X ... [ 1234 ] LITERAL ... ; A.6.2 Расширения основных слов Слова в этой коллекции относятся к нескольким категориям: - Слова, которые находятся в общем использовании, но считаются менее обязательными чем Основные слова (например, 0<>); - Слова, которые находятся в общем использовании, но могут быть тривиально определены из Основных слов (например, FALSE); - Слова, которые являются прежде всего полезными в узко определенных типах приложений или менее часто используются (например, PARSE); - Слова, которые осуждаются в пользу новых слов, представленных для решения специфических проблем (например, CONVERT). Из-за различия оснований для включения этих слов, Технический Комитет не поощряет разработчиков предлагать законченную коллекцию, но выбирать слова считающиеся наиболее ценными для их клиентуры. A.6.2.0060 #TIB Функция #TIB была заменена SOURCE. A.6.2.0200 .( Типичное использование: .( ccc) A.6.2.0210 .R В .R, "R" сокращение для RIGHT. A.6.2.0340 2>R Исторически, 2>R использовался для реализации DO. Отсюда порядок параметров на стеке возвратов. 172 Основная польза 2>R в том, что оно помещает верхний элемент стека на вершину стек возвратов. Например, число две-ячейки может быть перемещено на стек возвратов и все еще иметь самую старшую ячейку доступной на вершине стека возвратов. A.6.2.0410 2R> Заметьте, что 2R> - не эквивалентен R> R>. Вместо этого, это отражает действие 2R> (см. A.6.2.0340). A.6.2.0455 :NONAME :NONAME позволяет пользователю создавать идентификатор исполнения с семантикой определения через двоеточие без связанного имени. Ранее, только : (двоеточие) могло создавать идентификатор исполнения с этой семантикой. Таким образом, код Forth мог быть откомпилирован только, используя синтаксис :, так: : NAME ... ; :NONAME устраняет это ограничение и помещает компилятор Forth в руки программиста. :NONAME может использоваться для создания специфических для применения языков программирования. Одна методика - это смешать кодовые фрагменты Forth со специфическими для применения конструкциями. Специфические для применения конструкции используются :NONAME для компиляции Forth кода и сохранения соответствующего идентификатора исполнения в структурах данных. Функциональные возможности :NONAME могут быть встроены в любую систему Forth. Годами эксперты Forth программирования использовали детальное знание их систем для генерации безымянных фрагментов кода. Теперь эта функция была именована и может использоваться в переносимой программе. Например :NONAME может использоваться для формирования таблицы кодовых фрагментов, где индексация в таблице позволяет выполнять специфический фрагмент. Синтаксис объявления таблицы: :NONAME .. code for command 0 .. ; 0 CMD ! :NONAME .. code for command 1 .. ; 1 CMD ! ... :NONAME .. code for command 99 .. ; 99 CMD ! ... 5 CMD @ EXECUTE ... Определения таблицы, формирующей слова: CREATE CMD-TABLE \ таблица для команд идентификаторов исполнения 100 CELLS ALLOT : CMD ( n -- a-addr ) \ энный адрес элемента в таблице CELLS CMD-TABLE + ; Как дальнейший пример, может быть создано определяющее слово, чтобы позволять контроль выполнения. В примере ниже подсчитывается число раз выполнения слова. : должен быть сначала переименован, чтобы позволить определение нового ; . 173 : DOCOLON ( -- ) \ Изменить созданное CREATE слово, чтобы выполниться подобно \ определению двоеточия DOES> ( i*x a-addr -- j*x ) 1 OVER +! \ выполнение счетчика CELL+ @ EXECUTE \ выполнение :NONAME определения ; : OLD: : ; \ только псевдоним OLD: : ( "name" -- a-addr xt colon-sys ) \ начинает счетное-выполнение определения через двоеточие CREATE HERE 0 , \ память для счетчика выполнения 0 , \ память для идентификатора исполнения DOCOLON \ установить время выполнения для созданного \ CREATE слова :NONAME \ начать неименованное определение через двоеточие ; ( Примечание размещения DOES>: DOES> должно изменить созданное CREATE слово а не :NONAME определение, так что DOES> должно выполниться прежде :NONAME.) OLD: ; ( a-addr xt colon-sys -- ) \ заканчивает счетное-выполнение определения через двоеточие POSTPONE ; \ завершает компиляцию определения через двоеточие SWAP CELL+ ! \ сохраняет идентификатор исполнения ; IMMEDIATE Новые : и ; используются точно так же как стандартные для определения слов: ... : xxx ... ; ... xxx ... Теперь однако, эти слова можно "ticked", чтобы отыскать счетчик (и идентификатор исполнения): ... ' xxx >BODY ? ... A.6.2.0620 ?DO Типичное использование: : FACTORIAL ( +n1 -- +n2 ) 1 SWAP 1+ ?DO I * LOOP ; Это слово было добавлено в ответ на многие запросы для разрешения трудности внесенной Forth-83 словом DO, которое на 16-бит системе будет выполняться 65,535 раз, если даны равные параметры. Так как этот Стандарт также поощряет 32-разрядные системы, то это поведение может быть невыносимым. Технический Комитет рассмотрел применение этой семантики к DO, но отклонил на том основании, что это могло бы нарушить существующий код. 174 A.6.2.0700 AGAIN Типичное использование: : X ... BEGIN ... AGAIN ... ; Если последовательность слов не имеет способ закончиться, это бесконечный цикл. A.6.2.0855 C" Типичное использование: : X ... C" ccc" ... ; Просто преобразовать строки со счетчиком к указателю/длине, но трудно сделать наоборот. C" является единственным новым словом, которое использует представление стека "адрес строки со счетчиком". Оно предусмотрено как помощь перенесению существующих программ на ANS Forth системы. Относительно трудно реализовать C" в терминах других стандартных слов, рассматривая их семантику "компиляция строки в текущее определение". Пользователи C" поощряются к перемещению их прикладного кода к непротиворечивому использованию преимущественно "c-addr u" стекового представления с помощью дополнительного слова S". Это может быть выполнено преобразованием прикладных слов с входными параметрами со строкой со счетчиком для использования преимущественно "c-addr u" представления, таким образом устраняя потребность в C". См.: 3.1.3.4 Строки со счетчиком. A.6.2.0873 CASE Типичное использование: : X ... CASE test1 OF ... ENDOF testn OF ... ENDOF ... ( default ) ENDCASE ... ; A.6.2.0945 COMPILE, COMPILE, - эквивалент EXECUTE для компиляции. Во многих случаях возможно компилировать слово с использованием POSTPONE без использования COMPILE,. Однако использование POSTPONE требует, чтобы имя слова было известно во время компиляции, тогда как COMPILE, позволяет слову быть размещенным в любое время. В некоторых случаях возможно использовать EVALUATE для компиляции слова, чье имя не известно до времени выполнения. Это имеет две возможных проблемы: - EVALUATE медленнее чем COMPILE, , потому что требуется поиск в словаре. - Текущий порядок поиска затрагивает результат, EVALUATE. В традиционных реализациях шитого кода, компиляция выполняется с помощью , (запятая). Это использование - не переносимое; это не работает для подпрограммного шитого кода, непосредственного кодирования, или перемещаемых реализаций. Использование COMPILE, является переносимым. 175 В большинстве систем возможно реализовать COMPILE, так, что оно сгенерирует код оптимизированный до той же самой степени как код сгенерированный нормальным процессом компиляции. Однако в некоторых реализациях есть два различных "идентификатора", соответствующих специфическому имени определения: нормальный "идентификатор исполнения", который используется при интерпретации или с EXECUTE, , и "идентификатор компиляции", который используется при компиляции. И не всегда возможно получить идентификатор компиляции от идентификатора исполнения. В этих реализациях COMPILE, не могло бы генерировать код являющийся столь же эффективным как обычно оттранслированная программа. A.6.2.0970 CONVERT CONVERT может быть определено следующим образом: : CONVERT CHAR+ 65535 >NUMBER DROP ; A.6.2.1342 ENDCASE Типичное использование: : X ... CASE test1 OF ... ENDOF testn OF ... ENDOF ... ( default ) ENDCASE ... ; A.6.2.1343 ENDOF Типичное использование: : X ... CASE test1 OF ... ENDOF testn OF ... ENDOF ... ( default ) ENDCASE ... ; A.6.2.1390 EXPECT Спецификация положительного целочисленного счетчика (+n) для EXPECT, позволяет некоторым разработчикам продолжать их практику использования нулевого или отрицательного значения как флага для вызова специального поведения. Поскольку такое поведение - вне Стандартного, Стандартные Программы не могут зависеть от этого, но Технический Комитет не желает этому излишне препятствовать. Так как фактические значения - почти всегда маленькие целые числа, никакие функциональные возможности не ослабляются этим ограничением. 176 A.6.2.1850 MARKER Поскольку реализации словаря стали более сложными, и в некоторых случаях используют множественные адресные пространства, FORGET стал предельно трудным или невозможным для реализации на многих системах Forth. MARKER очень ослабляет проблему, делая возможным для системы помнить "ориентирующую информацию" заранее, которая конкретно отмечает места, где словарь может быть перестроен в некотором будущем. A.6.2.1950 OF Типичное использование: : X ... CASE test1 OF ... ENDOF testn OF ... ENDOF ... ( default ) ENDCASE ... ; A.6.2.2000 PAD PAD была доступна как рабочая память для строк начиная с самых ранних Forth реализаций. Было доведено до нашего внимания, что много программистов отказываются от использования PAD, опасаясь несовместимости в системном использовании. PAD конкретно предназначен как удобство для программиста, однако мы документировали факт, что никакие стандартные слова не используют его. A.6.2.2008 PARSE Типичное использование: char PARSE ccc Традиционное слово Forth для синтаксического анализа это WORD. PARSE решает следующие проблемы WORD: a) WORD всегда пропускает ведущие разделители. Это поведение соответствует использованию текстовым интерпретатором, который ищет последовательности непустых символов, но не соответствует для использования словами типа ( , .( , и ." . Рассмотрите следующее (испорченное) определение .( : : .( [CHAR] ) WORD COUNT TYPE ; IMMEDIATE Это работает прекрасно, когда используется в строке подобно: .( HELLO) 5 . но рассмотрите то, что случается, если пользователь вводит пустую строку: .( ) 5 . Определение .( показанное выше обработало бы ) как ведущий разделитель, пропустило его, и продолжило потреблять символы, пока оно не обнаружило бы другой ) который следовал за не-) символом, или пока не опустела бы область анализа. В показанном примере 5 . было бы обработано как часть из строки, которая будет напечатана. 177 С PARSE, мы могли бы записать правильное определение .( : : .( [CHAR] ) PARSE TYPE ; IMMEDIATE Это определение избегает аномалии "пустой строки". b) WORD возвращает свой результат как строку со счетчиком. Это имеет четыре плохих эффекта: 1) Символы принятые WORD должны быть скопированы из входного буфера во временный буфер, чтобы создать место для символа счетчика, который должен быть в начале строки со счетчиком. Шаг копирования неэффективен в сравнении с PARSE, который оставляет строку во входном буфере и не должен копировать ее куда- нибудь. 2) WORD должно быть внимательным, чтобы не сохранить слишком много символов во временный буфер, и таким образом не перезаписать кое-чего вне конца буфера. Это добавляется к накладным расходам из шага копирования. (WORD, вероятно, придется просматривать много символов перед поиском конечного разделителя.) 3) Символ счетчика ограничивает длину строки, возвращаемой WORD до 255 символов (более длинные строки могут легко быть сохранены в блоках!). Это ограничение не существует для PARSE. 4) Временный буфер типично перезаписывается следующим использованием WORD. Это создает временную зависимость; значение, возвращенное WORD допустимо только для ограниченной продолжительности. PARSE также имеет временную зависимость связанную с продолжительностью жизни входного буфера, но это менее серьезно в большинстве случаев, чем временная зависимость WORD. Поведение WORD относительно пропуска ведущих разделителей полезно для синтаксического анализа ограниченных пробелом имен. Много системных реализаций включают дополнительное слово для этой цели, подобное PARSE относительно возвращаемого значения "c-addr u", но без явного параметра разделителя (набор разделителей - неявно "пробельные символы"), и который пропускает ведущие разделители. Обычное описание для этого слова: PARSE-WORD ( "name" -- c-addr u ) Пропускает ведущие пробелы и выделяет имя ограниченное пробелом. c-addr - адрес в пределах входного буфера и u - длина выбранной строки. Если область анализа пуста, результирующая строка имеет нулевую длину. Если и PARSE и PARSE-WORD присутствуют, потребность в WORD в значительной степени устранена. A.6.2.2030 PICK 0 PICK эквивалентно DUP, и 1 PICK эквивалентно OVER. A.6.2.2040 QUERY Функция QUERY может быть выполнена с ACCEPT и EVALUATE. 178 A.6.2.2125 REFILL Это слово - полезное обобщение QUERY. Переопределение QUERY для выполнения этой спецификации сломала бы существующий код. REFILL разработан, чтобы вести себя разумно для всех возможных входных источников. Если входной источник исходит от пользователя, как с QUERY, REFILL может все еще возвращать значение false если, например, канал связи закрыт, так чтобы система знала, что ввод больше не будет доступен. A.6.2.2150 ROLL 2 ROLL эквивалентно ROT, 1 ROLL эквивалентно SWAP, и 0 ROLL - пустая операция. A.6.2.2182 SAVE-INPUT SAVE-INPUT и RESTORE-INPUT позволяют ту же самую степень переустановления входного источника в пределах текстового файла, как это доступно с BLOCK вводом. SAVE-INPUT и RESTORE-INPUT "скрывают подробности" операций, необходимых для совершения этого переустановления, и используются одинаковым способом со всеми входными источниками. Это упрощает переустановку входного источника для программ, потому что они не должны проверять несколько переменных и предпринимать различные действия в зависимости от значений этих переменных. SAVE-INPUT и RESTORE-INPUT предназначены для переустановления в пределах одного входного источника; например, следующий сценарий НЕ позволяется для Стандартной Программы: : XX SAVE-INPUT CREATE S" RESTORE-INPUT" EVALUATE ABORT" couldn't restore input" ; Это неправильно, потому что во время выполнения RESTORE-INPUT входной источник - строка через EVALUATE, которая - не тот же самый входной источник, который был в действительности, когда было выполнено SAVE-INPUT . Следующий код позволяется: : XX SAVE-INPUT CREATE S" .( Hello)" EVALUATE RESTORE-INPUT ABORT" couldn't restore input" ; После возвращения из EVALUATE, спецификация входного источника восстановлена к ее предыдущему состоянию, таким образом SAVE-INPUT и RESTORE-INPUT вызваны действительно с одним и тем же входным источником. В вышеупомянутых примерах, EVALUATE фраза могла быть заменена фразой включающей INCLUDE-FILE, и применились бы те же самые правила. Стандарт не определяет то, что случается, если программа нарушает вышеупомянутые правила. Стандартная Система могла бы проверять нарушение и возвращать индикацию исключения из RESTORE-INPUT, или она могла бы терпеть неудачу непредсказуемым способом. 179 Возвращаемое значение из RESTORE-INPUT прежде всего предназначено для сообщения о случае, где программа пытается восстановить позицию входного источника, чья позиция не может быть восстановлена. Таким входным источником могла бы быть клавиатура. Вложение SAVE-INPUT и RESTORE-INPUT позволяется. Например, следующая ситуация работает как ожидается: : XX SAVE-INPUT S" f1" INCLUDED \ The file "f1" includes: \ ... SAVE-INPUT ... RESTORE-INPUT ... \ End of file "f1" RESTORE-INPUT ABORT" couldn't restore input" ; В принципе, RESTORE-INPUT могло быть реализовано как "всегда сбой", например: : RESTORE-INPUT ( x1 ... xn n -- flag ) 0 ?DO DROP LOOP TRUE ; Такая реализация не была бы полезна в большинстве случаев. Было бы предпочтительнее для системы скорее оставить SAVE-INPUT и RESTORE-INPUT неопределенными, чем создавать бесполезную реализацию. В отсутствии слов, прикладной программист может выбирать, действительно ли создавать "фиктивные" реализации или обойти проблему некоторым другим путем. Примеры того, как реализация могла бы использовать возвращаемые значения из SAVE-INPUT для выполнения функции сохранения/восстановления: ----------------------------------------------- Входной источник возможные значения стека ----------------------------------------------- блок >IN @ BLK @ 2 EVALUATE >IN @ 1 клавиатура >IN @ 1 текстовый файл >IN @ lo-pos hi-pos 3 ----------------------------------------------- Это только примеры; Стандартная Программа не предполагает какое либо конкретное значение для отдельных элементов стека, возвращаемых SAVE-INPUT. A.6.2.2290 TIB Функция TIB была заменена SOURCE. 180 A.6.2.2295 TO Исторически, некоторые реализации TO не имеют явного выделения имени. Вместо этого они устанавливают флаг режима, который проверяется последующим выполнением имени. ANS Forth явно требует, чтобы TO выделял имя, так чтобы эффект TO был предсказуем, когда он используется в конце области анализа. Типичное использование: x TO name A.6.2.2298 TRUE TRUE эквивалентно фразе 0 0=. A.6.2.2405 VALUE Типичное использование: 0 VALUE DATA : EXCHANGE ( n1 -- n2 ) DATA SWAP TO DATA ; EXCHANGE оставляет n1 в DATA и возвращает предшествующее значение n2. A.6.2.2440 WITHIN Мы описываем WITHIN без упоминания кругового числового пространства (неопределенный термин) или предоставления кода. Вот - числовая строка с точкой переполнения (o) в крайнем правом положении и точкой антипереполнения (u) в крайнем левом: u------------------------------------------------------------------o Есть два случая для рассмотрения: либо диапазон n2|u2..n3|u3 охватывает точки переполнения/антипереполнения, либо нет. Позвольте исследовать сначала не охватывающий случай: u-------------------[.....................)------------------------o [ обозначает n2|u2, ) обозначает n3|u3, и точки и [ - это числа В ПРЕДЕЛАХ (WITHIN) диапазона. n3|u3 больше чем n2|u2, так что следующие проверки определят, является ли n1|u1 В ПРЕДЕЛАХ (WITHIN) n2|u2 и n3|u3: n2|u2 < n1|u1 и n1|u1 < n3|u3. В случае, где диапазон сравнения колеблется между точками переполнения/антипереполнения: u...............)-----------------------------[....................o n3|u3 - меньше чем n2|u2, и следующие проверки определят, является ли n1|u1 В ПРЕДЕЛАХ (WITHIN) n2|u2 и n3|u3: n2|u2 < n1|u1 или n1|u1 < n3|u3. 181 WITHIN должен работать для знаковых и без знаковых параметров. Одна очевидная реализация не работает: : WITHIN ( test low high -- flag ) >R OVER < 0= ( test flag1 ) SWAP R> < ( flag1 flag2 ) AND ; Примите арифметику дополнительного кода (дополнение до двух) на 16-бит машине, и рассмотрите следующую проверку: 33000 32000 34000 WITHIN Вышеупомянутая реализация возвращает false для этой проверки, даже притом, что число без знака 33000 - ясно в пределах диапазона {{32000 .. 34000}}. Проблема состоит в том, что на неправильной реализации, знаковое сравнение < дает неправильный ответ, когда 32000 сравнивается с 33000, потому что когда эти числа рассматриваются как числа со знаком, 33000 рассматривается как отрицательное 32536, в то время как 32000 остается положительным. Замена < на U< в вышеупомянутой реализации заставляет ее работать с числами без знака, но вызывает проблемы с некоторыми диапазонами чисел со знаком; в частности испытание: 1 -5 5 WITHIN дало бы неправильный ответ. Для машин с дополнительным кодом (дополнение до двух), которые игнорируют арифметическое переполнение (большинство машин), следующая реализация работает во всех случаях: : WITHIN ( test low high -- flag ) OVER - >R - R> U< ; A.6.2.2530 [COMPILE] Типичное использование: : name2 ... [COMPILE] name1 ... ; IMMEDIATE A.6.2.2535 \ Типичное использование: 5 CONSTANT THAT \ЭТО - КОММЕНТАРИЙ О THAT А.7 Дополнительный Блочный набор слов Ранние системы Forth выполнялись автономно, без ведущей OS. Блоки 1024 байт были разработаны как удобный элемент диска, и большинство автономных систем Forth все еще используют их. Это относительно простой для записи непосредственный дисковый драйвер, который отображает адреса головка/дорожка/сектор на номера блоков. Такие дисковые драйверы чрезвычайно быстры по сравнению с обычными файл-ориентированными операционными системами, и защита высока, потому что нет никого доверия до карты диска. 182 Сегодня много реализаций Forth выполняются под ведущими операционными системами, потому что совместимость, которую они предлагают пользователю, перевешивает ухудшение производительности. Много людей использующих такие системы предпочитают использовать только файлы ведущей OS; однако люди, которые используют, автономные и не автономные Forth нуждаются в совместимом способе доступа к диску. Блочный набор слов включает наиболее общие слова для доступа к источнику программы и данным на диске. Чтобы гарантировать, что Стандартные Программы, нуждающиеся в доступе к запоминающему устройству, имеют механизм соответствующий автономным и не автономным реализациям, ANS Forth требует, что бы Блочный набор слов был доступен, если предусмотрены любые средства запоминающего устройства. На не автономных реализациях, блоки обычно находятся в файлах ведущей OS. А.7.2 Дополнительные термины блок Много систем Forth используют блоки, чтобы содержать источник программы. Традиционно такие блоки форматированы для редактирования как 16 строк по 64 символа. Исходные блоки часто упоминаются как "экраны". А.7.6 Словарь A.7.6.2.2190 SCR SCR сокращение для экрана. А.8 Дополнительный набор слов двойных чисел Системы Forth на 8-бит и 16-бит процессорах часто находят необходимым иметь дело с числами двойной-длины. Но много Forth на маленьких внедренных системах не желают, и много пользователей Forth на системах с размером ячейки 32-бит или больше находят, что потребность в числах двойной длины очень незначительная. Поэтому мы выделили слова, которые управляют объектами двойной длины в этот дополнительный набор слов. Пожалуйста заметьте, что соглашение об именах, используемое в этом наборе слов передает некоторую важную информацию: 1. Слова, чьи имена имеют форму 2xxx, имеют дело с парой-ячеек, где отношения между ячейками не определено. Они могут быть двумя векторами, числами двойной длины, или любой парой ячеек, которыми удобно манипулировать вместе. 2. Слова с именами формы Dxxx имеют дело определенно с целыми числами двойной длины. 3. Слова с именами формы Mxxx имеют дело с некоторой комбинацией одинарных и двойных целых чисел. Порядок, в котором они появляются на стеке, определен давней общей практикой. Обратитесь к A.3.1 для обсуждения типов данных в Forth. А.8.6 Словарь 183 A.8.6.1.0360 2CONSTANT Типичное использование: x1 x2 2CONSTANT name A.8.6.1.0390 2LITERAL Типичное использование: : X ... [ x1 x2 ] 2LITERAL ... ; A.8.6.1.0440 2VARIABLE Типичное использование: 2VARIABLE name A.8.6.1.1070 D.R В D.R, "R" сокращение для RIGHT. A.8.6.1.1090 D2* См.: A.6.1.0320 2* для соответствующего обсуждения. A.8.6.1.1100 D2/ См.: A.6.1.0330 2/ для соответствующего обсуждения. A.8.6.1.1140 D>S Существуют представления чисел, например представление величины со знаком, где сокращение от двойной к одинарной точности не может быть сделано просто с помощью DROP. Это слово, эквивалентное DROP на системах с дополнительным кодом (дополнение до двух), уменьшает чувствительность кода приложения к представлению чисел и облегчает переносимость. A.8.6.1.1820 M*/ M*/ было однажды описано Chuck Moore как наиболее полезный арифметический оператор в Forth. Оно является главной рабочей лошадкой в большинстве вычислений, вовлекающих числа две-ячейки. Заметьте, что некоторые системы разрешают знаковые делители. Это может много стоить в производительности на некоторых CPUs. Не доказано, что требование положительного делителя - это проблема. A.8.6.1.1830 M+ M+ - это классический метод для интегрирования. А.9 Дополнительный набор слов исключений CATCH и THROW предусматривают надежный механизм для обработки исключительных ситуаций, без того чтобы иметь необходимость размножать флаги исключения через многочисленные уровни вложения слова. Это подобно основной тенденции механизмов "нелокального возвращения" многих других языков, типа C setjmp() и longjmp(), и LISP CATCH и THROW. В контексте Forth, THROW может быть описано как "многоуровневый EXIT" с CATCH, отмечающим местоположение, к которому THROW может возвращаться. 184 Немного подобные "многоуровневые EXIT" Forth схемы обработки особых ситуаций были описаны и использовались в прошлые годы. Не возможно осуществить такую схему, используя только стандартные слова (иные, чем CATCH и THROW), потому что нет никакого переносимого способа "отмотать" стек возвратов к предопределенному месту. THROW также предоставляет удобную методику реализации для стандартных слов ABORT и ABORT", позволяя приложению определять, с помощью использования CATCH, поведение при событии системного ABORT. Эта типовая реализация CATCH и THROW использует нестандартные слова, описанные ниже. Они или их эквиваленты доступны во многих системах. Другие стратегии реализации, включающие непосредственное сохранение значения DEPTH возможны, если такие слова не доступны. SP@ ( -- addr ) возвращает адрес, соответствующий вершине стека данных. SP! ( addr -- ) устанавливает указатель стека на addr, таким образом восстанавливая глубину стека на ту же самую глубину, которая существовала как раз перед тем как был получен addr выполнением SP@. RP@ ( -- addr ) возвращает адрес, соответствующий вершине стека возвратов. RP! ( addr -- ) устанавливает указатель стека возвратов на addr, таким образом восстанавливая глубину стека возвратов на ту же самую глубину, которая существовала как раз перед тем как был получен addr выполнением RP@. VARIABLE HANDLER 0 HANDLER ! \ последний обработчик особых ситуаций : CATCH ( xt -- exception# | 0 ) \ возвращает addr на стеке SP@ >R ( xt ) \ сохраняет указатель вершины стека данных HANDLER @ >R ( xt ) \ и предыдущий обработчик RP@ HANDLER ! ( xt ) \ устанавливает текущий обработчик EXECUTE ( ) \ выполняет возврат если не THROW R> HANDLER ! ( ) \ восстанавливает предыдущий обработчик R> DROP ( ) \ удаляет сохраненный стек ptr 0 ( 0 ) \ нормальное завершение ; : THROW ( ??? exception# -- ??? exception# ) ?DUP IF ( exc# ) \ 0 THROW - пустая команда HANDLER @ RP! ( exc# ) \ восстанавливает предыд. стек возвратов R> HANDLER ! ( exc# ) \ восстанавливает предыд. обработчик R> SWAP >R ( saved-sp ) \ exc# на стеке возвратов SP! DROP R> ( exc# ) \ восстановление стека \ Возвращение к программе вызвавшей CATCH, потому что стек \ возвратов \ восстановлен к состоянию, которое существовало \ когда CATCH начал выполнение THEN ; В многозадачной системе, переменная HANDLER должна быть переменной в в-задачной области (то есть, пользовательская переменная). 185 Эта типовая реализация не обрабатывает явно случай, в котором CATCH никогда не вызывается (то есть, поведение ABORT). Одно решение состоит в том, чтобы добавить следующий код после IF в THROW: HANDLER @ 0= IF ( освободить стек ) QUIT THEN Другое решение состоит в том, чтобы выполнить CATCH в пределах QUIT так, чтобы был всегда в наличии "обработчик особых ситуаций последнего средства". Например: : QUIT ( освободить стек возвратов и ) ( установить входной источник на пользовательское устройство ввода данных ) POSTPONE [ BEGIN REFILL WHILE ['] INTERPRET CATCH CASE 0 OF STATE @ 0= IF ." OK" THEN CR ENDOF -1 OF ( Прервано ) ENDOF -2 OF ( отображает сообщение от ABORT" ) ENDOF ( по умолчанию ) DUP ." Exception # " . ENDCASE REPEAT BYE ; Этот пример предполагает существование системной реализации слова INTERPRET, которое воплощает семантику текстового интерпретатора, описанную в 3.4 Интерпретатор текста Forth. Заметьте, что эта реализация QUIT автоматически обрабатывает освобождение стека и стека возвратов, из-за свойственного THROW восстановления стеков данных и возвратов. Данным этим определением QUIT, просто определить: : ABORT -1 THROW ; В системах с другими стеками в дополнение к стекам данных и возвратов, реализации из CATCH и THROW должны также сохранять и восстанавливать эти указатели вершин стеков. Такая "расширенная версия" может быть надстроена сверху этой основной реализации. Например, с другим указателем вершины стека доступным с помощью FP@ и FP! должен быть переопределен только CATCH: : CATCH ( xt -- exception# | 0 ) FP@ >R CATCH R> OVER IF FP! ELSE DROP THEN ; В этом случае нет необходимости, ни в каких изменениях THROW. Заметьте что, как со всеми переопределениями, переопределенная версия CATCH будет доступна только определениям, откомпилированным после переопределения CATCH. CATCH и THROW предоставляют удобный путь для реализаций "очистки" состояния открытых файлов, если исключение происходит в течении интерпретации текстового файла с помощью INCLUDE-FILE. Реализация INCLUDE-FILE может предохранять (с CATCH) слово, которое исполняет текстовую интерпретацию, и если CATCH возвращает код исключения, файл может быть закрыт и исключение переброшено (reTHROWn) так, чтобы файлы, включаемые во внешнем уровне вложенности, могли быть также закрыты. 186 Заметьте, что Стандарт позволяет, но не требует от INCLUDE-FILE закрывать его открытые файлы, если происходит исключение. Однако он требует от INCLUDE-FILE понизить уровень вложения спецификации входного источника, если исключение обработано THROW. А.9.3 Дополнительные условия применения Одно важное использование обработчика особых ситуаций - это поддержание управления программой под многими условиями, которые вызывают ABORT. Это реально только, если зарезервирован диапазон кодов. Заметьте, что приложение может перезагружать много стандартных слов таким способом, чтобы THROW неопределенные ситуации не нормальным образом обрабатывались с помощью THROW специфической системой. А.9.3.6 Обработка особых ситуаций Метод выполнения этой связи зависящий от реализации. Например, LOAD может "знать" о CATCH и THROW (используя CATCH самостоятельно, например), или CATCH и THROW могут "знать" о LOAD (поддерживая информацию вложенности входного источника в структуре данных известной в THROW, например). При этих обстоятельствах не возможно для стандартной Программы определить слова типа LOAD полностью переносимым способом. А.9.6 Словарь A.9.6.1.2275 THROW Если THROW выполнено с не нулевым параметром, эффект такой, как будто это возвратило соответствующее CATCH . В том случае глубина стека такая же, какая она была как раз перед началом выполнения CATCH . Значения параметров стека i*x могли изменяться произвольно в течение выполнения xt. Вообще, ничего полезного не может быть сделано с этими элементами стека, но так как их число известно (потому что глубина стека детерминирована), приложение может DROP их, чтобы возвратиться к предсказуемому состоянию стека. Типичное использование: : could-fail ( -- char ) KEY DUP [CHAR] Q = IF 1 THROW THEN ; : do-it ( a b -- c) 2DROP could-fail ; : try-it ( --) 1 2 ['] do-it CATCH IF ( x1 x2 ) 2DROP ." Было исключение" CR ELSE ." Был символ " EMIT CR THEN ; : retry-it ( -- ) BEGIN 1 2 ['] do-it CATCH WHILE ( x1 x2) 2DROP ." Исключение, пробуем продолжать" CR REPEAT ( char ) ." Был символ " EMIT CR ; 187 А.10 Дополнительный сервисный набор слов А.10.6 Словарь A.10.6.1.0742 AT-XY Большинство разработчиков поставляют метод позиционирования курсора на экране CRT, но есть большое разногласие в именах и параметрах стека. Эта версия поддерживается, по крайней мере, одним главным поставщиком. A.10.6.1.1755 KEY? Технический Комитет ходил по кругу некоторое время по поводу стекового эффекта. Любое решение нарушит чью-то практику и накажет некоторую машину. Этот путь не касается опережающего ввода с клавиатуры на некоторых системах, когда требуется реализация односимвольного буфера на машинах, где опрос клавиатуры неизбежно оканчивается разрушением символа. Использование KEY или KEY? указывает, что приложение не желает беспокоиться о не символьных событиях, так что они отвергаются в ожидании, в конечном счете, получения допустимого символа. Приложения, желающие обработать не символьные события, должны использовать EKEY и EKEY?. Возможно смешивать использование KEY? / KEY и EKEY? / EKEY в пределах отдельного приложения, но приложение должно использовать KEY? и KEY только, когда оно желает удалить не символьные события до получения допустимого символа. A.10.6.2.1305 EKEY EKEY предоставляет стандартное слово для обращения к зависимому от системы набору "необработанных" событий клавиатуры, включая события соответствующие членам стандартного набора символов, события соответствующие другим членам определенного реализацией набора символов, и нажатия клавиш которые не соответствуют членам набора символов. EKEY не предполагает никакого специфического числового соответствия между специфическими значениями кода события и значениями, представляющими стандартные символы. На некоторых системах, оно может допускать две отдельные клавиши, которые соответствуют одному и тому же стандартному символу, которые нужно отличить друг от друга. В системах, которые объединяют события клавиатуры и мыши в один "поток событий", единственное число, возвращенное EKEY, может быть неадекватно для представления полного диапазона возможного ввода. В таких системах, отдельная "запись события" может включать временную отметку, x,y координаты позиции мыши, состояния клавиатуры, и состояния кнопок мыши. В таких системах могло бы быть соответствующее EKEY для возвращения адреса "записи события" из которой могла быть извлечена другая информация. Также рассмотрите гипотетическую систему Forth, выполняющуюся под MS-DOS на PC совместимом компьютере. Предположите, что набор символов определенный реализацией - "нормальный" PC 8-бит набор символов. В этом наборе символов коды от 0 до 127 соответствуют ASCII символам. Коды от 128 до 255 представляют символы из различных не английских языков, математические символы, и некоторые графические символы, используемые для рисования в строке. В добавление к этим символам, клавиатура может генерировать различные другие "скэн-коды", представляющие такие не символьные события как клавиши курсора и функциональные клавиши. 188 Могут быть составные клавиши, с различными скэн-кодами, соответствующими одному и тому же стандартному символу. Например, символ представляющий число "1" часто появляется в строке цифровых клавиш выше алфавитных клавиш, и также в отдельной цифровой клавиатуре. Когда программа опрашивает операционную систему MS-DOS для события клавиатуры, она получает единственный ненулевой байт представляющий символ, или нулевой байт, сопровождаемый байтом "скэн-кода", представляющим не символьное событие клавиатуры (например, функциональная клавиша). EKEY представляет каждое событие клавиатуры скорее как отдельное число, чем как последовательность чисел. Для системы описанной выше, следующее было бы разумной реализацией EKEY и связанных слов: Запрос к окружению MAX-CHAR возвратил бы 255. Предположите существование слова DOS-KEY ( -- char ) которое выполняет системный вызов MS-DOS "Прямой Ввод STDIN" (Прерывание 21h, Функция 07h) и слово DOS-KEY? ( -- flag) которое выполняет системный вызов MS-DOS "Проверка Состояния STDIN" (Прерывание 21h, Функция 0Bh). : EKEY? ( -- flag ) DOS-KEY? 0<> ; : EKEY ( -- u ) DOS-KEY ?DUP 0= IF DOS-KEY 256 + THEN ; : EKEY>CHAR ( u -- u false | char true ) DUP 255 > IF ( u ) DUP 259 = IF \ 259 это Ctrl-@ (ASCII NUL) DROP 0 TRUE EXIT \ если так - замена символом THEN FALSE EXIT \ иначе расширенный символ THEN TRUE \ нормальный символ ASCII. ; VARIABLE PENDING-CHAR -1 PENDING-CHAR ! : KEY? ( -- flag ) PENDING-CHAR @ 0< IF BEGIN EKEY? WHILE EKEY EKEY>CHAR IF PENDING-CHAR ! TRUE EXIT THEN DROP REPEAT FALSE EXIT THEN TRUE ; : KEY ( -- char ) PENDING-CHAR @ 0< IF BEGIN EKEY EKEY>CHAR 0= WHILE DROP REPEAT EXIT THEN PENDING-CHAR @ -1 PENDING-CHAR ! ; 189 Это - полнофункциональная реализация, предоставляющая прикладной программе простой путь, или обрабатывать не символьные события (с помощью EKEY), или игнорировать их и только рассматривать "реальные" символы (с помощью KEY). Заметьте, что EKEY отображает скэн-коды от 0 до 255 в числа от 256 до 511. EKEY отображает число 259, представляя комбинацию клавиатуры Ctrl-Shift-@ в символ, чье числовое значение - 0 (ASCII NUL). Много ASCII клавиатур генерируют ASCII NUL для Ctrl-Shift-@, так что мы используем эту комбинацию клавиш для ASCII NUL (который иначе недоступен из MS-DOS, потому что нулевой байт показывает, что следует другой байт скэн-кода). Одно следствие использования системного вызова "Прямого Ввода STDIN" (функция 7) вместо системного вызова "Ввода STDIN" (функция 8) - это что нормальное поведение DOS "прерывания Ctrl-C" - заблокировано, когда система ожидает ввода (Ctrl-C все еще вызвало бы прерывание, пока символы выводятся). С другой стороны, если системный вызов "Ввод STDIN" (функция 8) использовался для реализации EKEY, Ctrl-C прерывание было бы доступно, но Ctrl-Shift-@ также вызвало бы прерывание, потому что операционная система обработает второй байт из 0,3 последовательности как Ctrl-C даже притом, что эти 3 - действительно скэн-код, а не символ. Одно решение "лучшее из обоих миров" - это использовать функцию 8 для первого байта получаемого EKEY, и функцию 7 для байта скэн-кода. Например: : EKEY ( -- u ) DOS-KEY-FUNCTION-8 ?DUP 0= IF DOS-KEY-FUNCTION-7 DUP 3 = IF DROP 0 ELSE 256 + THEN THEN ; Конечно, если разработчик Forth выбирает передачу Ctrl-C через программу, без использования ее обычной функции обработки прерывания, тогда функция 7 DOS соответствует обоим случаям (и некоторая дополнительная забота должна быть предпринята для предотвращения опережающего ввода с клавиатуры Ctrl-C от прерывания системы Forth в течение операций вывода). Система Forth могла бы также выбирать более простую реализацию KEY, без реализации EKEY, следующим образом: : KEY ( -- char ) DOS-KEY ; : KEY? ( -- flag ) DOS-KEY? 0<> ; Недостатки более простой версии: a) Прикладная программа, которая использует KEY, ожидая получения только допустимых символов, могла бы получить последовательность байт (например, нулевой байт, сопровождаемый байтом с таким же числовым значением как у символа "A") которая, кажется, содержит допустимый символ, даже притом, что пользователь нажал клавишу (например, функциональная клавиша 4) которая не соответствует никакому допустимому символу. b) Прикладная программа, которая желает обработать не символьные события, будет должна выполнить KEY дважды, если она возвращает нуль первый раз. Это, могло бы казалось, быть разумной и простой для воплощения вещью. Однако, такой код - не переносимый на другие системы, которые не используют нулевой байт как "escape" код. 190 Используя подход EKEY, алгоритм для обработки событий клавиатуры может быть один и тот же для всех систем; системные зависимости могут быть уменьшены до таблицы или набора списка констант системно зависимых кодов клавиш используемых для доступа к специфическим прикладным функциям. Без EKEY алгоритм, не только таблица, вероятно будет системно зависимым. Другой подход к EKEY на MS-DOS состоит в том, чтобы использовать функцию BIOS "Read Keyboard Status" (Прерывание 16h, Функция 01h) или связанную функцию "Check Keyboard" (Прерывание 16h, Функция 11h). Преимущество этой функции состоит в том, что она позволяет программе делать различие между различными клавишами, которые соответствуют одному и тому же символу (например, две клавиши "1"). Недостаток - то, что функция клавиатуры BIOS доступна только для чтения клавиатуры. Она не может быть "переадресована" к другому источнику "стандартного ввода", как может функция DOS Ввод STDIN. A.10.6.2.1306 EKEY>CHAR EKEY>CHAR транслирует событие клавиатуры в соответствующего члена набора символов, если такое соответствие существует для этого события. Возможно, что несколько различных событий клавиатуры могут соответствовать одному и тому же символу, и другие события клавиатуры могут не соответствовать никакому символу. A.10.6.2.1325 EMIT? Неопределенная задержка - это состояние связанное с устройством, типа принтер недоступен, которое требует вмешательства оператора, перед тем как устройство примет новые данные. A.10.6.2.1905 MS Каждая система имеет часы, хотя их частоты различаются. Так как много программ нуждаются в интервалах времени, предлагается это слово. Использование миллисекунд как внутреннего элемента времени - это практичный "наименьший общий знаменатель" внешнего элемента. Принятое разработчиками, оно будет использовать "такты системных часов" (безотносительно их размера) как внутренний элемент и соответствующим образом преобразовывать. A.10.6.2.2292 TIME&DATE Большинство систем имеет часы/календарь реального времени. Это слово дает переносимый доступ к нему. А.11 Дополнительный набор слов доступа к файлам Много систем Forth поддерживает доступ к базовой файловой системе, и много из них поддерживает интерпретацию Forth из файлов исходного текста. Forth-83 Стандарт не адресовал файлы базовой OS. Тем не менее, степень подобия существует среди современных реализаций. Например, файлы должны быть открыты и закрыты, созданы и удалены. Реализации файловой системы Forth отличаются главным образом в обработке и расположении кодов исключений, и в формате строк идентифицирующих файлы. Основной механизм для создания блоков управления файлом мог бы или не мог бы быть видимым. Мы хотели сохранить его невидимым. Файлы должны также читаться и писаться. Текстовые файлы, если поддерживается, должны читаться и писаться одной строкой за раз. Интерпретация текстовых файлов подразумевает, что они так или иначе интегрированы в механизм ввода текстового интерпретатора. Эти и другие требования оформлены в расширение набора слов доступа к файлу. 191 Большинство изученных существующих реализаций используют простые Английские слова для общих базовых файловых функций: OPEN, CLOSE, READ, и т.д. Хотя мы предпочли бы делать аналогично, было бы так много незначительных изменений в реализации этих слов, что принятие любого специфического значения сломала бы много существующего кода. Мы использовали названия с суффиксом -FILE для большинства этих слов. Мы поощряем разработчиков приспосабливать их однословные примитивы к ANS поведению, и надеемся что, если это сделано на широко распространенном основании мы можем принять лучшие имена определений в будущем стандарте. Специфические разъяснения для членов этого набора слов следуют далее. А.11.3 Дополнительные условия применения А.11.3.2 Блоки в файлах Много систем многократно используют идентификаторы файла; когда файл закрыт, впоследствии открытый файл может получить тот же самый идентификатор. Если первоначальный файл имеет блоки все еще в блочных буферах, они будут неправильно связаны с недавно открытым файлом с бедственным результатом. Система блочных буферов должна быть сброшена на диск, чтобы избежать этого. А.11.6 Словарь A.11.6.1.0765 BIN Некоторые операционные системы требуют, чтобы файлы были открыты в различном режиме, чтобы обратиться к их содержанию как неструктурированному потоку двоичных данных скорее, чем как к последовательности строк. Параметры для READ-FILE и WRITE-FILE - массивы символьных запоминающих элементов, каждый элемент состоит, по крайней мере, из 8 бит. Технический Комитет подразумевает что, в режиме BIN, содержание этих запоминающих элементов может быть записано в файл и позже прочитано назад без чередования. Технический Комитет отказался решать проблемы относительно воздействия "wide" символов в Файловых и Блочных наборах слов. A.11.6.1.1010 CREATE-FILE Типичное использование: : X .. S" TEST.FTH" R/W CREATE-FILE ABORT" CREATE-FILE FAILED" ... ; A.11.6.1.1717 INCLUDE-FILE Вот - две альтернативы реализации для сохранения спецификации входного источника при наличии ввода текстового файла: 1) Сохранить позицию файла (как возвращено FILE-POSITION) начала интерпретируемой строки. Для восстановления спецификации входного источника, искать эту позицию и перечитать строку во входной буфер. 192 2) Распределить отдельный буфер строки для каждого активного текстового входного файла, используя этот буфер как входной буфер. Этот метод избегает шагов "искать и перечитывать", и позволяет использовать "псевдофайлы" типа pipe и другие каналы связи только-последовательного-доступа. A.11.6.1.1718 INCLUDED Типичное использование: ... S" filename" INCLUDED ... A.11.6.1.1970 OPEN-FILE Типичное использование: : X .. S" TEST.FTH" R/W OPEN-FILE ABORT" OPEN-FILE FAILED" ... ; A.11.6.1.2080 READ-FILE Типичный последовательный алгоритм обработки файла мог бы напоминать: BEGIN ( ) ... READ-FILE THROW ( длина ) ?DUP WHILE ( длина ) ... ( ) REPEAT ( ) В этом примере THROW используется для обработки (неожиданных) исключительных ситуаций, которые сообщаются как ненулевые значения возвращаемого значения ior из READ-FILE. Конец файла сообщается как нулевое значение "длины" возвращаемого значения. A.11.6.1.2090 READ-LINE Реализациям разрешено сохранять ограничитель строки в буфере памяти, чтобы позволить использовать функции чтения строки, предоставленные базовыми операционными системами, некоторые из которых сохраняют ограничитель. Без этого условия, мог бы быть необходим временный буфер. Двух символьное ограничение достаточно для подавляющего большинства существующих операционных систем. Реализации на базовых операционных системах, чья последовательность ограничителей строки больше двух символов, могут иметь специальное действие для предотвращения запоминания больше двух символов ограничителей. Стандартные Программы не могут зависеть от присутствия никакой такой последовательности ограничителей в буфере. Типичный последовательный строчно-ориентированный алгоритм обработки файла мог бы напоминать: BEGIN ( ) . . . READ-LINE THROW ( длина not-eof-flag ) WHILE ( длина ) . . . ( ) REPEAT DROP ( ) 193 В этом примере THROW используется для обработки (неожиданной) исключительной ситуации I/O, которая сообщается как ненулевое значение возвращаемого значения "ior" из READ-LINE. READ-LINE нуждается в отдельном флаге конца файла, потому что пустая (нулевая длина) строка - стандартное событие, таким образом строка нулевой длины не может использоваться для обозначения конца файла. A.11.6.1.2165 S" Типичное использование: ... S" ccc" ... Семантика интерпретации для S" предназначена для предоставления простого механизма ввода строки в состоянии интерпретации. Так как реализация может предоставлять только один буфер для интерпретируемых строк, интерпретируемая строка подвержена перезаписи следующим выполнением S" в состоянии интерпретации. Подразумевается, что нет стандартного слова иного, чем S" могущего быть причиной перезаписи интерпретируемой строки. Однако, так как слова типа EVALUATE, LOAD, INCLUDE-FILE и INCLUDED могут приводить к интерпретации произвольного текста, возможно включая экземпляры S", интерпретируемая строка может быть сделана недействительной некоторыми использованиями этих слов. Когда может возникать возможность перезаписи строки, благоразумно копировать строку в "безопасный" буфер, распределенный приложением. Программам, желающим производить анализ способом S" советуют использовать PARSE или WORD COUNT вместо S", предотвращая перезапись интерпретируемого строкового буфера. А.12 Дополнительный набор слов для плавающей точки Технический Комитет рассмотрел много предложений, имеющих дело с включением и составом Наборов Слов с Плавающей точкой в ANS Forth. Хотя это обсуждалось, что ANS Forth не должен адресовать арифметику с плавающей точкой, и многочисленные приложения Forth не нуждаются в плавающей точке, имеется растущее число важных приложений Forth от электронных таблиц до научных вычислений, которые требуют использования арифметики с плавающей точкой. Первоначально Технический Комитет принял предложения, которые составили Forth Vendors Group Floating-Point Standard, впервые изданный в 1984, основу для включения плавающей точки в ANS Forth. Есть значительная общая практика и опыт с Forth Vendors Group Floating- Point Standard. Впоследствии технический Комитет принял предложения, которые помещали основную арифметику с плавающей точкой, стек и слова поддержки в наборе слов с плавающей точкой и трансцендентные функции с плавающей точкой в Расширении набора слов с плавающей точкой. Технический комитет также принял такие предложения: - изменены имена для ясности и последовательности; например, REALS на FLOATS, и REAL+ на FLOAT+. - удалены слова; например, FPICK. - добавлены слова для законченности и увеличенных функциональных возможностей; например, FSINCOS, F~, DF@, DF!, SF@ и SF!. Несколько проблем относительно набора слов с плавающей точкой были разрешены консенсусом в Техническом Комитете: 194 Стек с плавающей точкой: По умолчанию стек с плавающей точкой отделен от стеков данных и возвратов; однако реализация может сохранять числа с плавающей точкой на стеке данных. Программа может определять, сохраняются ли числа с плавающей точкой на стеке данных передачей строки FLOATING-STACK в ENVIRONMENT?. Это опыт нескольких членов Технического Комитета, что с надлежащей практикой кодирования, возможно написать код с плавающей точкой, который будет работать тождественно на системах с отдельным стеком с плавающей точкой и с числами с плавающей точкой сохраняемыми на стеке данных. Ввод с плавающей точкой: Текущее основание должно быть DECIMAL. Ввод с плавающей точкой - не разрешен в произвольном основании. Все числа с плавающей точкой, которые нужно интерпретировать ANS Forth Системой должны содержать индикатор экспоненты "E" (см. 12.3.7 Преобразование входных чисел текстового интерпретатора). Консенсус в Техническом Комитете считал эту форму ввода плавающей точки в более общем использовании, чем альтернатива, которая имела бы режим ввода с плавающей точкой, который позволил бы числам с внедренными десятичными точками быть обработанными как числа с плавающей точкой. Представление с плавающей точкой: Хотя формат и точность мантиссы и формат и диапазон экспоненты числа с плавающей точкой - определенное реализацией в ANS Forth, Расширение набора слов с плавающей точкой содержит слова DF@, SF@, DF!, и SF! для выборки и сохранения в памяти чисел с двойной и с одинарной точностью формата IEEE с плавающей точкой. Формат IEEE с плавающей точкой обычно используется числовыми математическими сопроцессорами и для обмена данными с плавающей точкой между программами и системами. А.12.3 Дополнительные условия применения А.12.3.5 Выравнивание адреса В определении специализированных структур данных с плавающей точкой знайте, что CREATE не обязательно оставляет указатель области данных, выровненный для различных типов данных с плавающей точкой. Программы могут выполнять требование для различных видов выравнивания с плавающей точкой, определяя соответствующее выравнивание во время компиляции и во время выполнения. Например: : FCONSTANT ( F: r -- ) CREATE FALIGN HERE 1 FLOATS ALLOT F! DOES> ( F: -- r ) FALIGNED F@ ; А.12.3.7 Преобразование входных чисел текстового интерпретатора Технический Комитет более чем однажды получал предложение, что текстовый интерпретатор в Стандартных системах Forth должен обрабатывать числа, которые имеют внедренную десятичную точку, но не экспоненту, как числа с плавающей точкой скорее, чем числа две-ячейки. Это предложение, хотя это имеет достоинство, всегда проваливалось, потому что это будет ломать очень много существующего кода; много существующих реализаций помещают полную цифровую строку на стек как двойное число и используют другие средства для информирования приложения о местоположении десятичной точки. А.12.6 Словарь 195 A.12.6.1.0558 >FLOAT >FLOAT дает возможность программам читать данные с плавающей точкой в четком ASCII формате. Оно принимает намного более широкий синтаксис, чем текстовый интерпретатор, так как последний определяет правила для создания исходных текстов программ, тогда как >FLOAT определяет правила для приема данных. >FLOAT определен так широко, как возможно разрешить ввод данных из ANS Forth Систем также как другие широко используемые стандартные среды программирования. Это синтез обычной практики FORTRAN. Внедренные пробелы явно запрещаются в большинстве научных использований, как другие разделители полей типа запятой или наклонной черты вправо. В то время как >FLOAT не требует обрабатывать строку пробелов как нуль, это поведение строго поощряется, так как будущая версия ANS Forth может включать такое требование. A.12.6.1.1427 F. Например, 1E3 F. отображает 1000.. A.12.6.1.1492 FCONSTANT Типичное использование: r FCONSTANT name A.12.6.1.1552 FLITERAL Типичное использование: : X ... [ ... ( r ) ] FLITERAL ... ; A.12.6.1.1630 FVARIABLE Типичное использование: FVARIABLE name A.12.6.1.2143 REPRESENT Это слово предоставляет примитив для отображения чисел с плавающей точкой. Некоторые форматы с плавающей точкой, в том числе определенные IEEE-754, позволяют представление чисел вне диапазона определенного реализацией. Они включают плюс и минус бесконечности, денормализованные числа, и другие. В этих случаях мы ожидаем, что REPRESENT будет обычно реализовано способным возвращать соответствующе символьные строки, типа "+infinity" или "nan", возможно обрезанные. A.12.6.2.1489 FATAN2 FSINCOS и FATAN2 - комплиментарная пара операторов, которые преобразовывают углы в 2-вектора и наоборот. Они обязательны для большинства геометрических и физических приложений, так как они правильно и однозначно обрабатывают это преобразование во всех случаях кроме нулевых векторов, даже когда тангенс угла был бы бесконечен. FSINCOS возвращает Декартовый единичный вектор в направлении данного угла, измеренного против часовой стрелки от положительной оси X. Порядок результата на стеке, а именно y ниже x, разрешает 2-векторному типу данных дополнительно рассматриваться и использоваться как отношение аппроксимирующее тангенс угла. Таким образом, фраза FSINCOS F/ -функционально эквивалентна FTAN, но полезна только для ограниченного и прерывистого диапазона углов, тогда как FSINCOS и FATAN2 полезны для всех углов. 196 Это расположение было найдено удобным в течение почти двух десятилетий, и имеет дополнительную выгоду - простоту запоминания. Заключение из этого наблюдения - это что векторы вообще должны появляться на стеке в этом порядке. Порядок параметров для FATAN2 тот же самый, преобразовывает вектор в обычное представление скалярного угла. Таким образом, для всех углов FSINCOS FATAN2 - это тождество в пределах точности арифметики и диапазона параметра FSINCOS. Заметьте что, в то время как FSINCOS всегда возвращает допустимый вектор элемента, FATAN2 примет любой ненулевой вектор. Неопределенная ситуация существует, если векторный параметр для FATAN2 имеет нулевую величину. A.12.6.2.1516 FEXPM1 Эта функция позволяет точное вычисление, когда его параметры - близки к нулю, и предоставляет полезное ядро для стандартных показательных функций. Гиперболические функции, такие как cosh(x), могут быть эффективно и точно реализованы использованием FEXPM1; точность теряется в этой функции для малых значений x, если используется слово FEXP. Важное приложение этого слова в финансах; говорите, что ссуда возмещена в 15 % в год; какова суточная дача? На компьютере с единичной точностью (6 десятичных цифр) точность: 1. Использование FLN и FEXP: FLN от 1.15 = 0.139762, деление на 365 = 3.82910E-4, формирование экспоненты, используя FEXP = 1.00038, и вычитание единицы (1), и преобразование в проценты = 0.038%. Таким образом, мы имеем точность только две цифры. 2. Использование FLNP1 и FEXPM1: FLNP1 от 0.15 = 0.139762, (это - то же самое значение как в первом примере, хотя с параметром ближе к нулю оно не может быть таким) деление на 365 = 3.82910E-4, формирование экспоненты, и вычитание единицы (1) , используя FEXPM1 = 3.82983E-4, и преобразование в проценты = 0.0382983%. Это - точность полных 6 цифр. Присутствие этого слова позволяет гиперболическим функциям быть вычисленными с пригодной для использования точностью. Например, гиперболический синус может быть определен как: : FSINH ( r1 -- r2 ) FEXPM1 FDUP FDUP 1.0E0 F+ F/ F+ 2.0E0 F/ ; A.12.6.2.1554 FLNP1 Эта функция позволяет точную компиляцию, когда ее параметры близки к нулю, и предоставляет полезное ядро для стандартных логарифмических функций. Например, FLN может быть реализована как: 197 : FLN 1.0E0 F- FLNP1 ; См.: A.12.6.2.1516 FEXPM1. A.12.6.2.1616 FSINCOS См.: A.12.6.2.1489 FATAN2. A.12.6.2.1640 F~ Оно предоставляет три типа "равенства с плавающей точкой" в общем использовании -- "закрытое" в абсолютных терминах, точное равенство как представлено, и "относительно закрытое". А.13 Дополнительный Locals набор слов Технический Комитет имел проблему с locals. было убедительно аргументировано, что ANS Forth не должен ничего говорить о locals, так как: - нет, ясной принятой практики в этой области; - не все программисты Forth используют их или даже знают то, чем они являются; - и немного реализаций используют один и тот же синтаксис, не говоря уже о тех же широких правилах использования и общих подходах. Также было аргументировано, это будет казаться одинаково убедительно, что нехватка каких либо стандартных подходов к locals - это точно причина для нехватки принятой практики, так как locals являются очень нетривиальными для реализации переносимым и практичным способом. Было далее аргументировано, что пользователи, которые выбрали стать зависящими от locals, имеют тенденцию быть связанными с единственным продавцом и имеют мало стимулов для присоединения к группе, которая, на это надежда, "широко примет" ANS Forth, вместо Стандартного обращения к его проблемам. Так как Технический Комитет был не способен достигнуть твердого согласия относительно того игнорировать locals или при принять синтаксис какого либо специфического продавца, он искал некоторый путь решения проблемы, которую был не способен просто отклонить. Понимание, что никакой отдельный механизм или синтаксис не может одновременно удовлетворить желания, выраженные во всех предложениях locals, которые были получены, упростило постановку задачи, чтобы определить механизм locals, так: - является независимым от любого специфического синтаксиса; - является расширяемым пользователем; - допускает использование произвольных идентификаторов local в контексте отдельного определения; - поддерживает фундаментальные типы данных размера ячейки Forth; и - работает согласовано, особенно что касается реентерабельности и рекурсии. Техническому Комитету кажется, что так много тех, кто активно используют locals, затрудняются в работе с ними, и это в настоящее время согласие Технического Комитета что, если ANS Forth имеет, что ни будь сказать относительно предмета, то это приемлемая вещь для того, чтобы это говорить. Этот подход, определения (LOCAL), предложен как единственный, который может использоваться с небольшим количеством пользовательского кодирования для реализации некоторых, но не всех, схем locals в использовании. Следующие примеры кодирования иллюстрируют, как это может использоваться для реализации двух синтаксисов. 198 - Синтаксис, определенный этим Стандартом и используемый в системах Creative Solutions, Inc.: : LOCALS| ( "name...name |" -- ) BEGIN BL WORD COUNT OVER C@ [CHAR] | - OVER 1 - OR WHILE (LOCAL) REPEAT 2DROP 0 0 (LOCAL) ; IMMEDIATE : EXAMPLE ( n -- n**2 n**3 ) LOCALS| N | N DUP N * DUP N * ; - Предложенный синтаксис: ( LOCAL name ) с дополнительными правилами использования: : LOCAL ( "name" -- ) BL WORD COUNT (LOCAL) ; IMMEDIATE : END-LOCALS ( -- ) 0 0 (LOCAL) ; IMMEDIATE : EXAMPLE ( n -- n n**2 n**3 ) LOCAL N END-LOCALS N DUP N * DUP N * ; Другие синтаксисы могут быть реализованы, хотя некоторые, вероятно, будут требовать значительно большие усилия или в некоторых случаях преобразование программы. Все же другие подходы locals полностью несовместимы из-за больших различий в правилах использования и в некоторых случаях даже контекста идентификаторов. Например, законченная схема local использованная Johns Hopkins имела сложную семантику, которая не может быть повторена в терминах этой модели. Для подкрепления намерений раздела 13, вот два примера фактического использования locals. Первый иллюстрирует правильное использование: a) : { ( "name ... }" - ) BEGIN BL WORD COUNT OVER C@ [CHAR] } - OVER 1 - OR WHILE (LOCAL) REPEAT 2DROP 0 0 (LOCAL) ; IMMEDIATE b) : JOE ( a b c -- n ) >R 2* R> 2DUP + 0 { ANS 2B+C C 2B A } 2 0 DO 1 ANS + I + TO ANS ANS . CR LOOP ANS . 2B+C . C . 2B . A . CR ANS ; c) 100 300 10 JOE . 199 Слово { в a) определяет синтаксис объявления local, который окружает список locals фигурными скобками. Оно не делает чего ни будь фантастического, типа переупорядочивания locals или предоставления начальных значений для некоторых из них, так locals инициализируются со стека в заданном по умолчанию порядке. Определение JOE в b) иллюстрирует использование этого синтаксиса. Заметьте, что работа выполнена во время выполнения в этом определении прежде, чем объявлены locals. Хорошо использовать стек возвратов, пока что-либо помещенное туда, удалится до начала объявления. Заметьте, что перед объявлением locals, удвоено B, вычислено подвыражение (2B+C), и предусмотрено начальное значение (нуль) для ANS. После того, как locals были объявлены, JOE продолжает использовать их. Заметьте, что к locals можно обращаться и модифицировать в пределах do-loops. Эффект интерпретации строки c) должен отобразить следующие значения: 1 (ANS первый раз через цикл), 3 (ANS второй раз), 3 (ANS), 610 (2B+C), 10 (C), 600 (2B), 100 (A), and 3 (ANS оставлено на стеке JOE). Имена locals исчезают после того, как JOE было откомпилировано. Память и значение locals появляются, когда объявлены locals JOE и исчезают как JOE возвращается к его вызывающей программе в ; (точка с запятой). Второй набор примеров иллюстрирует различные вещи, которые нарушают правила. Мы принимаем, что определения LOCAL и END-LOCALS выше присутствуют наряду с { из предшествующего примера. d) : ZERO 0 POSTPONE LITERAL POSTPONE LOCAL ; IMMEDIATE e) : MOE ( a b ) ZERO TEMP LOCAL B 1+ LOCAL A+ ZERO ANSWER ; f) : BOB ( a b c d ) { D C } { B A } ; Вот - два определения с различными нарушениями правила 13.3.3.2a. В e) объявление из TEMP законно и создает local, чье начальное значение нулевое. Это - хорошо потому что выполняемый код, который генерирует ZERO, предшествует первому использованию (LOCAL) в определении. Однако, 1+ предшествующее объявлению A+ незаконно. Аналогично использование ZERO для определения ANSWER незаконно, потому что оно генерирует выполняемый код между использованиями (LOCAL). Наконец, MOE заканчивается незаконно (не END-LOCALS). BOB в f) нарушает правило против объявления двух наборов locals. g) : ANN ( a b -- b ) DUP >R DUP IF { B A } THEN R> ; h) : JANE ( a b -- n ) { B A } A B + >R A B - R> / ; ANN в g) нарушает два правила. IF ... THEN вокруг объявления ее locals нарушает 13.3.3.2b, и копия B, оставленная на стеке возвратов перед объявлением locals, нарушает 13.3.3.2c. JANE в h) нарушает 13.3.3.2d, обращаясь к locals после размещения суммы A и B на стеке возвратов без первого удаления этой суммы. i) : CHRIS ( a b) { B A } ['] A EXECUTE 5 ['] B >BODY ! [ ' A ] LITERAL LEE ; 200 CHRIS в i) иллюстрирует три нарушения 13.3.3.2e. Попытка EXECUTE local вызванное A несовместимо с некоторыми реализациями. Запись в B через >BODY вероятно вызовет трагический результат во многих реализациях; кроме того, если locals находятся в регистрах, они не могут быть адресованы как память независимо оттого, что написано. Третье нарушение, в котором идентификатор исполнения для определения local передается как параметр к слову LEE, если позволено, имел бы неприятное следствие, что LEE может EXECUTE лексему и получить значение для A от специфического выполнения CHRIS , которое вызывает на сей раз LEE. 13.3 Дополнительные условия применения Правило 13.3.3.2d может быть ослаблено без воздействия на целостность остальной части этой структуры. 13.3.3.2c не может. 13.3.3.2b запрещает использование стека данных для хранения local, потому что нет четко определенных правил использования для пользователей программистов в таком случае. Конечно, если стек данных как-то используется таким способом, что нет никаких правил использования, при которых locals невидимы для программиста, логически являются не на стеке, и соответствует реализации. Минимальное требуемое число locals может (и должно) быть откорректировано, чтобы минимизировать стоимость соглашения для существующих пользователей locals. Обращение к предварительно объявленным переменным local, запрещено Разделом 13.3.3.2d до того как любые данные, помещенные на стек возвратов приложением будут удалены, из-за возможного использования стека возвратов для хранения locals. Разрешение для Стандартной Программы управлять стеком возвратов (например, через >R R>) в то время как активны переменные local, чрезмерно сдерживает возможности реализации. Соглашение пользователей locals состояло в том, что Local средства представляют эффективную функциональную замену для манипуляции стеком возвратов, и было разумно ограничение стандартного использования только для одного метода. Обращение к locals в пределах, DO..LOOP явно разрешаются Разделом 13.3.3.2g, как дополнительное требование приспосабливания систем. Хотя слова, типа (LOCALS), написаны системным Разработчиком, может требоваться сокровенное знание внутренней структуры стека возвратов, такое знание не требуется пользователю совместимых систем Forth. А.13.6 Словарь A.13.6.1.2295 TO Типичное использование: x TO name См.: A.6.2.2295 TO. 201 A.13.6.2.1795 LOCALS| Возможная реализация этого слова и примера использования дана в A.13, выше. Это предназначено только как пример; приемлема любая реализация, соглашающаяся с описанной семантикой. А.14 дополнительный набор слов Распределения памяти Набор слов Распределения памяти предоставляет средства для запроса памяти отличной от непрерывной области данных распределенной ALLOT. Во многих средах операционных систем неуместно для процесса пред-распределять большие количества непрерывной памяти (как было бы необходимо для использования ALLOT). Набор слов Распределения памяти может запрашивать память из системы в любое время, без знания заранее адреса памяти, где она будет получена. А.15 Дополнительный набор слов утилит Эти слова были в широко распространенном общем использовании, начиная с самых ранних систем Forth. Хотя есть зависимости от окружений, присущие программам использующим ассемблер, фактически все системы Forth предоставляют такую возможность. Поскольку так много программ Forth предназначенных для приложений реального времени и внутренне непереносимых по этой причине, технический Комитет верит, что предоставление стандартного окна в ассемблеры - это полезное содействие программистам Forth. Точно так же помощники программирования DUMP, и т.д., являются ценными инструментальными средствами даже притом, что их специфические форматы будут колебаться в зависимости от реализаций Forth и CPU. Эти слова - прежде всего, предназначены для использования программистом, и редко вызываются в программах. Одна из первоначальных целей Forth состояла в том, чтобы стереть границу между "пользователем" и "программистом" - чтобы дать всю возможную мощь любому, кто имел случай использовать компьютер. Ничто из выше отмеченного или высказанного не должно быть истолковано, так что эта цель была оставлена. А.15.6 Словарь A.15.6.1.0220 .S .S - удобство отладки, найденное почти на всех системах Forth. Оно - повсюду упомянуто в текстах Forth. A.15.6.1.2194 SEE SEE действует онлайновая форма документации слов, позволяя модификацию слов декомпиляцию и восстановление с соответствующими изменениями. A.15.6.1.2465 WORDS WORDS - удобство отладки, найденное почти на всех системах Forth. Оно - повсюду упомянуто в текстах Forth. 202 A.15.6.2.0470 ;CODE Типичное использование: : namex ... ... ;CODE ... Где namex - определяющее слово, и - это CREATE или любое определяемое пользователем слово, которое вызывает CREATE. A.15.6.2.0930 CODE Некоторые системы Forth реализуют ассемблерную функцию, добавляя список слов ASSEMBLER к порядку поиска, используя текстовый интерпретатор для выделения постфиксного ассемблера с лексическими характеристиками, подобными исходному тексту Forth. Как правило, в таких системах, ассемблирование заканчивается, когда интерпретируется слово END-CODE. A.15.6.2.1015 CS-PICK Намерение состоит в том, чтобы повторить dest на стеке потока управления так, чтобы оно могло быть разрешено больше чем однажды. Например: \ Условная передача управление на начало цикла \ Это подобно духу "C" инструкции "continue". : ?REPEAT ( dest -- dest ) \ Компиляция ( flag -- ) \ Выполнение 0 CS-PICK POSTPONE UNTIL ; IMMEDIATE : XX ( -- ) \ Пример использования ?REPEAT BEGIN ... flag ?REPEAT ( Возврат к BEGIN если flag - false ) ... flag ?REPEAT ( Возврат к BEGIN если flag - false ) ... flag UNTIL ( Возврат к BEGIN если flag - false ) ... ; A.15.6.2.1020 CS-ROLL Намерение состоит в том, чтобы изменить порядок, в котором origs и dests на стеке потока управления должны быть разрешены последующими словами потока управления. Например, WHILE могло быть реализовано, в терминах IF и CS-ROLL, следующим образом: : WHILE ( dest -- orig dest ) POSTPONE IF 1 CS-ROLL ; IMMEDIATE 203 A.15.6.2.1580 FORGET Типичное использование: ... FORGET name ... FORGET предполагает, что вся информация необходимая для восстановления словаря к его предыдущему состоянию выводима как-нибудь из забываемого слова. В то время как это может быть верно в простой линейной модели словаря, это трудно реализовать в других системах Forth; например в системах с множественными адресными пространствами. Например, если Forth внедрен в ROM, как FORGET узнать, сколько RAM восстановится, когда массив забыт? Общее и привилегированное решение предусмотрено MARKER. A.15.6.2.2531 [ELSE] Типичное использование: ... flag [IF] ... [ELSE] ... [THEN] ... A.15.6.2.2532 [IF] Типичное использование: ... flag [IF] ... [ELSE] ... [THEN] ... A.15.6.2.2533 [THEN] Типичное использование: ... flag [IF] ... [ELSE] ... [THEN] ... Программное обеспечение, которое выполняется на нескольких системных окружениях часто, содержит некоторый исходный текст, который зависит от окружения. Условная компиляция - это выборочное включение или исключение частей исходного текста во время компиляции - является одной методикой, которая часто используется для помощи в обслуживании такого исходного текста. Условная компиляция иногда делается с "разумными комментариями" - определениями, которые пропускают или не пропускают остаток строки, основываясь на некоторой проверке. Например: \ Если 16-Bit? содержит TRUE, строка с предшествующим 16BIT\ \ будет пропущена. Иначе, она не будет пропущена. VARIABLE 16-BIT? : 16BIT\ ( -- ) 16-BIT? @ IF POSTPONE \ THEN ; IMMEDIATE Эта методика работает на строке строчного базиса, и хороша для коротких изолированных разновидностей кодовых последовательностей. Более сложные проблемы условной компиляции предлагают метод вложенности, который может охватить больше одной исходной строки одновременно. Слова, включенные в ANS Forth расширение дополнительного набора слов утилит полезны для этой цели. Реализация, данная ниже, работает с любым входным источником (клавиатура, EVALUATE, BLOCK, или текстовый файл). 204 : [ELSE] ( -- ) 1 BEGIN \ level BEGIN BL WORD COUNT DUP WHILE \ level adr len 2DUP S" [IF]" COMPARE 0= IF \ level adr len 2DROP 1+ \ level' ELSE \ level adr len 2DUP S" [ELSE]" COMPARE 0= IF \ level adr len 2DROP 1- DUP IF 1+ THEN \ level' ELSE \ level adr len S" [THEN]" COMPARE 0= IF \ level 1- \ level' THEN THEN THEN ?DUP 0= IF EXIT THEN \ level' REPEAT 2DROP \ level REFILL 0= UNTIL \ level DROP ; IMMEDIATE : [IF] ( flag -- ) 0= IF POSTPONE [ELSE] THEN ; IMMEDIATE : [THEN] ( -- ) ; IMMEDIATE А.16 Дополнительный набор слов порядка поиска Спецификация Порядка поиска и механизмы управления широко различаются. FIG- Forth, Forth-79, polyFORTH, и Forth-83 словарь и механизмы порядка поиска - все взаимно несовместимы. Законченный список несовместимых механизмов, используемых или предлагаемых, много длиннее. ALSO/ONLY схема, описанная в Forth-83 Экспериментальных Предложениях, имеет прочную поддержку семейства. Однако многие полагают, что она была фундаментально порочна, и энергично против этого выступают. Признавая это разнообразие этот Стандарт определяет новый "примитивный" набор утилит, из которых могут быть созданы различные схемы. Этот примитивный набор слов порядка поиска предназначен, чтобы быть переносимым "набором конструкций" от которого могут быть сформированы слова порядка поиска скорее, чем интерфейс пользователя. ALSO/ONLY или другие схемы "словаря", поддерживаемые главными продавцами Forth могут быть определены в терминах примитивного набора слов порядка поиска. Кодирование для идентификаторов списка слов wid могло бы быть маленьким-целым индексом в массиве записей определений списка слов, адрес области данных такой записи, смещение пользовательской области, идентификатор исполнения Forth-83 стиля непонятного словаря, адрес поля связи первого определения в списке слов, или что-нибудь еще. Это - полностью к системному разработчику. В некоторых системах интерпретация числовых литералов управляется включением "псевдо списка слов" которые распознают числа в конце порядка поиска. Эта методика обеспечивается поведением "порядка поиска по умолчанию" SET-ORDER когда дан параметр -1. В системе, использующей традиционную реализацию ALSO/ONLY, минимальный порядок поиска был бы эквивалентен слову ONLY. 205 Никогда не было переносимого способа восстановить сохраненный порядок поиска. F83 (не Forth 83) представил слово PREVIOUS, которое почти сделало возможным "разгрузить" порядок поиска неоднократно выполняя фразу CONTEXT @ PREVIOUS. Порядок поиска мог быть "перезагруженным", повторением ALSO CONTEXT !. К сожалению, не было никакого переносимого пути для определения, сколько списков слов были в порядке поиска. ANS Forth удалил слово CONTEXT, потому что во многих системах его содержание относится к более чем одному списку слов, составляя проблемы переносимости. Заметьте, что : (двоеточие) больше не затрагивает порядок поиска. Предыдущее поведение, где список слов компиляции заменяет первый список слов порядка поиска, может быть эмулировано следующим переопределением : (двоеточие). : : GET-ORDER SWAP DROP GET-CURRENT SWAP SET-ORDER : ; А.16.2 Дополнительные термины Порядок поиска Заметьте, что использование термина "список" не обязательно подразумевает реализацию как связанного списка. А.16.3.3 Поиск определений имен Другими словами не гарантируется, что следующее будет работать: : FOO ... [ ... SET-CURRENT ] ... RECURSE ... ; IMMEDIATE RECURSE , ; (точка с запятой), и IMMEDIATE могут или не могут нуждаться в информации, сохраненной в списке слов компиляции. А.1'.' Словарь A.16.6.1.2192 SEARCH-WORDLIST Строковый параметр для SEARCH-WORDLIST представленный c-addr u, скорее чем только c-addr как в FIND. Комитет желает установить c-addr u как привилегированное представление строки на стеке, и приняло это представление для всех новых функций, которые принимают строковые параметры. В то время как это решение может вызывать реализацию SEARCH-WORDLIST несколько более трудную в существующих системах, комитет чувствует, что дополнительная трудность незначительна. Когда SEARCH-WORDLIST не в состоянии найти слово, оно не возвращает строку, как делает FIND. Это - в соответствии с общим принципом, что слова Forth потребляют их параметры. A.16.6.2.0715 ALSO Вот - реализация ALSO/ONLY в терминах примитивного набора слов порядка поиска. 206 WORDLIST CONSTANT ROOT ROOT SET-CURRENT : DO-VOCABULARY ( -- ) \ Фактор реализации DOES> @ >R ( ) ( R: widnew ) GET-ORDER SWAP DROP ( wid1 ... widn-1 n ) R> SWAP SET-ORDER ; : DISCARD ( x1 .. xu u - ) \ Фактор реализации 0 ?DO DROP LOOP \ DROP u+1 элементов стека ; CREATE FORTH FORTH-WORDLIST , DO-VOCABULARY : VOCABULARY ( name -- ) WORDLIST CREATE , DO-VOCABULARY ; : ALSO ( -- ) GET-ORDER OVER SWAP 1+ SET-ORDER ; : PREVIOUS ( -- ) GET-ORDER SWAP DROP 1- SET-ORDER ; : DEFINITIONS ( -- ) GET-ORDER OVER SET-CURRENT DISCARD ; : ONLY ( -- ) ROOT ROOT 2 SET-ORDER ; \ Forth-83 версия; только удаляет ONLY : SEAL ( -- ) GET-ORDER 1- SET-ORDER DROP ; \ F83 and F-PC версия; оставляет только CONTEXT : SEAL ( -- ) GET-ORDER OVER 1 SET-ORDER DISCARD ; Предшествующее определение ONLY в терминах "ROOT" списка слов следует использованию в F83, и предполагает, что заданный по умолчанию порядок поиска только включает ROOT и FORTH. Более переносимое определение FORTH и ONLY, без предположений: <опускает ... WORDLIST CONSTANT ROOT ... строку> CREATE FORTH GET-ORDER OVER , DISCARD DO-VOCABULARY : ONLY ( -- ) -1 SET-ORDER ; Вот - простая реализация GET-ORDER и SET-ORDER, включая соответствующее определение FIND. Реализации WORDLIST, SEARCH-WORDLIST, GET-CURRENT и SET- CURRENT зависят от системных подробностей и не даны здесь. 16 CONSTANT #VOCS VARIABLE #ORDER CREATE CONTEXT #VOCS CELLS ALLOT : GET-ORDER ( -- wid1 .. widn n ) #ORDER @ 0 ?DO #ORDER @ I - 1- CELLS CONTEXT + @ LOOP #ORDER @ ; 207 : SET-ORDER ( wid1 .. widn n -- ) DUP -1 = IF DROP <помещает системный список слов по умолчанию и n> THEN DUP #ORDER ! 0 ?DO I CELLS CONTEXT + ! LOOP ; : FIND ( c-addr -- c-addr 0 | w 1 | w -1 ) 0 ( c-addr 0 ) #ORDER @ 0 ?DO OVER COUNT ( c-addr 0 c-addr' u ) I CELLS CONTEXT + @ ( c-addr 0 c-addr' u wid) SEARCH-WORDLIST ( c-addr 0; 0 | w 1 | w -1 ) ?DUP IF ( c-addr 0; w 1 | w -1 ) 2SWAP 2DROP LEAVE ( w 1 | w -1 ) THEN ( c-addr 0 ) LOOP ( c-addr 0 | w 1 | w -1 ) ; В реализации, где механизм поиска в словаре использует хеш-таблицу или кэш поиска для уменьшения времени поиска, SET-ORDER мог бы быть должен восстановить хеш-таблицу или сбросить на диск кэш. А.17 Дополнительный строковый набор слов А.17.6 Словарь A.17.6.1.0245 /STRING /STRING используется для удаления или добавления символов относительно "левого" конца символьной строки. Положительные значения n исключат символы со строки, в то время как отрицательные значения n будут включать символы слева от строки. /STRING - естественный агент WORD и обычно доступный. A.17.6.1.0910 CMOVE Если c-addr2 находится в пределах исходной области, (то есть, когда c-addr2 - не меньше чем c-addr1 и c-addr2 - меньше чем количество c-addr1 u CHARS +), происходит размножение памяти. Типичное использование: Предположите символьную строку по адресу 100: "ABCD". Тогда после 100 DUP CHAR+ 3 CMOVE строка по адресу 100 - "AAAA". Объяснение для CMOVE и CMOVE> вытекает из MOVE. 208 A.17.6.1.0920 CMOVE> Если c-addr1 находится в пределах области назначения, (то есть, когда c-addr1 больше чем или равно c-addr2 и c-addr2 - меньше чем количество c-addr1 u CHARS +), происходит размножение памяти. Типичное использование: Предположите символьную строку по адресу 100: "ABCD". Тогда после 100 DUP CHAR+ SWAP 3 CMOVE>, строка по адресу 100 - "DDDD". A.17.6.1.0935 COMPARE Существующие системы Forth исполняют строковые операции сравнения, использующие слова, которые отличаются проверкой правописания, параметрами ввода и вывода, и чувствительностью к регистру. Была выбрана одна широко используемая. A.17.6.1.2191 SEARCH Существующие системы Forth исполняют операции поиска строки, использующие слова, которые отличаются проверкой правописания, параметрами ввода и вывода, и чувствительностью к регистру. Была выбрана одна широко используемая. A.17.6.1.2212 SLITERAL Текущие функциональные возможности 6.1.2165 S" могут быть предоставлены следующим определением: : S" ( "ccc" -- ) [CHAR] " PARSE POSTPONE SLITERAL ; IMMEDIATE B. Библиография (информационное приложение) Промышленные стандарты ---------------------- Forth-77 Стандарт, Forth Users Group, FST-780314. Forth-78 Стандарт, Forth International Standards Team. Forth-79 Стандарт, Forth Standards Team. Forth-83 Стандарт и Приложения, Forth Standards Team. Стандарты, упомянутые в этом разделе, были разработаны Forth Standards Team, группой добровольцев, которая включила и разработчиков и пользователей. Это была организация добровольцев, работающая под ее собственным уставом и без любых формальных связей с ANSI, IEEE или любого подобного органа стандартов. Несколько членов Forth Standards Team также были членами X3J14 Технического Комитета. Книги ----- Brodie, L. Starting FORTH (2nd ed). Englewood Cliffs, NJ: Prentice Hall, 1987. Brodie, L. Thinking FORTH. Englewood Cliffs, NJ: Prentice Hall, 1984. 209 Feierbach, G. and Thomas, P. Forth Tools & Applications. Reston, VA: Reston Computer Books, 1985. Haydon, Dr. Glen B. All About FORTH, Third Edition. La Honda, CA: 1990. Kelly, Mahlon G. and Spies, N. FORTH: A Text and Reference. Englewood Cliffs, NJ: Prentice Hall, 1986. Knecht, K. Introduction to Forth. Indiana: Howard Sams & Co., 1982. Koopman, P. Stack Computers, The New Wave. Chichester, West Sussex, England: Ellis Horwood Ltd. 1989 Martin, Thea, editor. A Bibliography of Forth References, Third Edition. Rochester, New York: Institute of Applied Forth Research, 1987. McCabe, C. K. Forth Fundamentals (2 volumes). Oregon: Dilithium Press, 1983. Pountain, R. Object Oriented Forth. London, England: Academic Press, 1987. Ouverson, Marlin, editor. Dr. Dobbs Toolbook of Forth. Redwood City, CA: M&T Press, Vol. 1, 1986; Vol. 2, 1987. Terry, J. D. Library of Forth Routines and Utilities. New York: Shadow Lawn Press, 1986 Tracy, M. and Anderson, A. Mastering FORTH (revised ed). New York: Brady Books, 1989. Winfield, A. The Complete Forth. New York: Wiley Books, 1983. Journals, magazines and newsletters Forsley, Lawrence P., Conference Chairman. Rochester Forth Conference Proceedings. Rochester, New York: Institute of Applied Forth Research, 1981 to present. Forsley, Lawrence P., Editor-in-Chief. The Journal of Forth Application and Research.Rochester, New York: Institute of Applied Forth Research, 1983 to present. Frenger, Paul, editor. SIGForth Newsletter. New York, NY: Association for Computing Machinery, 1989 to present. Ouverson, Marlin, editor. Forth Dimensions. San Jose, CA: The Forth Interest Group, 1978 to present. Reiling, Robert, editor. FORML Conference Proceedings. San Jose, CA: The Forth Interest Group, 1980 to present. Ting, Dr. C. H., editor. More on Forth Engines. San Mateo, CA: Offete Enterprises, 1986 to present. Избранные статьи ---------------- 210 Hayes, J.R. "Postpone" Proceedings of the 1989 Rochester Forth Conference. Rochester, New York: Institute for Applied Forth Research, 1989. Kelly, Guy M. "Forth." McGraw-Hill Personal Computer Programming Encyclopedia ¦ Languages and Operation Systems. New York: McGraw-Hill, 1985. Kogge, P. M. "An Architectural Trail to Threaded Code Systems." IEEE Computer (March, 1982). Moore, C. H. "The Evolution of FORTH - An Unusual Language." Byte (August 1980). Rather, E. D. "Forth Programming Language." Encyclopedia of Physical Science & Technology (Vol. 5). New York: Academic Press, 1987. Rather, E. D. "FORTH." Computer Programming Management. Auerbach Publishers, Inc., 1985. Rather, E. D.; Colburn, D. R.; Moore, C. H. "The Evolution of FORTH." ACM SIGPLAN Notices. (Vol. 28, No. 3, March 1993). 211 C. Перспектива (информационное приложение) Цель этого раздела состоит в том, чтобы предоставить краткий неформальный обзор Forth как языка, иллюстрируя его хронологию, наиболее видные возможности, использование, и общие методы реализаций. Ничто в этом разделе не должно рассматриваться как обязывающее разработчиков или пользователей. Список книг и статей - данный в Приложении B для заинтересованных в больших познаниях о Forth. C.1 Возможности Forth Forth предоставляет интерактивную среду программирования. Его первичные использования были - научные и индустриальные приложения типа оснащения аппаратурой, робототехника, управление процессом, графика и обработка изображений, искусственный интеллект и деловые приложения. Основные преимущества Forth включают быструю, интерактивную программную разработку и эффективное использование компьютерных аппаратных средств. О Forth часто говорят как языке, потому что это его наиболее видимый аспект. Но фактически, Forth это и больше и меньше чем обычный язык программирования: больше в том, что все свойства, обычно связываемые с большим портфелем отдельных программ (компиляторы, редакторы, и т.д.) включены в пределах его диапазона, и меньше, в чем он испытывает недостаток (преднамеренно), сложная характеристика синтаксиса большинства языков высокого уровня. Первоначальные реализации Forth были автономными системами, которые включали функции, обычно выполняемые отдельными операционными системами, редакторы, компиляторы, ассемблеры, отладчики и другие утилиты. Единственный простой, непротиворечивый набор правил управлял этим полным диапазоном свойств. Сегодня, хотя очень быстрые автономные версии все еще продаются для многих процессоров, есть также много версий, которые работают одновременно с обычными операционными системами типа MS DOS и UNIX. Forth не получен из какого либо другого языка. В результате, его вид и внутренние характеристики могут казаться незнакомыми новым пользователям. Но простота Forth, высочайшая модульность, и интерактивная природа смещали начальную странность, делая его легким в изучении и в использовании. Новый программист Forth должен вложить некоторое время, осваивая его большой командный набор. После приблизительно месяца полных рабочих дней использования Forth, программист мог помнить большее количество его внутренней работы, чем возможно с обычными операционными системами и компиляторами. Наиболее нетрадиционная функция Forth - его расширяемость. Процесс программирования в Forth состоит из определения новых "слов" - фактически новых команд на языке. Они могут быть определены в терминах предварительно определенных слов, так как почти каждый обучает детей понятиям, объясняя их в терминах предварительно усвоенных понятий. Такие слова названы "высокоуровневыми определениями". Альтернативно, новые слова могут также быть определены в ассемблерном коде, поскольку большинство реализаций Forth включает ассемблер для базового процессора. Эта расширяемость облегчает разработку языков специального применения для специфических прикладных областей или дисциплин. Расширяемость Forth выходит за пределы только добавления новых команд к языку. С эквивалентной непринужденностью, можно также добавлять новые виды слов. То есть можно создать слово, которое непосредственно определит слова. Создавая такое определяющее слово, программист может определить специализированное поведение для слов, которые оно создаст, и которые будут эффективны во время компиляции, во время выполнения, или в обоих случаях. 212 Эта возможность позволяет определять специализированные типы данных, с полным контролем над структурой и поведением. Поскольку поведение времени-выполнения таких слов может быть определено высокоуровневым или в коде, слова созданные этим новым определяющим словом эквивалентны в работе всем другим видам слов Forth. Кроме того, также просто добавить новые директивы компилятора для реализации специальных видов циклов или других управляющих структур. Большинство профессиональных реализаций Forth написано в Forth. Много систем Forth включают "транслятор метаязыка", который позволяет пользователю изменять непосредственно внутреннюю структуру системы Forth. C.2 Хронология Forth Forth был изобретен Charles H. Moore. Непосредственный результат работы Moore в 1960-е, первая программа, которая названа Forth была написана около 1970. Первая законченная реализация использовалась в 1971 в National Radio Astronomy Observatory на 11-метровом радио телескопе в Аризоне. Эта система была ответственна за наведение и слежение телескопа, сбор данных и запись их на магнитной ленте, и поддержку интерактивного графического терминала, на котором астроном мог анализировать предварительно зарегистрированные данные. Многозадачная природа системы позволила всем этим функциям быть выполненными одновременно, без разрешения конфликтов или другого вмешательства - очень продвинутая концепция для того времени. Система была настолько полезна, что астрономы со всех континентов начали просить о копиях. Его использование быстро распространилось, и в 1976 Forth был принят как стандартный язык International Astronomical Union. В 1973, Moore и коллеги сформировали Forth, Inc для изучения коммерческого использования языка. Forth, Inc разработала многопользовательские версии Forth на миникомпьютерах для разнообразных проектов, в пределах от баз данных до научных приложений типа обработки изображений. В 1977, Forth, Inc разработала версию для недавно представленных 8-бит микропроцессоров названную "microFORTH", которая успешно использовалась во встроенных в микропроцессор приложениях в Соединенных Штатах, Англии и Японии. Стимулированная объемом сбыта microFORTH, группа людей с компьютерным хобби в Северной Калифорнии заинтересовалась Forth, и в 1978 сформировала Forth Interest Group (FIG). Они разработали упрощенную модель, которую они реализовали на нескольких микропроцессорах и издали распечатки и диски очень низкой стоимости. Интерес к Forth распространился быстро, и сегодня есть отделения Forth Interest Group по всей США и в более чем пятнадцати странах. К 1980, множество новых продавцов Forth пришло на рынок с версиями Forth основанными на модели FIG. Прежде всего, предназначенные для персональных компьютеров, эти относительно недорогие системы Forth были распространены очень широко. C.3 Аппаратные реализации Forth Внутренняя архитектура Forth моделирует компьютер с двумя стеками, набором регистров, и другими стандартизированными возможностями. В результате, это было почти неизбежно, что кто-то пытался бы построить аппаратное представление фактического компьютера Forth. 213 В начале 1980-ых, Rockwell произвела 6502-вариант с примитивами Forth во встроенной ROM, Rockwell 65F11. Этот чип использовался успешно во многих внедренных микропроцессорных приложениях. В середине 1980х Zilog разработала z8800 (Super8) которая предложила ENTER (nest), EXIT (unnest) и NEXT в микропрограмме. В 1981, Moore взялся проектировать реализацию на уровне кристалла виртуальной Forth машины. Работая сначала в Forth, Inc и впоследствии с компанией запуска NOVIX, сформированной для разработки чипа, Moore завершил конструкцию в 1984, и первые прототипы были произведены в начале 1985. Более ранние Forth процессоры были разработаны Harris Semiconductor Corp., Johns Hopkins University, и другими. C.4 Попытки стандартизации Первым главным усилием по стандартизации Forth была встреча в Утрехте в 1977. Посетители произвели предварительный стандарт, и согласились встретиться на следующий год. 1978 встречу также посетили члены недавно сформированной Forth Interest Group. В 1979 и 1980 ряд встреч, посещаемых и пользователями и продавцами, произвели более всесторонний стандарт названный Forth 79. Хотя Forth 79 был очень влиятелен, много пользователей Forth и продавцов нашли в нем серьезные недостатки, и в 1983 был выпущен новый стандарт названный Forth 83. Поощренная широко распространенным принятием Forth 83, группа пользователей и продавцов встретилась в 1986, чтобы исследовать выполнимость American National Standard. X3J14 Технический комитет по ANS Forth проводил ее первую встречу в 1987. Этот Стандарт - это результат. C.5 Программирование в Forth Forth - подобный английскому язык, чьи элементы (называемые "слова") - это именованные элементы данных, процедуры, и определяющие слова, способные создавать элементы данных с настраиваемыми характеристиками. Процедуры и определяющие слова могут быть определены в терминах предварительно определенных слов или в машинном коде, используя встроенный ассемблер. Forth "слова" функционально аналогичны подпрограммам на других языках. Они - также эквивалентны командам на других языках - Forth размывает различия между лингвистическими элементами и функциональными элементами. Слова посылаются по имени или с клавиатуры или из источника программы. В результате, термин "слово" применяется и к программному (и лингвистическому) элементу и к их текстовым именам. В синтаксическом анализе текста Forth полагает, что слово будет любой строкой символов, ограниченных пробелами. Есть несколько специальных символов, которые не могут быть включены в слово или начало слова: пробел (универсальный разделитель), CR (который заканчивает ввод с терминала), и возврат или DEL (для возврата в течение ввода с клавиатуры). Много групп принимают соглашения об именах, чтобы улучшить удобочитаемость. Слова, встречающиеся в тексте, относятся к трем категориям: определенные слова (то есть, процедуры Forth), числа, и неопределенные слова. Например, вот - четыре слова: HERE DOES> ! 8493 214 Первые три - стандартно-определенные слова. Это означает, что они имеют входы в Forth словарь, описанный ниже, объясняя, что Forth должен делать, когда эти слова встретятся. Число "8493" возможно не будет найдено в словаре, и Forth преобразует его в двоичный код и поместит его в его магазинный стек для параметров. Когда Forth сталкивается с неопределенным словом и не может преобразовывать его к числу, слово возвращается пользователю с сообщением исключения. Архитектурно, слова Forth строго придерживаются принципов "структурного программирования": - Слова должны быть определены прежде их использования. - Логический поток ограничен последовательными, условными, и итерационными конструкциями. Включены слова для реализации наиболее полезных управляющих структур программы. - Программист работает со многими маленькими, независимыми модулями (словами) для максимальной контролируемости и надежности. Forth характеризуется пятью главными элементами: словарь, два магазинных стека, интерпретаторы, ассемблер, и виртуальная память. Хотя каждый из них может быть найден в других системах, комбинация производит совместные усилия, которые создают мощную и гибкую систему. C.5.1 словарь Forth Программа Forth организована в словарь, который занимает большую часть памяти, используемой системой. Этот словарь - связанный список элементов переменной длины, каждый из которых определяет слово. Содержание каждого определения зависит от типа слова (элемент данных, константа, последовательность операций, и т.д.). Словарь расширяем, обычно растет в область верхней памяти. На некоторых многопользовательских системах индивидуальные пользователи имеют частные словари, каждый из которых связан с общедоступным системным словарем. Слова добавляются в словарь "определяющими словами", более употребительное из которых - это : (двоеточие). Когда : выполняется, оно создает определение для слова, которое следует за ним. В классических реализациях содержимое этого определения - строка адресов предварительно определенных слов, которые будут выполнены по очереди всякий раз, когда вызывается определяемое слово. Определение заканчивается ; (точка с запятой). Например, вот - определение: : RECEIVE ( -- addr n ) PAD DUP 32 ACCEPT ; Имя нового слова - RECEIVE. Комментарий (в круглых скобках) указывает, что оно не требует никаких параметров и возвратит адрес и счетчик на стеке данных. Когда RECEIVE выполняется, оно последовательно исполнит слова в остатке определения. Слово PAD помещает на стек адрес временной памяти используемой для обработки строки. DUP дублирует верхний элемент стека, так что мы теперь имеем две копии адреса. Число 32 также помещается на стек. Слово ACCEPT берет адрес (предоставленный PAD) и длину (32) на стеке, принимает с клавиатуры строку до 32 символов, которые будут помещены по определенному адресу, и возвращает число полученных символов. Копия адреса временной памяти остается на стеке ниже счетчика так чтобы подпрограмма, которая вызвала RECEIVE, могла использовать его, чтобы подобрать полученную строку. 215 C.5.2 Магазинные стеки Пример выше иллюстрирует использование магазинных стеков для передачи параметров между словами Forth. Forth поддерживает два магазинных стека, или списков LIFO. Они предоставляют связь между словами Forth плюс эффективный механизм для управления логическим потоком. Стек содержит 16-бит элементы на 8- бит и 16-бит компьютерах, и 32-бит элементы на 32-бит процессорах. Числа две- ячейки занимают две позиции стека, с самой старшей частью на вершине. Элементы на стеке могут быть адреса или элементы данных различных видов. Стеки имеют неопределенный размер, и обычно растут к меньшим адресам памяти. Хотя структура обоих стеков одинаковая, они имеют очень различное использование. Пользователь взаимодействует наиболее непосредственно со Стеком Данных, который содержит параметры, передаваемые между словами. Эта функция заменяет вызывающие последовательности, используемые обычными языками. Это внутренне эффективно, и делает подпрограммы в действительности реентерабельными. Второй стек назван Стеком Возвратов, поскольку его основная функция это держать адреса возврата для вложенных определений, хотя иногда там временно сохраняются другие виды данных. Использование Стека Данных (часто называемого просто "стек") ведет к нотации, в которой операнды предшествуют операторам. Слово ACCEPT в примере выше брало адрес и счетчик со стека и оставляло там другой адрес. Точно так же слово по имени BLANK ожидает адрес и счетчик, и поместит определенное число пробелов (20H) в области, начинающейся с этого адреса. Таким образом, PAD 25 BLANK заполнит рабочую область, чей адрес помещен на стек словом PAD, 25 пробелами. Прикладные слова обычно определяются, чтобы работать подобным образом. Например, 100 SAMPLES могло быть определено, чтобы делать запись 100 измерений в массиве данных. Арифметические операторы также ожидают значения и оставляют результат на стеке. Например, + складывает два верхних числа со стека, заменяя их оба их суммой. Так как результаты операций оставляются на стеке, операции могут быть связаны вместе без необходимости определения переменных для использования как временной памяти. C.5.3 Интерпретаторы Forth - традиционно интерпретирующая система, так как выполнение программы управляется скорее элементами данных, чем машинным кодом. Интерпретаторы могут быть медленны, но Forth поддерживает высокую скорость, требуемую для приложений реального времени при наличии двух уровней интерпретации. Первый - текстовый интерпретатор, который выделяет строки с терминала или запоминающего устройства и ищет каждое слово в словаре. Когда слово найдено, оно выполняется вызовом второго уровня, адресного интерпретатора. Второй - это "адресный интерпретатор". Хотя не все системы Forth реализованы таким образом, это была первая и - все еще основная технология реализации. В виду маленьких затрат на выполнение, адресный интерпретатор может выдавать очень компактную объектную программу, что было главным фактором в широком принятии Forth во внедренных системах и других приложениях, где желателен маленький объектный размер. 216 Адресный интерпретатор обрабатывает строки адресов или лексем, откомпилированных в определениях созданных : (двоеточие), выполняя определение указанное каждым. Содержание большинства определений - это последовательность адресов предварительно определенных слов, которые будут выполнены адресным интерпретатором в свою очередь. Таким образом, когда слово RECEIVE (определенное выше) выполняется, слово PAD, слово DUP, литерал 32, и слово ACCEPT будут последовательно выполнены. Процесс заканчивается точкой с запятой. Это выполнение не требует исследования словаря, синтаксического анализа, или другой логики, потому что, когда RECEIVE было откомпилировано, словарь просматривался для каждого слова, и его адрес (или другая лексема) были помещены в следующую последовательную ячейку входа. Текст не был сохранен в памяти, ни даже в сжатой форме. Адресный интерпретатор имеет два важных свойства. Первое, это быстро. Хотя фактическая скорость зависит от специфической реализации, профессиональные реализации высоко оптимизированы, часто требуя только одну или две машинных команды на адрес. На большинстве эталонных тестов, хорошая реализация Forth существенно превосходит по быстродействию интерпретирующие языки типа BASIC или LISP, и сравнивается благоприятно с другими компилирующими языками высокого уровня. Второе, адресный интерпретатор делает определения Forth чрезвычайно компактными, так как каждая ссылка требует только одной ячейки. В сравнении, вызов подпрограммы, созданной большинством компиляторов, включает команды для обработки вызывающей последовательности (ненужной в Forth из-за стека) перед и после команды CALL или JSR и адреса. Большинство слов в словаре Forth будет определено : (двоеточие) и интерпретировано адресным интерпретатором. Большинство Forth сами определены таким образом. C.5.4 Ассемблер Большинство реализаций Forth включают макроассемблер для CPU, на котором они работают. Используя определяющее слово CODE, программист может создавать определение, чье поведение будет состоять из выполнения фактических машинных команд. Определения CODE могут использоваться для выполнения ввода-вывода, реализации арифметических примитивов, и выполнения другой машинно-зависимой или критической по времени обработки. При использовании CODE программист имеет полный контроль над CPU, как с любым другим ассемблером, и определения CODE, выполняются с полной машинной скоростью. Это - важное свойство Forth. Оно разрешает явный машинно-зависимый код в управляемых частях со специфическими соглашениями связи, которые являются машинно-независимыми. Для перемещения приложения на другой процессор требуется перекодирование только CODE слов, которые взаимодействуют с другими словами Forth точно одним и тем же способом. Ассемблеры Forth настолько компактны (типично несколько Килобайт) что они могут быть резидентными в системе (как - компилятор, редактор, и другие утилиты). Это означает, что программист может вводить короткие определения CODE и выполнять их немедленно. Это возможность особенно ценна в испытании заказных аппаратных средств. C.5.5 Виртуальная память Заключительный уникальный элемент Forth - это его способ использования диска или другого запоминающего устройства как разновидности "виртуальной памяти" для данных и источника программы. Как в случае адресного интерпретатора, этот подход - историческая характеристика Forth, но ни в коем случае не универсален. 217 Диск разделен на 1024-байтовые блоки. В памяти предусмотрено два или более буфера, в которые блоки читаются автоматически, когда упоминаются. Каждый блок имеет установленный номер блока, который в чистых системах является прямой функцией его физического местоположения. Если блок в памяти изменен, он будет автоматически перезаписан, когда ее буфер должен будет повторно использован. Явное чтение и запись не необходимы; программа найдет данные в памяти всякий раз, когда она обращается к ним. Блочно-ориентированная обработка диска эффективна и проста в реализации для чистой системы Forth. В результате, блоки предоставляют полностью мобильный механизм для обработки источника программы и данных как чистых, так и версий Forth одновременно находящихся в памяти с различными базовыми операционными системами. Определения в блоках источника программы компилируются в память словом LOAD. Большинство реализаций включают редактор, который форматирует блок для отображения в 16 строк по 64 символа в каждой, и предусматривают команды, изменяющие источник. Пример источника Forth блока - дан на рис. C.1 ниже. Исходные блоки исторически были важным элементом в стиле Forth. Так же, как Forth определения могут рассматриваться лингвистическим эквивалентом предложений на естественных языках, блок аналогичен параграфу. Блок обычно содержит определения, связанные с общей темой, типа "векторная арифметика". Комментарий в верхней строке блока идентифицирует эту тему. Приложение может выборочно загружать требующиеся блоки. Блоки также используются для сохранения данных. Маленькие записи могут быть объединены в блок, или большие записи распространяться на несколько блоков. Программист может распределять блоки любым способом, удовлетворяющим приложение, и на чистых системах может увеличивать производительность, организуя данные для минимизирования движения головок диска. Несколько продавцов Forth разработали сложный файл и системы баз данных, основанные на блоках Forth. Версии Forth, которые выполняются одновременно с OS находящейся в памяти главного компьютера, часто реализуют блоки в файлах OS главного компьютера. Другие используют базовые файлы исключительно. Стандарт требует, что бы блоки были доступны на системах, предоставляющих любые методы дискового доступа, поскольку они - единственные средства ссылка на диск, который может быть перемещаемым между чистой и одновременно находящейся в памяти с OS реализациями. C.5.6 Среда программирования Хотя этот Стандарт не требует, чтобы большинство систем Forth включало резидентный редактор. Он дает возможность программисту редактировать источник и перетранслировать его в выполнимую форму без покидания среды Forth. Поскольку просто организовать приложение по уровням, часто возможно перетранслировать только самый верхний уровень (который обычно является в настоящее время разрабатываемым), процесс который редко занимает больше чем несколько секунд. Большинство систем Forth также предоставляют резидентные интерактивные средства отладки, включающие не только слова типа тех, что в 15. Дополнительный набор слов Утилит, но также и наличие способности исследовать и изменять содержание VARIABLE и других элементов данных и выполнять с клавиатуры большинство составляющих слов основной системы Forth и разрабатываемого приложения. 218 Комбинация резидентного редактора, интегрированных средств отладки, и непосредственной выполняемости большинства определенных слов ведет к очень интерактивному стилю программирования, который демонстрирует сокращение времени разработки. C.5.7 Расширенные возможности программирования Одна из необычных характеристик Forth - в том, что слова определяемые программистом при построении приложения становятся неотъемлемыми элементами самого языка, добавляя более и более мощные проблемно-ориентированные возможности. Например, Forth включает слова VARIABLE и 2VARIABLE для имени местоположения, в котором могут быть сохранены данные, также как CONSTANT и 2CONSTANT для имени значения одной и две-ячейки. Предположим, программист находит, что приложение нуждается в массивах, которые были бы автоматически индексированы по количеству элементов с двумя ячейками. Такой массив мог бы быть назван 2ARRAY. Префикс "2" в имени указывает, что каждый элемент в этом массиве займет две ячейки (как было бы содержание 2VARIABLE или 2CONSTANT). Префикс "2", однако, имеет значение только для человека и не более существенен для текстового интерпретатора, чем любой другой символ, который может использоваться для определения имени. Такое определение имеет две части, как есть два "поведения", связанные с этим новым словом 2ARRAY, одно во время компиляции, и одно в работе или времени выполнения. Они лучшие понятны, если мы посмотрим, как 2ARRAY используется для определения его массивов, и затем как массив мог бы использоваться в приложении. Фактически, это как можно было бы проектировать и реализовать это слово. В начале нисходящего процесса проектирования, вот как мы хотели бы использовать 2ARRAY: 100 2ARRAY RAW 50 2ARRAY REFINED В первом случае, мы определяем массив 100 элементов длиной, чье имя - RAW. Во втором, массив - 50 элементов длиной, и именем REFINED. В каждом случае параметр размера поставляется для 2ARRAY на стеке данных (интерпретатор текста Forth автоматически помещает числа там, когда он сталкивается с ними), и имя слова следует непосредственно. Этот порядок типичен для определяющих слов Forth. Когда мы используем RAW или REFINED, мы хотели бы поставлять на стеке индекс желаемого элемента, и возвратить на стеке адрес этого элемента. Такая ссылка типично имела бы место в цикле. Вот - типичный цикл, который принимает значение две-ячейки от гипотетического прикладного слова DATA и запоминает его в следующем элементе RAW: : ACQUIRE 100 0 DO DATA I RAW 2! LOOP ; Имя этого определения - ACQUIRE. Цикл начинается с DO, заканчивается LOOP, и будет выполняться с индексными значениями, изменяющимися от 0 до 99. В пределах цикла, DATA получает значение. Слово I возвращает текущее значение индекса цикла, которое является параметром для RAW. Адрес выбранного элемента, возвращенного RAW, и значение, которое осталось на стек от DATA, передаются слову 2! (произносимое "two-store"), которое сохраняет два элемента стека по адресу. 219 Теперь, когда мы точно определили, что делает 2ARRAY, и как ведут себя слова, которые оно определяет, мы готовы записать две части его определения: : 2ARRAY ( n -- ) CREATE 2* CELLS ALLOT DOES> ( i a -- a') SWAP 2* CELLS + ; Часть определения перед словом DOES>, определяет поведение "во время компиляции", то есть что будет делать 2ARRAY, когда оно нами используется для определения слова типа RAW. Комментарий указывает, что эта часть ожидает число на стеке, которое является параметром размера. Слово CREATE создает определение для нового слова. Фраза 2* CELLS преобразовывает параметр размера из элементов с двумя ячейками во внутренние адресуемые элементы системы (обычно символы). ALLOT затем распределяет определенный объем памяти для содержания данных, который будет связан с недавно определенным массивом. Вторая строка определяет поведение "времени-выполнения", которое будет разделено всеми словами определенными 2ARRAY, типа RAW и REFINED. Слово DOES>, заканчивает первую часть определение и начинает вторую часть. Второй комментарий здесь указывает, что этот код ожидает индекс и адрес на стеке, и возвратит другой адрес. Индекс помещен на стеке вызывающей программой (RAW в примере), в то время как адрес содержимого слова, определенного таким образом (область определенная ALLOT) автоматически помещается на вершину стека перед выполнением этой части кода. Этот код работает таким образом: SWAP изменяет порядок двух элементов стека, для получения индекса на вершине. 2* CELLS преобразовывает индекс к внутренним адресуемым элементам как в разделе времени компиляции, для выдачи смещения от начала массива. Слово + тогда добавляет смещение к адресу начала массива, чтобы дать исполнительный адрес, который является желательным результатом. Данное основное определение, можно легко изменять, для того чтобы делать более сложные вещи. Например, код времени компиляции может быть изменен для инициализации массива нулями, пробелами, или любыми другими желательными начальными значениями. Размер массива может быть скомпилирован в его начало так, чтобы код времени-выполнения мог сравнивать с ним индекс, чтобы гарантировать его в пределах диапазона, или полный массив может быть создан постоянно находящимся на диске вместо главной памяти. Ни одно из этих изменений не затронуло бы использование времени-выполнения, которое мы определили другим способом. Это иллюстрирует немного гибкости, доступной с этими определяющими словами. C.5.8 Пример программирования Рисунок C.1 содержит типичный блок источника Forth. Он представляет часть приложения, которое управляет банком восьми светодиодов, используемых как лампы индикатора на приборе, и указывает некоторые из путей, которыми определения Forth различных видов объединяются в среду прикладной программы. Этот пример был кодирован для STD-bus системы с 8088 процессором и миллисекундными часами, которые также используются в примере. Светодиоды связаны с помощью интерфейса через отдельный 8 битный порт, чей адрес 40H. Это местоположение определено как CONSTANT в Строке 1, так чтобы оно могло быть упомянуто по имени; если модифицируется адрес, необходимо только корректировать значение этой константы. Слово LIGHTS возвращает этот адрес на стеке. Определение LIGHT берет значение со стека и посылает его на устройство. Природа этого значения - битовая маска, чьи биты соответствуют непосредственно индивидуальным огням. 220 Таким образом, команда 255 LIGHT включит все огни, тогда как 0 LIGHT их всех выключит. Block 180 0. ( Светодиодное управление ) 1. HEX 40 CONSTANT LIGHTS DECIMAL 2. : LIGHT ( n -- ) LIGHTS OUTPUT ; 3. 4. VARIABLE DELAY 5. : SLOW 500 DELAY ! ; 6. : FAST 100 DELAY ! ; 7. : COUNTS 256 0 DO I LIGHT DELAY @ MS LOOP ; 8. 9. : LAMP ( n - ) CREATE , DOES> ( a -- n ) @ ; 10. 1 LAMP POWER 2 LAMP HV 4 LAMP TORCH 11. 8 LAMP SAMPLING 16 LAMP IDLING 12. 13. VARIABLE LAMPS 14. : TOGGLE ( n -- ) LAMPS @ XOR DUP LAMPS ! LIGHT ; 15. Рисунок C.1 - блок источника Forth, содержащий слова, которые управляют набором светодиодов. Строки 4 - 7, содержат простую диагностику типа, которая может быть введена с терминала для подтверждения, что все работает. Переменная DELAY содержит время задержки в миллисекундах - выполнение слова DELAY возвращает адрес этой переменной. Два значения DELAY устанавливаются определениями SLOW и FAST, используя оператор Forth ! (произносится "store") который берет значение и адрес, и сохраняет значение по адресу. Определение COUNTS выполняет цикл от 0 до 255 (циклы Forth этого типа ограничены верхним пределом диапазона), посылая каждое значение к огням и затем ожидание в течение периода, определенного DELAY. Слово @ (произносится "fetch") выбирает значение по адресу, в этом случае адрес поставляется DELAY. Это значение посылается к MS, которое ждет определенного числа миллисекунд. Результат выполнения COUNTS такой, что огни будут считать от 0 до 255 с желательной скоростью. Чтобы выполнить это, введите одно слово: SLOW COUNTS or FAST COUNTS с терминала. Строка 9 предоставляет возможность обозначения индивидуальных ламп. В этом приложении они используются как огни индикатора. Слово LAMP является определяющим словом, которое берет как параметр маску, которая представляет специфическую лампу, и компилирует ее как именованный объект. Строки 10, и 11 содержат пять использований LAMP для наименования специфических индикаторов. Когда одно из этих слов типа POWER выполнено, маска возвращается на стеке. Фактически, поведение определенного значения такое, что когда слово вызвано, возвращенное значение идентично поведению Forth слова CONSTANT. Мы создавали здесь новое определяющее слово, однако, чтобы иллюстрировать, как это было бы сделано. 221 Наконец, в строках 13 и 14, мы имеем слова, которые будут управлять световой панелью. LAMPS является переменной, которая содержит текущее состояние ламп. Слово TOGGLE берет маску (которая может быть получена от одного из слов LAMP) и изменяет состояние этой специфической лампы, сохраняя результат в LAMPS. В конце приложения, имена ламп и TOGGLE - вероятно единственные слова, которые будут выполнены непосредственно. Использование там будет, например: POWER TOGGLE or SAMPLING TOGGLE как соответствующее, всякий раз, когда должны быть изменены системные индикаторы. Время для компиляции этого блока кода на той системе было приблизительно половина секунды, включая время выбора его с диска. Так что это весьма практично (и нормальная практика) для программиста, чтобы просто напечатать определение и пробовать его немедленно. Кроме того, каждый всегда имеет возможность связи с внешними устройствами непосредственно. Первая вещь, которую можно было бы делать, когда говорится о лампах, будет состоять в том, чтобы напечатать: HEX FF 40 OUTPUT и смотреть, включаются ли все лампы. Если нет - предположение, что кое-что неправильно с аппаратными средствами, так как эта фраза непосредственно передает "полную" маску на устройство. Этот тип прямого взаимодействия полезен в приложениях, вовлекающих заказные аппаратные средства, так как он уменьшает время отладки аппаратных средств. C.6 Мультипрограммные системы Мультипрограммные системы Forth существовали приблизительно с 1970. Самые ранние доступные Forth системы распространяли "перехватчики" для этой возможности, несмотря на то, что многие не использовали их. Однако основные предположения были общеизвестны в сообществе, и существуют значительные точки соприкосновения среди этих мультипрограммных систем. Эти системы не только языковые процессоры, но содержат также характеристики операционной системы. Многие из этих интегрированных систем работают полностью автономно, выполняя все необходимые функции операционной системы. Некоторые системы Forth очень быстры, и могут поддерживать, многозадачный режим и многопользовательские операции даже на компьютерах, чьи аппаратные средства, обычно полагается, неспособны к таким продвинутым операциям. Например, один производитель телефонных коммутаторов выполняет 50 задач на Z80. Есть несколько мультипрограммных изделий для PC, некоторые из которых даже поддерживают много пользователей. Даже на компьютерах, которые обычно используются в многопользовательских операциях, число пользователей, которые могут быть поддержаны, может быть намного больше, чем ожидается. Одно большое приложение базы данных выполняющееся на единственном 68000 имеет более чем 100 терминалов модифицирующих и запрашивающих эту базу данных, без существенного ухудшения свойств. Многопользовательские системы могут также поддерживать множество программистов, каждый из которых имеет частный словарь, стеки, и набор переменных, управляющих этой задачей. Частный словарь связан с общедоступным, реентерабельным словарем, содержащим все стандартные функции Forth. Частный словарь может использоваться для разработки прикладного кода, который может позже быть интегрирован в общедоступный словарь. Он может также использоваться для выполнения функций требующих текстовый интерпретатор, включая компиляцию и выполнение исходного текста. 222 C.7 Конструкционные и организационные соображения Также, как выбор строительных материалов имеет сильный эффект на дизайн и конструкцию постройки, выбор языка и операционной системы затронет конструкцию приложения и решения руководства проектом. Традиционно, программные проекты проходят через четыре стадии: анализ, конструкция, кодирование, и испытание. Проект Forth также обязательно включает эти действия. Forth оптимизирован для методологии управления проектом, свойственной маленьким группам квалифицированных профессионалов. Forth поощряет итерационный процесс "последовательного макетирования" в котором Forth высокого уровня используется как выполняемая утилита конструкции, с "заглушками", заменяющими подпрограммы низшего уровня по мере необходимости (например, для аппаратных средств, которые все еще не сформированы). Во многих случаях последовательное макетирование может производить доброкачественное, более полезное изделие. Как проектные решения, разработчики изучают вещи, которые могут вести к лучшей конструкции. Более мудрые решения могут быть сделаны, если точные связанные затраты известны, и часто это невозможно пока код прототипа не может быть написан и испытан. Использование Forth может сокращать время, требуемое для программной разработки, и так же уменьшать уровень усилий, требуемых для обслуживания и модификаций в течение жизни изделия. C.8 Заключение Forth произвел некоторые замечательные достижения в разнообразии прикладных областей. В течение нескольких лет, его принятие выросло быстро, особенно среди программистов ищущих способов улучшить их производительность, и менеджеров ищущих способы упростить новые проекты программной разработки. 223 D. Анализ Совместимости ANS Forth (информационное приложение) До ANS Forth, было несколько промышленных стандартов для Forth. Наиболее влиятельные перечислены здесь в хронологическом порядке, наряду с главными различиями между ANS Forth и самым современным, Forth 83. D.1 FIG Forth (приблизительно 1978) FIG Forth был "образцовой" реализацией языка Forth, разработанного Forth Interest Group (FIG). В FIG Forth, сравнительно мало слов было реализовано на процессорно-зависимом машинном языке, остальные слова были реализованы в Forth. Модель FIG была размещена на всеобщее достояние, и была перенесена на широкое разнообразие компьютерных систем. Поскольку большая часть реализаций FIG Forth была одна и та же на всех машинах, программы, написанные в FIG Forth, обладали существенной степенью переносимости, даже для программ "системного уровня", которые непосредственно управляют внутренней организацией системной реализации Forth. FIG Forth реализации имели решающее влияние в увеличении числа людей, заинтересованных в использовании Forth. Много людей связывают методы реализации, воплощенные в FIG Forth модели с "сущностью Forth". Однако FIG Forth не обязательно был представителем коммерческой реализации Forth того же самого периода. Часть наиболее успешных коммерческих систем Forth использовали методы реализации отличные от "модели" FIG Forth. D.2 Forth 79 Forth-79 Стандарт - результат ряда встреч с 1978 по 1980, Forth Standards Team, международной группы пользователей Forth и продавцов (промежуточные версии известные как Forth 77 и Forth 78 были также выпущены группой). Forth 79 описал набор слов, определенных на 16-бит виртуальной машине, с дополнительным кодом (дополнение до двух), не выровненной, линейной адресацией байта. Это предписало методику реализации известную как "косвенный шитый код", и использование ASCII набора символов. Forth-79 Стандарт служил как основание для нескольких общедоступных и коммерческих реализаций, некоторые из которых все еще доступны и поддерживаются сегодня. D.3 Forth 83 Forth-83 Стандарт, также Forth Standards Team, был выпущен в 1983. Forth 83 предпринял попытку, устранить некоторые из неточностей Forth 79. Forth 83 в большинстве отношений был подобен Forth 79. Однако Forth 83 изменил определение нескольких вполне определенных особенностей Forth 79. Например, поведение округления целочисленного деления, основное значение операндов PICK и ROLL, значение адреса, возвращаемого ', поведение компиляции ', значение "true" флага, значение NOT, и "последовательное" поведение слов, определенных VOCABULARY были полностью изменены. Forth 83 ослабил ограничения реализации Forth 79, чтобы позволить любой вид шитого кода, но не полностью позволял компиляцию чистого машинного кода (это не было специально запрещено, а скорее было косвенное последствие другого условия). 224 Много новых реализаций Forth были основаны на Forth-83 Стандарте, но немного существует "строго совместимых" реализаций Forth-83. Хотя несовместимость, следующую из изменений между Forth 79 и Forth 83, было обычно относительно просто устранить, множество преуспевающих продавцов Forth не преобразовало свои реализации, чтобы быть совместимыми с Forth 83. Например, наиболее преуспевающий коммерческий Forth для компьютеров Apple Macintosh основан на Forth 79. D.4 Недавние события С тех пор как был издан Forth-83 Стандарт, компьютерная промышленность подверглась быстрым и глубоким изменениям. Скорость, емкость памяти, и объем диска доступных персональных компьютеров увеличились больше чем в 100 раз. 8- бит процессоры уступили 16-бит процессорам, и теперь 32-бит процессоры обычное явление. Операционные системы и среды языков программирования маленьких систем - гораздо более мощные, чем они были в начале 80-ых. Рынок персонального компьютера изменился от преобладающего рынка "хобби" до зрелого делового и коммерческого рынка. Улучшенная технология для проектирования заказных микропроцессоров привела к разработке многочисленных "чипов Forth", компьютеров, оптимизированных для выполнения языка Forth. Рынок для ROM-базирующихся внедренных управляющих компьютеров существенно вырос. Чтобы получать полное преимущество этой развивающейся технологии, и лучше конкурировать с другими языками программирования, много недавних реализаций Forth игнорировали некоторые "правила" предыдущих стандартов Forth. В особенности: - 32-разрядные реализации Forth теперь обычны. - Некоторые системы Forth принимают ограничения выравнивания адреса аппаратных средств, на которых они работают. - Некоторые системы Forth используют генерацию чистого кода, генерацию микропрограмм, и методы оптимизации, скорее, чем традиционный "шитый код". - Некоторые системы Forth используют архитектуру сегментированной адресации, размещения частей Forth "словаря" в различных сегментах. - Все более систем Forth теперь работают в среде другой "стандартной" операционной системы, используя текстовые файлы OS для исходного текста, скорее, чем традиционные Forth "блоки". - Некоторые системы Forth допускают программное обеспечение внешней операционной системы, программное обеспечение работы с окнами, концентраторы терминала, или каналы связи, для обработки или препроцессорной обработки пользовательского ввода, приводя к отступлениям от редактирования ввода, пригодности набора символов, и управление поведением экрана, предписанное Forth 83. Конкурентное давление из других языков программирования (преимущественно "C") и от других продавцов Forth вели продавцов Forth к оптимизации, которая не соответствует хорошо "модели виртуальной машины" подразумеваемой по существующим стандартам Forth. 225 D.5 ANS Forth подход ANS Forth комитет обратился к серьезной фрагментации семейства Forth вызванной различиями между Forth 79 и Forth 83, и отклонениями от любого из этих двух промышленных стандартов, вызванными давлением рынка. Следовательно, комитет хотел основывать свои решения совместимости не на строгом сравнении со Стандартом Forth-83, но вместо этого на рассмотрении разнообразия существующих реализаций, особенно тех, что с существенными пользовательскими базами и/или значительным успехом на рынке. Комитет чувствует что, если ANS Forth предпишет строгие требования к виртуальной машинной модели, так же как и предыдущие стандарты, тогда много разработчиков не выберет исполнение ANS Forth. Комитет надеется, что ANS Forth будет служить для объединения скорее, чем для дальнейшего деления семейства Forth, и таким образом выбрал обобщение скорее, чем лишение законной силы популярных методов реализации. Многие из изменений в Forth 83 оправданы этим объяснением. Больше всего попадает в категорию, что "ANS Forth Стандартная Программа не может принимать x", где "x" - наименование, вытекающее из виртуальной машинной модели, предписанной Forth-83 Стандартом. Комитет чувствует, что эти ограничения разумны, особенно полагая, что существенное число существующих реализаций Forth не реализует правильно Forth-83 виртуальную модель, таким образом, Forth-83 наименование существует "теоретически" но не "практически". Другой взгляд на это - это то, что в то время как ANS Forth признает разнообразие текущей практики Forth, он пытается документировать в этом аналогию. В некотором смысле, ANS Forth - таким образом "описание действительности" скорее чем "предписание для специфической виртуальной машины". Так как нет никакого предыдущего American National Standard для Forth, требования действий, предписанные разделом 3.4 X3/SD-9, "Политика и Рекомендации", относительно предыдущих стандартов не применяются. Следующее обсуждение описывает различия между ANS Forth и Forth 83. В большинстве случаев, Forth 83 образец Forth 79 и FIG Forth для целей этого обсуждения. Во многих из этих случаев, однако, ANS Forth более типичный для существующего состояния индустрии Forth, чем предварительно изданные стандарты. D.6.1 Ширина стека Forth 83 определяет, что элементы стека занимают 16 бит. Это включает адреса, флаги, и числа. ANS Forth определяет, что элементы стека - по крайней мере 16 бит; фактический размер должен быть документирован реализацией. Затрагиваемые слова: вся арифметика, логические и адресующие операторы Причина: 32-бит машины становятся банальными. 16-бит система Forth на 32-бит машине - не конкурентоспособна. 226 Воздействие: Программы, которые принимают 16-бит ширину стека, продолжат работать на 16-бит машинах; ANS Forth не требует другой ширины стека, но просто позволяет это. Много программ не будут затронуты (но см. "адресуемый элемент"). Переход/Преобразование: Программы, которые используют разрядные маски с набором старших бит, вероятно, придется изменить, заменяя определенную реализацией константу битовой маски, или процедуру вычисляющую битовую маску независимым от ширины стека способом. Вот - некоторые процедуры для построения независимых от ширины битовых масок: 1 CONSTANT LO-BIT TRUE 1 RSHIFT INVERT CONSTANT HI-BIT : LO-BITS ( n -- mask ) 0 SWAP 0 ?DO 1 LSHIFT LO-BIT OR LOOP ; : HI-BITS ( n -- mask ) 0 SWAP 0 ?DO 1 RSHIFT HI-BIT OR LOOP ; Программы, которые зависят от поведения "по модулю '553' ", подразумеваемого в операциях 16-бит арифметики, должны быть переписаны, чтобы явно выполнять операцию модуля в соответствующих местах. Комитет верит, что такие предположения происходят нечасто. Примеры: некоторая контрольная сумма или вычисление CRC, некоторые генераторы случайного числа и большая часть дробной математики с фиксированной точкой. D.6.2 Представление числа Forth 83 определяет представление числа и арифметики дополнительным кодом (дополнение до двух). ANS Forth также позволяет обратный код (дополнение до единицы) и величину со знаком. Затрагиваемые слова: вся арифметика и логические операторы, LOOP, +LOOP Причина: Некоторые компьютеры используют обратный код (дополнение до единицы) или величину со знаком. Комитет не желал принуждать реализации Forth для этих машин эмулировать арифметику с дополнительным кодом (дополнение до двух), и таким образом подвергаться серьезному ухудшению производительности. Опыт некоторых членов комитета с такими машинами указывает, что ограничения использования необходимые для поддержки этих представлений чисел не обременительны чрезмерно. Воздействие: ANS Forth Стандартная Программа может объявлять "зависимость от окружения для арифметики с дополнительным кодом (дополнение до двух)". Это означает иначе, что стандартная программа гарантированно будет работать только на машинах с дополнительным кодом (дополнение до двух). Действительно, это - не серьезное ограничение, потому что подавляющее большинство современных компьютеров использует дополнительный код (дополнение до двух). Комитет знает не совместимые с Forth-83 реализации для машин с не дополнительным кодом (дополнение до двух) в настоящее время, таким образом, существующие Forth-83 программы будут все еще работать на том же классе машин, на котором они в настоящее время работают. Переход/Преобразование: Существующие программы, желающие воспользоваться преимуществом возможности ANS Forth Стандартной Системы на машинах не с дополнительным кодом (дополнение до двух) могут делать так, устраняя использование арифметических операторов для выполнения логических функций, получая константы битовой маски от битовых операций как описано в разделе о ширине стека, ограничивая диапазон использования чисел без знака до диапазона положительных чисел, и используя предусмотренные операторы для преобразования из одинарных чисел в двойные числа. D.6.3 Адресуемые элементы 227 Forth 83 определяет, что каждый уникальный адрес относится к 8-бит байту в памяти. ANS Forth определяет, что размер элемента, адресуемого каждым уникальным адресом - определенное реализацией, но, по умолчанию, является размером одного символа. Forth 83 описывает много операций памяти в терминах множества байт. ANS Forth описывает эти операции в терминах множества символов или адресуемых элементов. Затрагиваемые слова: те, что с параметром "адресуемого элемента" Причина: Некоторые машины, включая наиболее популярные чипы Forth, адресуют 16-бит адреса ячеек памяти вместо 8-бит байтов. Воздействие: Программы могут выбирать объявление зависимости от окружения для байтовой адресации, и продолжать работать на классе машин, для которых они теперь работают. Для реализации Forth на адресуемой словом машине, для Forth 83 совместимости, она должна была бы моделировать байтовую адресацию за значительную цену в скорости и эффективности памяти. Комитет не знает ни о какой такой Forth-83 реализации для таких машин, таким образом, зависимость от окружения для байтовой адресации не ограничивает Стандартную Программу сверх ее текущих фактических ограничений. Переход/Преобразование: Новые операторы адресной арифметики CHARS и CHAR+ должны быть использованы для программ, которые требуют переносимости на машины с не байтовой адресацией. Места, где такое преобразование необходимо, могут быть идентифицированы, поиском местонахождения слов которые принимают множество адресуемых элементов как параметр (например, MOVE , ALLOT). D.6.4 Приращение адреса для ячейки больше не два Как последствие Forth-83 одновременной спецификации 16-бит ширины стека и байтовой адресации, число два могло надежно использоваться в вычислениях адреса затрагивающих массивы памяти, содержащие элементы со стека. Так как ANS Forth не требует ни 16-бит ширины стека ни адресации байта, число два больше не обязательно соответствует таким вычислениям. Затрагиваемые слова: @ ! +! 2+ 2* 2- +LOOP Причина: См. причины для "Адресуемые элементы" и "Ширина стека" Воздействие: В этом отношении, существующие программы продолжат работать на машинах, где ячейка стека занимает два адресуемых элемента, при сохранении в памяти. Это включает большинство машин, для которых в настоящее время существуют Forth 83 совместимые реализации. В принципе, это также включило бы адресуемые 16-бит словами машины с 32-бит шириной стека, но комитет не знает о примерах таких машин. Переход/Преобразование: Новые операторы адресной арифметики CELLS и CELL+ должны быть использованы для переносимых программ. Места, где такое преобразование необходимо, могут быть идентифицированы, поиском символа "2" и определением, действительно ли оно используется как часть вычисления адреса. Следующие замены уместны при вычислении адреса: 228 Старое Новое ----------- --------- 2+ or 2 + CELL+ 2* or 2 * CELLS 2- or 2 - 1 CELLS - 2/ or 2 / 1 CELLS / 2 1 CELLS Число "2" отдельно иногда используется для вычислений адреса как параметр к +LOOP, когда индекс цикла - адрес. При преобразовании слова 2/, которое работает на отрицательных делимых, нужно быть осведомленным об используемом методе округления. D.6.5 Выравнивание адреса Forth 83 не налагает никаких ограничений на выравнивание адресов к какой либо границе. ANS Forth определяет, что Стандартная Система может требовать выравнивание адресов для использования с различными операторами "@" и "!". Затрагиваемые слова: ! +! 2! 2@ @ ? , Причина: Много компьютеров имеют аппаратные ограничения, которые поддерживают использование выровненных адресов. На некоторых машинах, чистые команды доступа к памяти вызовут прерывание по исключительной ситуации, если используются с не выровненным адресом. Даже на машинах где не выровненные обращения не вызывают прерывание по исключительной ситуации, выровненные обращения обычно быстрее. Воздействие: Все ANS Forth слова, что возвращают адреса, применимые для использования с выровненными словами "@" и "!" должны возвращать выровненные адреса. В большинстве случаев, это не будет проблемой. Проблемы могут являться результатом использования определяемых пользователем структур данных содержащих смесь символьных данных и данных размера ячейки. Много существующих систем Forth, особенно используемых в настоящее время на компьютерах с жесткими требованиями выравнивания, уже требуют выравнивание. Много существующего кода Forth, который в настоящее время используется на таких машинах, уже было преобразовано для использования в выровненных средах. Переход/Преобразование: Есть два возможных подхода к преобразованию программ для использования на системе, требующей выравнивание адреса. Самый простой подход состоит в том, чтобы переопределить систему выровненных операторов "@" и "!" так, чтобы они не требуовали выравнивания. Например, на 16-бит машине с прямым порядком байт и байтовой адресацией, не выровненные "@" и "!" могли быть определены: : @ ( addr -- x ) DUP C@ SWAP CHAR+ C@ 8 LSHIFT OR ; : ! ( x addr -- ) OVER 8 RSHIFT OVER CHAR+ C! C! ; Эти определения, и подобные для "+!", "2@", "2!", ",", и "?" при необходимости, могут быть откомпилированы перед не выровненным приложением, которое будет тогда работать как ожидается. Этот подход может оберегать память, если приложение использует существенное количество структур данных, содержащих не выровненные поля. 229 Другой подход состоит в том, чтобы изменить исходный текст приложения для устранения не выровненных полей данных. ANS Forth слова ALIGN и ALIGNED могут использоваться для вынужденного выравнивания полей данных. Места, где такое выравнивание необходимо, могут быть определены обследованием частей приложения, где определены структуры данных (отличные от простых переменных), или методами "интеллектуального компилятора" (см. обсуждение "интеллектуального компилятора" ниже). Этот подход, вероятно, приведет к более быстрой скорости выполнения приложения, при возможном увеличении расхода использования памяти для структур данных. Наконец, возможно комбинировать предшествующие методы, идентифицируя точно те поля данных, которые не выровнены, и используя "не выровненные" версии операторов доступа к памяти только для этих полей. Этот "гибридный" подход определяет компромисс между скоростью выполнения и использованием памяти. D.'.' Направление округления Division/modulus Forth 79 определяет, что деление округляется к 0 и остаток несет знак делимого. Forth 83 определяет, что деление округляется к отрицательной бесконечности и остаток несет знак делителя. ANS Forth позволяет любое поведение для операторов деления перечисленных ниже на усмотрение разработчика, и предоставляет пару примитивов деления, чтобы позволить пользователю синтезировать любое определенное поведение. Затрагиваемые слова: / MOD /MOD */MOD */ Причина: Различие между поведением деления в Forth 79 и Forth 83 было объектом большого спора, и много реализаций Forth не переключались на поведение Forth 83. Оба варианта имеют шумных сторонников, цитирующих требования к приложениям и аргументы эффективности выполнения с обеих сторон. После обширных дебатов охватывающих много встреч, комитет был не способен достигнуть согласия в выборе того или иного поведения, и выбрал разрешение любого поведения как значения по умолчанию, в тоже время предусматривая пользовательские средства для явного использования любого поведения по необходимости. Так как разработчикам разрешен выбор любого поведения, не требуется изменять поведение, показанное их текущими системами, таким образом, сохраняя правильное функционирование существующих программ, которые работают на этих системах и зависят от специфического поведения. Новые реализации могли выбирать поведение, которое поддерживается родной системой команд CPU, таким образом максимизируя скорость выполнения, или могли выбирать поведение, которое больше соответствует предназначенной прикладной области системы. Воздействие: Проблема затрагивает только программы, которые используют отрицательное делимое с положительным делителем, или положительное делимое с отрицательным делителем. Огромное большинство использования деления происходят, с положительным делимым и положительным делителем; в этом случае, результат один и тот же для обоих разрешенных поведений деления. Переход/Преобразование: Для программ, которые требуют специфического поведения округления с операндами деления смешанного знака, операторы деления, используемые в программе, могут быть переопределены в терминах одного из новых примитивов деления ANS Forth SM/REM (симметричное деление, то есть округление к нулю) или FM/MOD (минимальное деление, то есть, округление к отрицательной бесконечности). Тогда программа может быть перетранслирована без изменения. Например, операторы деления стиля Forth 83 могут быть определены: 230 : /MOD ( n1 n2 -- n3 n4 ) >R S>D R> FM/MOD ; : MOD ( n1 n2 -- n3 ) /MOD DROP ; : / ( n1 n2 -- n3 ) /MOD SWAP DROP ; : */MOD ( n1 n2 n3 -- n4 n5 ) >R M* R> FM/MOD ; : */ ( n1 n2 n3 -- n4 n5 ) */MOD SWAP DROP ; D.6.7 Immediate-ности Forth 83 определил, что множество "компилирующих слов" являются "немедленного исполнения", означая что они выполняются вместо компилирования в течение компиляции. ANS Forth менее конкретен относительно большинства этих слов, заявляя, что их поведение определено только в течение компиляции, и определяя их результат скорее, чем их специфические действия во время компиляции. Чтобы заставить компилироваться слово, которое обычно выполнилось бы, Forth 83, предусматривал слова COMPILE используемое со словами не немедленного исполнения, и [COMPILE] используемое со словами немедленного исполнения. ANS Forth предусматривает единственное слово POSTPONE , которое используется и с немедленного исполнения и с не немедленного исполнения словами, автоматически выбирая соответствующее поведение. Затрагиваемые слова: COMPILE [COMPILE] ['] ' Причина: Обозначение специфических слов как немедленного исполнения или нет, зависит от методики реализации, выбранной для системы Forth. В традиционных реализациях "шитого кода", выбор был вообще довольно ясный (с единственным исключением слова LEAVE), и стандарт мог определить какие слова должны быть немедленного исполнения. Однако, некоторые в настоящее время популярные методы реализации, типа генерация чистого кода с оптимизацией, требуют атрибута немедленного исполнения на наборе слов отличном от набора слов немедленного исполнения реализации шитого кода. ANS Forth, подтверждая законность этих других методов реализации, определяет атрибут немедленного исполнения в таких немногих случаях, насколько это возможно. Когда состав набора слов немедленного исполнения неясен, решение использовать ли COMPILE или [COMPILE], становится неясным. Следовательно, ANS Forth предоставляет "универсальное" слово замены POSTPONE, которое обслуживает цели огромного большинства применений COMPILE и [COMPILE] без требования знания пользователем, действительно ли "отложенное" слово немедленного исполнения. Точно так же использование ' и ['] с компилирующими словами не ясно, если точное поведение компиляции этих слов не определено, так что ANS Forth не разрешает Стандартной Программе использовать ' или ['] с компилирующими словами. Традиционное (не немедленного исполнения) определение слова COMPILE имеет дополнительную проблему. Его традиционное определение принимает методику реализации шитого кода, и его поведение может быть должным образом описано только в этом контексте. В контексте ANS Forth, который разрешает другие методы реализации в дополнение к шитому коду, очень трудно, если не невозможно описать поведение традиционного COMPILE. Скорее чем изменить его поведение, и таким образом нарушить существующий код, ANS Forth не включает слово COMPILE. Это позволяет существующим реализациям продолжить снабжать слово COMPILE его традиционным поведением, если это соответствует реализации. 231 Воздействие: [COMPILE] остается в ANS Forth, так как его надлежащее использование не зависит от знания того, действительно ли слово является немедленного исполнения (Использование [COMPILE] со словом не немедленного исполнения является, и всегда было пустой командой). Действительно ли Вы должны использовать [COMPILE] требует знания того, действительно ли его целевое слово является словом немедленного исполнения, но использовать [COMPILE] всегда безопасно. [COMPILE] - больше не в (требуемом) основном наборе слов, будучи перемещенное в Расширение Основного набора слов, но комитет предупреждает, что большинство продавцов поставят его, так или иначе. Почти во всех случаях, правильно заменить [COMPILE] и COMPILE на POSTPONE. Использования [COMPILE] и COMPILE, которые - "бессмысленно" менять на POSTPONE , являются весьма редкими, и относятся следующим к двум категориям: a) Использование [COMPILE] с не немедленного исполнения словами. Это иногда делается со словами ' (tick) (которое было немедленного исполнения в Forth 79, но не в Forth 83) и LEAVE (которое было немедленного исполнения в Forth 83 но не в Forth 79), чтобы вынуждать компиляцию этих слов без относительно к тому, используете ли Вы Forth 79 или Forth 83 систему. b) Использование фразы COMPILE [COMPILE] <слово немедленного исполнения> для "двойного postpone" слова немедленного исполнения. Переход/Преобразование: Много ANS Forth реализаций продолжит реализовывать оба [COMPILE] и COMPILE в формах, совместимых с существующим использованием. В этих средах, нет необходимости в преобразовании. Для полной переносимости, использование COMPILE и [COMPILE] должно быть заменено на POSTPONE, кроме редких случаев обозначенных выше. Использование [COMPILE] со словами не немедленного исполнения, может быть оставлено как есть, и программа может объявить, что требуется слово [COMPILE] из Расширения Основного набора слов, или [COMPILE] перед словом не немедленного исполнения может быть просто удалено, если целевое слово, как известно, является не немедленного исполнения. Использование фразы COMPILE [COMPILE] <слово немедленного исполнения> может быть обработано, представляя "промежуточное слово" (XX в примере ниже) и затем выполняя POSTPONE с этим словом. Например: : ABC COMPILE [COMPILE] IF ; изменения: : XX POSTPONE IF ; : ABC POSTPONE XX ; Нестандартный случай может происходить в программах, которые "выключают состояние компиляции" для явной компиляции потока в словарь после COMPILE. Например: : XYZ COMPILE [ ' ABC , ] ; Это сильно зависит от точного знания, как работают COMPILE и реализация шитого кода. Случаи подобно этому не могут быть обработаны механически; они должны быть транслированы с точным пониманием того, что делает код, и переписыванием этого раздела согласно ANS Forth ограничениям. Используйте фразу POSTPONE [COMPILE] для замены [COMPILE] [COMPILE]. 232 D.6.8 Входной набор символов Forth 83 определяет, что полный 7-бит набор символов ASCII доступен через KEY. ANS Forth ограничивает его графическими символами набора ASCII, с кодами от hex 20 до hex 7E включительно. Затрагиваемые слова: KEY Причина: Много системных сред "потребляют" некоторые управляющие символы для таких целей как редактирование ввода, управление заданиями, или управление потоком данных. Реализация Forth не всегда может управлять этим системным поведением. Воздействие: Стандартные Программы, которые требуют способности получить специфические управляющие символы через KEY должны объявить зависимость от окружения для входного набора символов. Переход/Преобразование: Для максимальной переносимости, программы должны ограничить их требуемый входной набор символов только графическими символами. Управляющие символы могут быть обработаны, если доступны, но полные функциональные возможности программы должны быть доступны с использованием только графических символов. Как определено выше, может быть объявлена зависимость от окружения на входном наборе символов. Даже в этом случае, рекомендуется, чтобы программа избегала требования особенно неприятных управляющих символов, типа control-S и control-Q (часто используемых для управления потоком, иногда аппаратными средствами связи, чье присутствие может быть трудно обнаруживаемо), ASCII NUL (трудно напечатать на многих клавиатурах), и различий между возвратом каретки и переводом строки (некоторые системы транслируют возвраты каретки в переводы строки, или наоборот). D.6.9 Сдвиги с UM/MOD Данная Forth-83 природа дополнительного кода (дополнение до двух), и его требование минимального деления (округление к минус бесконечности), сдвиг эквивалентен делению. Также, представление дополнительного кода (дополнение до двух) подразумевает, что деление без знака величиной два эквивалентно логическому правому сдвигу, так UM/MOD могло использоваться для исполнения логического правого сдвига. Затрагиваемые слова: UM/MOD Причина: Проблема с UM/MOD - это результат разрешения представления числа не дополнительным кодом (дополнение до двух), как уже описано. ANS Forth предоставляет слова LSHIFT и RSHIFT для выполнения логических сдвигов. Это - обычно более эффективно, и конечно более наглядно, чем использование UM/MOD для логического сдвига. Воздействие: Программы, выполняющиеся на ANS Forth системах с арифметикой дополнительного кода (дополнение до двух) (большинство машин), не будут испытывать никакой несовместимости с UM/MOD. Существующие Forth-83 Стандартные программы, предназначенные для работы на машинах с не дополнительным кодом (дополнение до двух), не смогут использовать UM/MOD для смещения на ANS Forth системе с не дополнительным кодом (дополнение до двух). Это не должно затронуть значительное число существующих программ (возможно ни какие), так как комитет не знает ни о каких существующих Forth-83 реализациях на машинах с не дополнительным кодом (дополнение до двух). 233 Переход/Преобразование: Программа, которая требует, чтобы UM/MOD вел себя как операция сдвига, может объявить зависимость от окружения на арифметике дополнительного кода (дополнение до двух). Программа, которая не может объявить зависимость от окружения на арифметике дополнительного кода (дополнение до двух) может требовать редактирования для замены несовместимого использования UM/MOD другими операторами, определенными в пределах приложения. D.6.10 Словари / списки слов ANS Forth не определяет слова VOCABULARY, CONTEXT, и CURRENT, которые существовали в Forth 83. Вместо этого, ANS Forth определяет примитивный набор слов для спецификации порядка поиска и управления порядком поиска, включая слова, которые не существовали ни в каком предыдущем стандарте. Forth-83 "ALSO/ONLY" экспериментальный набор слов порядка поиска определен главным образом как часть расширения ANS Forth набора слов Порядка Поиска. Затрагиваемые слова: VOCABULARY CONTEXT CURRENT Причина: Словари - область больших расхождений среди существующих систем. Рассматривая системы главных продавцов и предыдущие стандарты, есть, по крайней мере, 5 различных и взаимно несовместимых поведений слов, определенных VOCABULARY. Forth 83 предпринял шаг в направлении "спецификации порядка поиска времени-выполнения", опускаясь к определению специфических отношений между иерархией откомпилированных словарей и порядком поиска времени-выполнения. Forth 83 также определил экспериментальный механизм для спецификации порядка поиска времени-выполнения, ALSO/ONLY схема. ALSO/ONLY были реализованы в многочисленных системах, и достигли некоторой меры популярности в семействе Forth. Однако, несколько продавцов отказываются реализовать это, цитируя технические ограничения. В попытке адресовать эти ограничения и таким образом надеясь сделать ALSO/ONLY более приемлемыми для этой критики, комитет определил простой "примитивный набор слов", который не только устраняет некоторые из возражений по ALSO/ONLY, но также и предусматривает достаточную возможность реализации ALSO/ONLY и всех других наборов слов порядка поиска, которые в настоящее время популярны. Forth 83 ALSO/ONLY набор слов предусмотрен как дополнительное расширение к набору слов порядка поиска. Это предоставляет разработчикам, которые так склонны предоставлять этот набор слов, четкое стандартное поведение, но не заставляет разработчиков так делать. Некоторые продавцы публично заявили, что они не будут реализовывать ALSO/ONLY, независимо ни от чего, и один главный продавец заявил нежелание реализовать ANS Forth вообще, если ALSO/ONLY получит мандат. Комитет чувствует, что его действия благоразумны, определяя ALSO/ONLY по возможности без наказа включения его во все системы, и также предусматривая примитивный набор слов порядка поиска, который продавцы может быть, более вероятно реализуют, и который может использоваться для синтеза ALSO/ONLY. Переход/Преобразование: Так как Forth 83 не указывал точную семантику для VOCABULARY, существующие Forth-83 Стандартные программы не могут использовать это кроме как тривиальным способом. Программы могут объявить зависимость от существования набора слов Порядка Поиска, и могут реализовать любую семантику, требующуюся для использования этих примитивов набора слов. Forth 83 программы которые требуют ALSO/ONLY могут объявлять зависимость от Расширения набора слов Порядка Поиска, или могут реализовать расширения в терминах набора слов Порядка Поиска непосредственно. 234 D.6.11 Воздействие мультипрограммирования Forth 83 отметил слова с "воздействием мультипрограммирования" символом "M" в первых строках их описаний. ANS Forth удалил обозначение "M" из описания слова, перемещая обсуждение воздействия мультипрограммирования в это ненормативное приложение. Затрагиваемые слова: Ни одно Причина: Значение "воздействие мультипрограммирования" является точным только в контексте специфической модели для мультипрограммирования. Хотя много систем Forth предусматривают свойства мультипрограммирования, использующие специфическую карусель, кооперативность, модель совместного использования блочных буферов, эта модель - не универсальна. Даже принимая классическую модель, "M" обозначения не содержали достаточно информации, чтобы дать возможность написания приложений которые взаимодействуют в мультипрограммной системе. Практически говоря, "M" обозначения в Forth 83 служат для документирования правил использования адресов блочных буферов в мультипрограммных системах. Эти адреса, часто становятся бессмысленными после того, как задача оставляет CPU по какой либо причине, наиболее часто с целью выполнения ввода-вывода, ожидая события, или добровольного деления ресурсов CPU используя слово PAUSE. Было существенно, что переносимые приложения уважают эти правила использования, делая возможным выполнение их на мультипрограммных системах; отказ твердо придерживаться правил, мог легко поставить под угрозу целостность других приложений, выполняющихся на этих системах так же как приложений фактически с ошибкой. Таким образом, "M" появилось на всех словах, которые созданы, чтобы покинуть CPU, с пониманием, что другие слова НИКОГДА не оставляют его. Эти правила использования были явно зарегистрированы в Блочном наборе слов, где они уместны. "M" обозначения были полностью удалены. Воздействие: Практически, нет. В смысле что любое приложение, которое зависит от мультипрограммирования, должно состоять из, по крайней мере, двух задач, которые совместно используют некоторый ресурс и связываются между собой, Forth 83 не содержал достаточно информации, чтобы дать возможность написания стандартной программы, которая ЗАВИСИЛА от мультипрограммирования. Это - также истинно для ANS Forth. Не мультипрограммные приложения в Forth 83 требовались для признания правил использования для BLOCK так, чтобы они могли быть выполнены должным образом на мультипрограммных системах. Тот же самое истинно для ANS Forth. Единственное различие - метод документирования, используемый для определения правил использования BLOCK. Технический Комитет верит, что текущий метод более ясен, чем концепция "воздействия мультипрограммирования". Переход/Преобразование: Нет необходимости. D.6.12 Слова, не представленные в исполняемой форме 235 ANS Forth позволяет реализациям поставлять некоторые слова в исходном коде или форме "загрузки при необходимости", скорее чем требует, чтобы все снабжаемые слова были доступны без дополнительных действий программиста. Затрагиваемые слова: Все Причина: Системы Forth часто используются в средах, где пространство памяти пользуется большим спросом. Каждое слово, включенное в систему в выполнимой форме, потребляет пространство памяти. Комитет верит, что разрешение стандартным словам быть предоставленными в исходной форме, увеличит вероятность того, что разработчики предоставят законченные ANS Forth реализации даже в системах, разработанных для использования в ограниченных средах. Воздействие: Чтобы использовать Стандартную Программу с заданной ANS Forth реализацией, может быть необходимо предшествующее программе зависящее от реализации "предисловие", чтобы делать слова "в исходной форме" выполняемыми. Это подобно методам, как другие машинные языки требуют выбрать библиотечные подпрограммы, необходимые для специфического приложения. На языках подобных C, цель устранения ненужных подпрограмм из отображения памяти приложения обычно выполняется предоставлением библиотек подпрограмм, и использованием программы "компоновщика", чтобы включить только необходимые подпрограммы в выполнимое приложение. Метод вызова и управления компоновщиком - вне контекста определения языка. Переход/Преобразование: Перед компилированием программы, программист может быть должен выполнить некоторое действие, чтобы сделать слова, требуемые этой программе, доступными для выполнения. 236 E. Руководство по переносимости ANS Forth (информационное приложение) E.1 Введение Наиболее популярные архитектуры, используемые для реализации Forth, имели память с байтовой адресацией, 16-бит операции, и представление числа с дополнительным кодом (дополнение до двух). Forth-83 Стандарт диктует, что эти специфические особенности должны присутствовать в Forth-83 Стандартной системе, и что Forth-83 программы могут эксплуатировать эти возможности свободно. Однако есть много животных в архитектурных джунглях, которые являются бит адресуемыми или ячейкой адресуемыми, или предпочитают 32-бит операции, или представляют числа в обратном коде (дополнение до единицы). Так как одна из сильных сторон Forth - это его пригодность в "странных" средах на "необычных" аппаратных средствах со "специфическими" возможностями, важно, что Стандартный Forth также работает на этих машинах. Первичная цель ANS Forth Стандарта состоит в том, чтобы увеличить типы машин, которые могут поддерживать Стандартный Forth. Это выполнено, допущением некоторых ключевых терминов Forth быть определенными реализацией (например, насколько большая - ячейка?) и, предусмотрением Forth операторов (слов) которые скрывают реализацию. Это освобождает разработчика от необходимости создавать систему Forth, которая наиболее эффективно использует родные аппаратные средства. Машинно-независимые операторы, вместе с некоторой дисциплиной программирования, дают возможность программисту писать программы Forth, которые работают на широком разнообразии машин. Остаток от этого Приложения предоставляет рекомендации для записи переносимых ANS Forth программ. Первый раздел описывает способы делать программы аппаратно независимыми. Это трудно для кого-то знакомого с только одной машинной архитектурой, чтобы вообразить проблемы, вызванные транспортировкой программ между несходными машинами. Поэтому даются примеры специфических архитектур с их соответствующими проблемами. Второй раздел описывает предположения о реализациях Forth, которые делают много программистов, но на которые нельзя полагаться в переносимой программе. E.2 Аппаратные особенности E.2.1 Абстракция данных/памяти Данные и память - камни и строительный раствор конструкции программы. К сожалению, каждый компьютер обрабатывает данные и память различно. Стандарт ANS Forth Систем дает определения данных и памяти, которые применяются к широкому разнообразию компьютеров. Эти определения дают нам способ говорить об общих элементах данных и памяти, в то же время игнорируя подробности специфических аппаратных средств. Точно так же ANS Forth программы, которые используют данные и память способами соответствующими этим определениям, могут также игнорировать аппаратные подробности. Следующие разделы обсуждают определения и описывают, как записать программы, которые не зависят от особенностей данных/памяти различных компьютеров. E.2.2 Определения Три термина, определены ANS Forth - адресуемый элемент, ячейка, и символ. Адресное пространство из ANS Forth системы разделено на массив адресуемых элементов; адресуемый элемент- это самая маленькая коллекция битов, которые могут быть адресованы. Другими словами, адресуемый элемент- это число битов, охватываемых адресами addr и addr+1. Наиболее распространенные машины используют 8-бит адресуемые элементы. Такие "байт адресуемые" машины включают Intel 8086 и Motorola 68000 семейства. 237 Однако существуют другие размеры адресуемых элементов. Есть машины, которые являются бит адресуемыми и машины, которые являются адресуемыми 4-бит полубайтом. Есть также машины с адресуемыми элементами больше 8-бит. Например, есть несколько Forth-in-hardware компьютеров - ячейкой адресуемых. Ячейка - фундаментальный тип данных системы Forth. Ячейка может быть целым числом одна-ячейка или адресом памяти. Параметры Forth и стеки возвратов - это стеки ячеек. Forth 83 определяет, что ячейка - 16- бит. В ANS Forth размер ячейки - это число определенных реализацией адресуемых элементов. Таким образом, ANS Forth реализованный на 16-бит микропроцессоре может использовать 16-бит ячейку, и реализация на 32-бит машине может использовать 32-бит ячейку. Также 18-бит машины, 36-бит машины, и т.д., могли поддерживать ANS Forth системы с 18 или 36-бит ячейками соответственно. Во всех этих системах, DUP делает одну и ту же вещь: оно дублирует вершину стека данных. ! (память) ведет себя соответственно также: учитывая две ячейки данных на стеке, оно сохраняет вторую ячейку по адресу ячейки памяти обозначенному верхней ячейкой. Точно так же было обобщено определение символа, чтобы быть определенным реализацией числом адресуемых элементов (но, по крайней мере, восемь бит). Это устраняет потребность для разработчика Forth предусматривать 8-бит символы на процессорах, где это не так. Например, на 18-бит машине с 9-бит адресуемым элементом, 9-бит символ был бы наиболее удобен. С тех пор, по определению, Вы не можете адресовать что - ни будь меньшее чем адресуемый элемент, символ должен быть, по крайней мере, столь же большой как адресуемый элемент. Это приведет к большим символам на машинах с большими адресуемыми элементами. Как пример - машина с 16-бит адресуемой ячейкой, где 16-бит символ имеет больше смысла. E.2.3 Адресация памяти ANS Forth устраняет много проблем переносимости, используя вышеупомянутые определения. Одна из наиболее обычных проблем переносимости - это адресация последовательных ячеек в памяти. Имея адрес ячейки памяти, как Вы находите адрес следующей ячейки? В Forth 83 это просто: 2 + . Этот код предполагает, что память адресуется элементами по 8-бит (байт) и ячейка - 16-бит шириной. На машине с байтовой адресацией и с 32-бит ячейками, код для нахождения следующей ячейки был бы 4 + . Код был бы 1+ на ячейкой адресуемом процессоре, и 16 + на бит адресуемом процессоре с 16-бит ячейкой. ANS Forth предоставляет оператор следующей ячейки именуемый CELL+ , который может использоваться во всех этих случаях. Задаваясь адресом, CELL+ корректирует адрес размером ячейки (измеряемым в адресуемых элементах). Связанная проблема - это адресация массива ячеек в произвольном порядке. Определяющее слово для создания массива ячеек, используя Forth 83 было бы: : ARRAY CREATE 2* ALLOT DOES> SWAP 2* + ; Использование 2* для масштабирования индекса массива предполагает байт адресацию и 16-бит ячейки. Как в примере выше, для различных машин были бы необходимы различные версии кода. ANS Forth предоставляет переносимый оператор масштабирования именуемый CELLS. Учитывая число n, CELLS возвращает число адресуемых элементов, необходимых для получения n ячеек. Переносимое определение массива таково: : ARRAY CREATE CELLS ALLOT DOES> SWAP CELLS + ; 238 Есть также проблемы переносимости с адресацией массивов символов. В Forth 83 (и в наиболее обычных ANS Forth реализациях), размер символа будет равняться размеру адресуемого элемента. Следовательно, адреса последовательных символов в памяти могут быть найдены, используя 1+ и масштабирование индексов в символьном массиве - это пустая команда (то есть, 1 *). Однако есть случаи, где символ больше чем адресуемый элемент. Примеры включают (1) системы с маленькими адресуемыми элементами (например, бит- и полубайт- адресуемые системы), и (2) системы с большими наборами символов (например, 16-бит символы на байт адресуемой машине). CHAR+ и CHARS операторы, аналогичные CELL+ и CELLS доступны для разрешения максимальной переносимости. ANS Forth обобщает определение некоторых слов Forth, которые работают на участках памяти с использованием адресуемых элементов. Один пример - ALLOT. Приписыванием перед ALLOT соответствующего масштабирующего оператора (CELLS, CHARS, и т.д.), может быть распределено пространство для любой желательной структуры данных (см. определение массива выше). Например: CREATE ABUFFER 5 CHARS ALLOT (назначает 5 символьный буфер) Слово блочного перемещения памяти также использует адресуемые элементы: source destination 8 CELLS MOVE (перемещает 8 ячеек) E.2.4 Проблемы выравнивания Не все адреса созданы равными. Много процессоров имеют ограничения на адреса, которые могут использоваться командами доступа к памяти. Этот Стандарт не требует от разработчика ANS Forth делать выравнивание прозрачным; напротив, он требует (в Разделе 3.3.3.1 Выравнивание адреса), что ANS Forth программа принимает, что может требоваться выравнивание символа и ячейки. Одна из наиболее обычных проблем, вызванных ограничениями выравнивания, состоит в создании таблиц содержащих и символы и ячейки. Когда , (запятая) или C, используется для инициализации таблицы, данные сохраняются по указателю области данных. Следовательно, они должны быть соответственно выровнены. Например, непереносимое определение таблицы было бы: CREATE ATABLE 1 C, X , 2 C, Y , На машине, которая ограничивает 16-бит выборки по четным адресам, CREATE оставил бы указатель области данных на четном адресе, 1 C, делало бы указатель области данных нечетным, и , (запятая) нарушила бы ограничение адреса, сохраняя X по нечетному адресу. Переносимый способ создания таблицы: CREATE ATABLE 1 C, ALIGN X , 2 C, ALIGN Y , ALIGN корректирует указатель области данных на первый выровненный адрес больший чем или равный его текущему адресу. Выровненный адрес подходит для сохранения или выборки символов, ячеек, пар-ячеек, или чисел две-ячейки. После инициализации таблицы, мы также хотели бы читать значения из таблицы. Например, предположите, что мы хотим выбрать первую ячейку X , из таблицы. ATABLE CHAR+ дает адрес первой вещи после символа. Однако это не может быть адрес из X , так как мы выровняли указатель словаря между C, и , . Переносимый путь получения адреса X такой: 239 ATABLE CHAR+ ALIGNED ALIGNED корректирует адрес на вершине стека к первому выровненному адресу большему чем или равному его текущему значению. E.3 Представление числа Различные компьютеры представляют числа различными способами. Понимание этих различий может помочь программисту избежать написания программы, которая зависит от частного представления. E.3.1 Обратный порядок байт против прямого порядка байт Битовые составляющие числа в памяти сохраняются в различном порядке на различных машинах. Некоторые машины помещают самую старшую часть числа по адресу в памяти, и младшие части после ней в более высоких адресах. Другие машины делают напротив - самая младшая часть сохраняется по самому меньшему адресу. Например, следующий код для 16-бит 8086 Forth "прямой порядок байт" произвел бы ответ 34 (hex): VARIABLE FOO HEX 1234 FOO ! FOO C@ Тот же самый код на 16-бит 68000 Forth "обратный порядок байт" произвел бы ответ 12 (hex). Переносимая программа не может использовать представление числа в памяти. Связанная проблема - это представление в памяти пары-ячеек и чисел две-ячейки. Когда пара-ячеек перемещается со стека в память с помощью 2! , ячейка, которая была на вершине стека, помещается по меньшему адресу памяти. Это полезно и разумно для манипулирования отдельными ячейками, когда они находятся в памяти. E.3.2 Организация ALU Различные компьютеры используют различный набор двоичных разрядов для представления целых чисел. Варианты включают двоичные представления (дополнительный код (дополнение до двух), обратный код (дополнение до единицы), величина со знаком, и т.д.), и десятичные представления (BCD, и т.д.). Каждый из этих форматов создает преимущества и недостатки в конструкции арифметико- логического элемента компьютера (ALU). Наиболее часто используемое представление, дополнительный код (дополнение до двух), является популярным из- за простоты его алгоритмов суммирования и вычитания. Программисты, которые выросли на машинах с дополнительным кодом (дополнение до двух), имеют тенденцию стать зависимыми от их представления чисел и брать для предоставления некоторые свойства этого представления. Например, хитрость для нахождения остатка от числа, разделенного величиной два - это маскировать некоторые биты с помощью AND. Обычное приложение этой хитрости - это проверить число на нечетность, используя 1 AND. Однако это не будет работать на машине с обратным кодом (дополнение до единицы), если число отрицательное (переносимая методика - 2 MOD). 240 Остаток от этого раздела - (не исчерпывающий) список вещей для наблюдения за тем, когда желательна переносимость между машинами с двоичными представлениями отличными от дополнительного кода (дополнение до двух). Преобразовать число одна-ячейка в число две-ячейки, ANS Forth предусматривает оператор S>D. Чтобы преобразовать число две-ячейки в одну-ячейку, программисты Forth имеют традиционное использование DROP. Однако эта уловка не работает на машинах величины со знаком. Для переносимости доступен оператор D>S. Преобразование числа одна-ячейка без знака в число две-ячейки может быть сделано переносимо, помещением нуля на стек. E.4 Реализация Forth системы В продолжение истории Forth, было разработано удивительное разнообразие методов реализации. ANS Forth Стандарт поощряет это разнообразие и следовательно ограничивает предположения пользователя, которые он может делать об основной реализации ANS Forth системы. Пользователи конкретной реализации Forth часто привыкают к аспектам реализации и предполагают, что они обычны для всех Forth. Этот раздел указывает многие из этих неправильных предположений. E.4.1 Определения Традиционно, определения Forth состояли из имени слова Forth, связи поиска в словаре, данных, описывающих, как выполнять определение, и параметров, непосредственно описывающих определение. Эти компоненты названы именем, связью, кодом, и полем параметров. Не было найдено никакого метода для доступа к этим полям, который работал бы поперек всех используемых в настоящее время реализаций Forth. Поэтому, ANS Forth строго ограничивает то, как могут использоваться поля. Определенно, переносимая ANS Forth программа не может использовать имя, связь, или поле кода произвольно. Использование поля параметров (для ясности переименованное в поле данных) ограничено операциями, описанными ниже. Только слова, определенные CREATE или другими определяющими словами, которые вызывают CREATE, имеют поля данных. Другие определяющие слова в Стандарте (VARIABLE, CONSTANT, :, и т.д.) не могут быть реализованы с помощью CREATE. Следовательно, Стандартная Программа должна принять что слова определенные через VARIABLE, CONSTANT, :, и т.д., не могут иметь никаких полей данных. Нет никакого способа для Стандартной Программы изменить значение константы или заменить значение определения через двоеточие. DOES> часть определяющего слово работает на поле данных. Так как только CREATE слова имеют поля данных, DOES> может быть только объединено с CREATE или словом которое вызывает CREATE. В ANS Forth, FIND, ['] и ' (tick) возвращают неопределенный объект называемый "идентификатор исполнения". Есть только несколько вещей, которые могут быть сделаны с идентификатором исполнения. Идентификатор может быть передан в EXECUTE для выполнения слова, идентификатор исполнения которого получен с помощью ' (tick) или скомпилирован в текущее определение с помощью COMPILE, . Идентификатор может также быть сохранен в переменной и использован позже. Наконец, если слово, идентификатор исполнения которого получен с помощью ' (tick), было определено через CREATE , >BODY преобразует идентификатор исполнения в адрес области данных слова. Одна вещь, которая определенно не может быть сделана с идентификатором исполнения - это использование ! или , для записи его в объектный код определения Forth. Эта методика иногда используется в реализациях, где объектный код - это список адресов (шитый код) и идентификатор исполнения - также адрес. Однако ANS Forth разрешает реализации с чистым кодом, где это не будет работать. 241 E.4.2 Стеки В некоторых реализациях Forth, возможно найти адрес стека в памяти и манипулировать стеком как массивом ячеек. Эта методика, однако, не переносимая. В некоторых системах, особенно в аппаратно реализованных системах Forth, стеки могли бы быть в части памяти, которая не может быть адресована с помощью программы или не могла бы быть в памяти вообще. Forth стеки параметров и возвратов должны обрабатываться как стеки. Стандартная Программа может использовать стек возвратов непосредственно только для временного хранения значений. Каждое значение, полученное или удаленное со стека возвратов с использованием R@, R>, или 2R>, должно было быть положенным на стек явным использованием >R или 2>R. Даже это должно быть сделано осторожно, так как система может использовать стек возвратов для хранения адресов возврата и параметров управления циклом. Раздел 3.2.3.3 Стек возвратов Стандарта имеет список ограничений. E.5 Дисциплины соглашения ROM приложений Когда Стандартная Система предоставляет область данных, которая является однородно читаемой и записываемой, мы можем называть эту среду "RAM-only". Программы, предназначенные для ROM приложений должны делить область данных, по крайней мере, на две части: записываемую и читаемую не инициализируемую часть называемую "RAM", и инициализируемую часть только для чтения называемую "ROM". Третья возможность, записываемая и читаемая инициализируемая часть, обычно называемая "инициализируемая RAM", не относится к этой дисциплине. Стандартная Программа должна явно инициализировать область данных RAM как необходимо. Разделение области данных в RAM и ROM значимо только в течение жизни ROM программы. Если ROM программа - стандартно разработанная система, она имеет такую же самую систематику как обычная RAM-only система. Слова, затрагиваемые преобразованием из RAM-only в смешанную RAM и ROM среду: , (comma) ALIGN ALIGNED ALLOT C, CREATE HERE UNUSED (VARIABLE всегда обращается к области данных RAM.) За исключением , (запятая) и C, эти слова значимы в ROM и RAM областях данных. Для выбора области данных, этим словам могли бы предшествовать селекторы RAM и ROM. Например: ROM CREATE ONES 32 ALLOT ONES 32 1 FILL RAM создало бы таблицу в области данных ROM. Сохранение данных в RAM области данных при производстве программы для ROM было бы неопределенной ситуацией. Прямая реализация этих селекторов поддерживала бы отдельные счетчики адреса для каждой области. Значение счетчика было бы возвращено HERE и изменено , (запятая), C, , ALIGN, и ALLOT, в RAM и ROM, просто выбором соответствующего счетчика адреса. Эта методика могла бы быть расширена на дополнительное разделение области данных. 242 E.6 Резюме ANS Forth, стандарт не может и не должен вынуждать кого либо записывать переносимую программу. В ситуации, где первостепенна производительность, программист, поощряется использовать каждую уловку в книге. С другой стороны, если необходима переносимость на широкое разнообразие систем, ANS Forth предусматривает для выполнения этого инструментальные средства. Вероятно, нет никакой такой вещи как полностью переносная программа. Программист, используя это руководство, должен разумно взвешивать компромиссы обеспечения переносимости на специфические машины. Например, машины использующие числа величин со знаком редки и вероятно не заслуживают, многих размышлений. Но, системы с различными размерами ячеек будут, конечно, встречаться и должны быть предусмотрены. В общем, создание переносимой программы проясняет, и процесс размышления программиста и заключительную программу. 243 F. Алфавитный список слов (информационное приложение) В следующем списке, последняя, четырехразрядная, часть номера ссылки устанавливает последовательность соответствующую алфавитному порядку всех стандартных слов. Первые две или три части указывают набор слов и раздел словаря, в котором слово определено. .6.1.0010 ! ..................."store"........................CORE......41 .6.1.0030 # ..................."number-sign"..................CORE......41 .6.1.0040 #> .................."number-sign-greater"..........CORE......41 .6.1.0050 #S .................."number-sign-s"................CORE......41 .6.2.0060 #TIB ................"number-t-i-b".............CORE EXT......64 .6.1.0070 ' ..................."tick".........................CORE......41 .6.1.0080 ( ..................."paren"........................CORE......41 11.6.1.0080 ( ..................."paren"........................FILE......97 13.6.1.0086 (LOCAL) ............."paren-local-paren"...........LOCAL.....122 .6.1.0090 * ..................."star".........................CORE......42 .6.1.0100 */ ..................."star-slash"...................CORE......42 .6.1.0110 */MOD ..............."star-slash-mod"...............CORE......42 .6.1.0120 + ..................."plus".........................CORE......42 .6.1.0130 +! .................."plus-store"...................CORE......42 .6.1.0140 +LOOP ..............."plus-loop"....................CORE......42 .6.1.0150 , ..................."comma"........................CORE......43 .6.1.0160 - ..................."minus"........................CORE......43 17.6.1.0170 -TRAILING ..........."dash-trailing"..............STRING.....140 .6.1.0180 . ..................."dot"..........................CORE......43 .6.1.0190 ." .................."dot-quote"....................CORE......43 .6.2.0200 .( .................."dot-paren"................CORE EXT......64 .6.2.0210 .R .................."dot-r"....................CORE EXT......64 15.6.1.0220 .S .................."dot-s".......................TOOLS.....129 .6.1.0230 / ..................."slash"........................CORE......44 .6.1.0240 /MOD ................"slash-mod"....................CORE......44 17.6.1.0245 /STRING ............."slash-string"...............STRING.....140 .6.1.0250 0< .................."zero-less"....................CORE......44 .6.2.0260 0<> ................."zero-not-equals"..........CORE EXT......64 .6.1.0270 0= .................."zero-equals"..................CORE......44 .6.2.0280 0> .................."zero-greater".............CORE EXT......64 .6.1.0290 1+ .................."one-plus".....................CORE......44 .6.1.0300 1- .................."one-minus"....................CORE......44 .6.1.0310 2! .................."two-store"....................CORE......44 .6.1.0320 2* .................."two-star".....................CORE......44 .6.1.0330 2/ .................."two-slash"....................CORE......44 .6.2.0340 2>R ................."two-to-r".................CORE EXT......64 .6.1.0350 2@ .................."two-fetch"....................CORE......45 8.6.1.0360 2CONSTANT ..........."two-constant"...............DOUBLE......80 .6.1.0370 2DROP ..............."two-drop".....................CORE......45 .6.1.0380 2DUP ................"two-dupe".....................CORE......45 8.6.1.0390 2LITERAL ............"two-literal"................DOUBLE......80 .6.1.0400 2OVER ..............."two-over".....................CORE......45 .6.2.0410 2R> ................."two-r-from"...............CORE EXT......64 .6.2.0415 2R@ ................."two-r-fetch"..............CORE EXT......65 8.6.2.0420 2ROT ................"two-rote"...............DOUBLE EXT......82 244 .6.1.0430 2SWAP ..............."two-swap".....................CORE......45 8.6.1.0440 2VARIABLE ..........."two-variable"...............DOUBLE......81 .6.1.0450 : ..................."colon"........................CORE......45 .6.2.0455 :NONAME ............."colon-no-name"............CORE EXT......65 .6.1.0460 ; ..................."semicolon"....................CORE......45 15.6.2.0470 ;CODE ..............."semicolon-code"..........TOOLS EXT.....130 .6.1.0480 < ..................."less-than"....................CORE......46 .6.1.0490 <# .................."less-number-sign".............CORE......46 .6.2.0500 <> .................."not-equals"...............CORE EXT......65 .6.1.0530 = ..................."equals".......................CORE......46 .6.1.0540 > ..................."greater-than".................CORE......46 .6.1.0550 >BODY ..............."to-body"......................CORE......46 12.6.1.0558 >FLOAT .............."to-float".................FLOATING.....108 .6.1.0560 >IN ................."to-in"........................CORE......46 .6.1.0570 >NUMBER ............."to-number"....................CORE......46 .6.1.0580 >R .................."to-r".........................CORE......47 15.6.1.0600 ? ..................."question"....................TOOLS.....129 .6.2.0620 ?DO ................."question-do"..............CORE EXT......65 .6.1.0630 ?DUP ................"question-dupe"................CORE......47 .6.1.0650 @ ..................."fetch"........................CORE......47 .6.1.0670 ABORT ..............................................CORE......47 9.6.2.0670 ABORT .....................................EXCEPTION EXT......88 .6.1.0680 ABORT" .............."abort-quote"..................CORE......47 9.6.2.0680 ABORT" .............."abort-quote".........EXCEPTION EXT......88 .6.1.0690 ABS ................."abs"..........................CORE......47 .6.1.0695 ACCEPT .............................................CORE......48 .6.2.0700 AGAIN ..........................................CORE EXT......66 15.6.2.0702 AHEAD .........................................TOOLS EXT.....130 .6.1.0705 ALIGN ..............................................CORE......48 .6.1.0706 ALIGNED ............................................CORE......48 14.6.1.0707 ALLOCATE .........................................MEMORY.....125 .6.1.0710 ALLOT ..............................................CORE......48 16.6.2.0715 ALSO .........................................SEARCH EXT.....138 .6.1.0720 AND ................................................CORE......48 15.6.2.0740 ASSEMBLER .....................................TOOLS EXT.....130 10.6.1.0742 AT-XY ..............."at-x-y"...................FACILITY......90 .6.1.0750 BASE ...............................................CORE......49 .6.1.0760 BEGIN ..............................................CORE......49 11.6.1.0765 BIN ................................................FILE......97 .6.1.0770 BL .................."b-l"..........................CORE......49 17.6.1.0780 BLANK ............................................STRING.....140 7.6.1.0790 BLK ................."b-l-k".......................BLOCK......75 7.6.1.0800 BLOCK .............................................BLOCK......75 7.6.1.0820 BUFFER ............................................BLOCK......76 15.6.2.0830 BYE ...........................................TOOLS EXT.....130 .6.1.0850 C! .................."c-store"......................CORE......49 .6.2.0855 C" .................."c-quote"..................CORE EXT......66 .6.1.0860 C, .................."c-comma"......................CORE......49 .6.1.0870 C@ .................."c-fetch"......................CORE......49 .6.2.0873 CASE ...........................................CORE EXT......66 9.6.1.0875 CATCH .........................................EXCEPTION......87 245 .6.1.0880 CELL+ ..............."cell-plus"....................CORE......49 .6.1.0890 CELLS ..............................................CORE......50 .6.1.0895 CHAR ................"char".........................CORE......50 .6.1.0897 CHAR+ ................"char-plus"....................CORE......50 .6.1.0898 CHARS ..............."chars"........................CORE......50 11.6.1.0900 CLOSE-FILE .........................................FILE......97 17.6.1.0910 CMOVE ..............."c-move".....................STRING.....140 17.6.1.0920 CMOVE> .............."c-move-up"..................STRING.....140 15.6.2.0930 CODE ..........................................TOOLS EXT.....130 17.6.1.0935 COMPARE ..........................................STRING.....140 .6.2.0945 COMPILE, ............"compile-comma"............CORE EXT......66 .6.1.0950 CONSTANT ...........................................CORE......50 .6.2.0970 CONVERT ........................................CORE EXT......67 .6.1.0980 COUNT ..............................................CORE......50 .6.1.0990 CR .................."c-r"..........................CORE......50 .6.1.1000 CREATE .............................................CORE......50 11.6.1.1010 CREATE-FILE ........................................FILE......97 15.6.2.1015 CS-PICK ............."c-s-pick"................TOOLS EXT.....131 15.6.2.1020 CS-ROLL ............."c-s-roll"................TOOLS EXT.....131 8.6.1.1040 D+ .................."d-plus".....................DOUBLE......81 8.6.1.1050 D- .................."d-minus"....................DOUBLE......81 8.6.1.1060 D. .................."d-dot"......................DOUBLE......81 8.6.1.1070 D.R ................."d-dot-r"....................DOUBLE......81 8.6.1.1075 D0< ................."d-zero-less"................DOUBLE......81 8.6.1.1080 D0= ................."d-zero-equals"..............DOUBLE......81 8.6.1.1090 D2* ................."d-two-star".................DOUBLE......81 8.6.1.1100 D2/ ................."d-two-slash"................DOUBLE......82 8.6.1.1110 D< .................."d-less-than"................DOUBLE......82 8.6.1.1120 D= .................."d-equals"...................DOUBLE......82 12.6.1.1130 D>F ................."d-to-f"...................FLOATING.....109 8.6.1.1140 D>S ................."d-to-s".....................DOUBLE......82 8.6.1.1160 DABS ................"d-abs"......................DOUBLE......82 .6.1.1170 DECIMAL ............................................CORE......51 16.6.1.1180 DEFINITIONS ......................................SEARCH.....136 11.6.1.1190 DELETE-FILE ........................................FILE......97 .6.1.1200 DEPTH ..............................................CORE......51 12.6.2.1203 DF! ................."d-f-store"............FLOATING EXT.....112 12.6.2.1204 DF@ ................."d-f-fetch"............FLOATING EXT.....113 12.6.2.1205 DFALIGN ............."d-f-align"............FLOATING EXT.....113 12.6.2.1207 DFALIGNED ..........."d-f-aligned"..........FLOATING EXT.....113 12.6.2.1208 DFLOAT+ ............."d-float-plus".........FLOATING EXT.....113 12.6.2.1209 DFLOATS ............."d-floats".............FLOATING EXT.....113 8.6.1.1210 DMAX ................"d-max"......................DOUBLE......82 8.6.1.1220 DMIN ................"d-min"......................DOUBLE......82 8.6.1.1230 DNEGATE ............."d-negate"...................DOUBLE......82 .6.1.1240 DO .................................................CORE......51 .6.1.1250 DOES> ..............."does".........................CORE......51 .6.1.1260 DROP ...............................................CORE......52 8.6.2.1270 DU< ................."d-u-less"...............DOUBLE EXT......83 15.6.1.1280 DUMP ..............................................TOOLS.....129 .6.1.1290 DUP ................."dupe".........................CORE......52 246 15.6.2.1300 EDITOR ........................................TOOLS EXT.....132 10.6.2.1305 EKEY ................"e-key"................FACILITY EXT......91 10.6.2.1306 EKEY>CHAR ..........."e-key-to-char"........FACILITY EXT......91 10.6.2.1307 EKEY? ..............."e-key-question".......FACILITY EXT......91 .6.1.1310 ELSE ...............................................CORE......52 .6.1.1320 EMIT ...............................................CORE......52 10.6.2.1325 EMIT? ..............."emit-question"........FACILITY EXT......91 7.6.2.1330 EMPTY-BUFFERS .................................BLOCK EXT......77 .6.2.1342 ENDCASE ............."end-case".................CORE EXT......67 .6.2.1343 ENDOF ..............."end-of"...................CORE EXT......67 .6.1.1345 ENVIRONMENT? ........"environment-query"............CORE......53 .6.2.1350 ERASE ..........................................CORE EXT......67 .6.1.1360 EVALUATE ...........................................CORE......53 7.6.1.1360 EVALUATE ..........................................BLOCK......76 .6.1.1370 EXECUTE ............................................CORE......53 .6.1.1380 EXIT ...............................................CORE......53 .6.2.1390 EXPECT .........................................CORE EXT......68 12.6.1.1400 F! .................."f-store"..................FLOATING.....109 12.6.1.1410 F* .................."f-star"...................FLOATING.....109 12.6.2.1415 F** ................."f-star-star"..........FLOATING EXT.....113 12.6.1.1420 F+ .................."f-plus"...................FLOATING.....109 12.6.1.1425 F- .................."f-minus"..................FLOATING.....109 12.6.2.1427 F. .................."f-dot"................FLOATING EXT.....113 12.6.1.1430 F/ .................."f-slash"..................FLOATING.....109 12.6.1.1440 F0< ................."f-zero-less-than".........FLOATING.....109 12.6.1.1450 F0= ................."f-zero-equals"............FLOATING.....109 12.6.1.1460 F< .................."f-less-than"..............FLOATING.....109 12.6.1.1470 F>D ................."f-to-d"...................FLOATING.....110 12.6.1.1472 F@ .................."f-fetch"..................FLOATING.....110 12.6.2.1474 FABS ................"f-abs"................FLOATING EXT.....114 12.6.2.1476 FACOS ..............."f-a-cos"..............FLOATING EXT.....114 12.6.2.1477 FACOSH .............."f-a-cosh".............FLOATING EXT.....114 12.6.1.1479 FALIGN .............."f-align"..................FLOATING.....110 12.6.1.1483 FALIGNED ............"f-aligned"................FLOATING.....110 12.6.2.1484 FALOG ..............."f-a-log"..............FLOATING EXT.....114 .6.2.1485 FALSE ..........................................CORE EXT......68 12.6.2.1486 FASIN ..............."f-a-sine".............FLOATING EXT.....114 12.6.2.1487 FASINH .............."f-a-cinch"............FLOATING EXT.....114 12.6.2.1488 FATAN ..............."f-a-tan"..............FLOATING EXT.....114 12.6.2.1489 FATAN2 .............."f-a-tan-two"..........FLOATING EXT.....114 12.6.2.1491 FATANH .............."f-a-tan-h"............FLOATING EXT.....114 12.6.1.1492 FCONSTANT ..........."f-constant"...............FLOATING.....110 12.6.2.1493 FCOS ................"f-cos"................FLOATING EXT.....115 12.6.2.1494 FCOSH ..............."f-cosh"...............FLOATING EXT.....115 12.6.1.1497 FDEPTH .............."f-depth"..................FLOATING.....110 12.6.1.1500 FDROP ..............."f-drop"...................FLOATING.....110 12.6.1.1510 FDUP ................"f-dupe"...................FLOATING.....110 12.6.2.1513 FE. ................."f-e-dot"..............FLOATING EXT.....115 12.6.2.1515 FEXP ................"f-e-x-p"..............FLOATING EXT.....115 12.6.2.1516 FEXPM1 .............."f-e-x-p-m-one"........FLOATING EXT.....115 11.6.1.1520 FILE-POSITION .......................................FILE......97 247 11.6.1.1522 FILE-SIZE ..........................................FILE......97 11.6.2.1524 FILE-STATUS ....................................FILE EXT.....102 .6.1.1540 FILL ...............................................CORE......53 .6.1.1550 FIND ...............................................CORE......53 16.6.1.1550 FIND .............................................SEARCH.....136 12.6.1.1552 FLITERAL ............"f-literal"................FLOATING.....111 12.6.2.1553 FLN ................."f-l-n"................FLOATING EXT.....115 12.6.2.1554 FLNP1 ..............."f-l-n-p-one"..........FLOATING EXT.....115 12.6.1.1555 FLOAT+ .............."float-plus"...............FLOATING.....111 12.6.1.1556 FLOATS .........................................FLOATING.....111 12.6.2.1557 FLOG ................"f-log"................FLOATING EXT.....115 12.6.1.1558 FLOOR ..........................................FLOATING.....111 7.6.1.1559 FLUSH .............................................BLOCK......76 11.6.2.1560 FLUSH-FILE .....................................FILE EXT.....102 .6.1.1561 FM/MOD .............."f-m-slash-mod"................CORE......54 12.6.1.1562 FMAX ................"f-max"....................FLOATING.....111 12.6.1.1565 FMIN ................"f-min"....................FLOATING.....111 12.6.1.1567 FNEGATE ............."f-negate".................FLOATING.....111 15.6.2.1580 FORGET ........................................TOOLS EXT.....132 16.6.2.1590 FORTH ........................................SEARCH EXT.....138 16.6.1.1595 FORTH-WORDLIST ...................................SEARCH.....137 12.6.1.1600 FOVER ..............."f-over"...................FLOATING.....111 14.6.1.1605 FREE .............................................MEMORY.....126 12.6.1.1610 FROT ................"f-rote"...................FLOATING.....111 12.6.1.1612 FROUND .............."f-round"..................FLOATING.....111 12.6.2.1613 FS. ................."f-s-dot"..............FLOATING EXT.....115 12.6.2.1614 FSIN ................"f-sine"...............FLOATING EXT.....116 12.6.2.1616 FSINCOS ............."f-sine-cos"...........FLOATING EXT.....116 12.6.2.1617 FSINH ..............."f-cinch"..............FLOATING EXT.....116 12.6.2.1618 FSQRT ..............."f-square-root"........FLOATING EXT.....116 12.6.1.1620 FSWAP ..............."f-swap"...................FLOATING.....111 12.6.2.1625 FTAN ................"f-tan"................FLOATING EXT.....116 12.6.2.1626 FTANH ..............."f-tan-h"..............FLOATING EXT.....116 12.6.1.1630 FVARIABLE ..........."f-variable"...............FLOATING.....112 12.6.2.1640 F~ .................."f-proximate"..........FLOATING EXT.....116 16.6.1.1643 GET-CURRENT ......................................SEARCH.....137 16.6.1.1647 GET-ORDER ........................................SEARCH.....137 .6.1.1650 HERE ...............................................CORE......54 .6.2.1660 HEX ............................................CORE EXT......68 .6.1.1670 HOLD ...............................................CORE......54 .6.1.1680 I ..................................................CORE......54 .6.1.1700 IF .................................................CORE......54 .6.1.1710 IMMEDIATE ..........................................CORE......54 11.6.1.1717 INCLUDE-FILE .......................................FILE......98 11.6.1.1718 INCLUDED ...........................................FILE......98 .6.1.1720 INVERT .............................................CORE......55 .6.1.1730 J ..................................................CORE......55 .6.1.1750 KEY ................................................CORE......55 10.6.1.1755 KEY? ................"key-question".............FACILITY......90 6.1.1760 LEAVE ..............................................CORE......56 7.6.2.1770 LIST ..........................................BLOCK EXT......77 248 .6.1.1780 LITERAL ............................................CORE......76 7.6.1.1790 LOAD ..............................................BLOCK......76 13.6.2.1795 LOCALS| ............."locals-bar"..............LOCAL EXT.....123 .6.1.1800 LOOP ...............................................CORE......56 .6.1.1805 LSHIFT .............."l-shift"......................CORE......56 .6.1.1810 M* .................."m-star".......................CORE......56 8.6.1.1820 M*/ ................."m-star-slash"...............DOUBLE......82 8.6.1.1830 M+ .................."m-plus".....................DOUBLE......82 .6.2.1850 MARKER .........................................CORE EXT......68 .6.1.1870 MAX ................................................CORE......56 .6.1.1880 MIN ................................................CORE......56 .6.1.1890 MOD ................................................CORE......56 .6.1.1900 MOVE ...............................................CORE......56 10.6.2.1905 MS .........................................FACILITY EXT......91 .6.1.1910 NEGATE .............................................CORE......57 .6.2.1930 NIP ............................................CORE EXT......68 .6.2.1950 OF .............................................CORE EXT......68 16.6.2.1965 ONLY .........................................SEARCH EXT.....138 11.6.1.1970 OPEN-FILE ..........................................FILE......99 .6.1.1980 OR .................................................CORE......57 16.6.2.1985 ORDER ........................................SEARCH EXT.....138 .6.1.1990 OVER ...............................................CORE......57 .6.2.2000 PAD ............................................CORE EXT......69 10.6.1.2005 PAGE ...........................................FACILITY......91 .6.2.2008 PARSE ..........................................CORE EXT......69 .6.2.2030 PICK ...........................................CORE EXT......69 .6.1.2033 POSTPONE ...........................................CORE......57 12.6.2.2035 PRECISION ..................................FLOATING EXT.....117 16.6.2.2037 PREVIOUS .....................................SEARCH EXT.....138 .6.2.2040 QUERY ..........................................CORE EXT......69 .6.1.2050 QUIT ...............................................CORE......57 11.6.1.2054 R/O ................."r-o"..........................FILE......99 11.6.1.2056 R/W ................."r-w"..........................FILE......99 .6.1.2060 R> .................."r-from".......................CORE......57 .6.1.2070 R@ .................."r-fetch"......................CORE......58 11.6.1.2080 READ-FILE ..........................................FILE......99 11.6.1.2090 READ-LINE ..........................................FILE.....100 .6.1.2120 RECURSE ............................................CORE......58 .6.2.2125 REFILL .........................................CORE EXT......69 7.6.2.2125 REFILL ........................................BLOCK EXT......77 11.6.2.2125 REFILL .........................................FILE EXT.....102 11.6.2.2130 RENAME-FILE ....................................FILE EXT.....102 .6.1.2140 REPEAT .............................................CORE......58 11.6.1.2142 REPOSITION-FILE ....................................FILE.....100 12.6.1.2143 REPRESENT ......................................FLOATING.....112 14.6.1.2145 RESIZE ...........................................MEMORY.....126 11.6.1.2147 RESIZE-FILE ........................................FILE.....100 .6.2.2148 RESTORE-INPUT ..................................CORE EXT......70 .6.2.2150 ROLL ...........................................CORE EXT......70 .6.1.2160 ROT ................."rote".........................CORE......58 .6.1.2162 RSHIFT .............."r-shift"......................CORE......58 249 .6.1.2165 S" .................."s-quote"......................CORE......58 11.6.1.2165 S" .................."s-quote"......................FILE.....101 .6.1.2170 S>D ................."s-to-d".......................CORE......59 7.6.1.2180 SAVE-BUFFERS ......................................BLOCK......77 .6.2.2182 SAVE-INPUT .....................................CORE EXT......70 7.6.2.2190 SCR ................."s-c-r"...................BLOCK EXT......77 17.6.1.2191 SEARCH ...........................................STRING.....141 16.6.1.2192 SEARCH-WORDLIST ..................................SEARCH.....137 15.6.1.2194 SEE ...............................................TOOLS.....129 16.6.1.2195 SET-CURRENT ......................................SEARCH.....137 16.6.1.2197 SET-ORDER ........................................SEARCH.....137 12.6.2.2200 SET-PRECISION ..............................FLOATING EXT.....117 12.6.2.2202 SF! ................."s-f-store"............FLOATING EXT.....117 12.6.2.2203 SF@ ................."s-f-fetch"............FLOATING EXT.....117 12.6.2.2204 SFALIGN ............."s-f-align"............FLOATING EXT.....117 12.6.2.2206 SFALIGNED ..........."s-f-aligned"..........FLOATING EXT.....117 12.6.2.2207 SFLOAT+ ............."s-float-plus".........FLOATING EXT.....118 12.6.2.2208 SFLOATS ............."s-floats".............FLOATING EXT.....118 .6.1.2210 SIGN ...............................................CORE......59 17.6.1.2212 SLITERAL .........................................STRING.....141 .6.1.2214 SM/REM .............."s-m-slash-rem"................CORE......59 .6.1.2216 SOURCE .............................................CORE......59 .6.2.2218 SOURCE-ID ..........."source-i-d"...............CORE EXT......70 11.6.1.2218 SOURCE-ID ..........."source-i-d"...................FILE.....101 .6.1.2220 SPACE ..............................................CORE......59 .6.1.2230 SPACES .............................................CORE......59 .6.2.2240 SPAN ...........................................CORE EXT......70 .6.1.2250 STATE ..............................................CORE......59 15.6.2.2250 STATE .........................................TOOLS EXT.....132 .6.1.2260 SWAP ...............................................CORE......60 .6.1.2270 THEN ...............................................CORE......60 9.6.1.2275 THROW .........................................EXCEPTION......87 7.6.2.2280 THRU ..........................................BLOCK EXT......78 .6.2.2290 TIB ................."t-i-b"....................CORE EXT......71 10.6.2.2292 TIME&DATE ..........."time-and-date"........FACILITY EXT......92 .6.2.2295 TO .............................................CORE EXT......71 13.6.1.2295 TO ................................................LOCAL.....123 .6.2.2298 TRUE ...........................................CORE EXT......71 .6.2.2300 TUCK ...........................................CORE EXT......71 .6.1.2310 TYPE ...............................................CORE......60 .6.1.2320 U. .................."u-dot"........................CORE......60 .6.2.2330 U.R ................."u-dot-r"..................CORE EXT......71 .6.1.2340 U< .................."u-less-than"..................CORE......60 .6.2.2350 U> .................."u-greater-than"...........CORE EXT......71 .6.1.2360 UM* ................."u-m-star".....................CORE......60 .6.1.2370 UM/MOD .............."u-m-slash-mod"................CORE......61 .6.1.2380 UNLOOP .............................................CORE......61 .6.1.2390 UNTIL ..............................................CORE......61 .6.2.2395 UNUSED .........................................CORE EXT......71 7.6.1.2400 UPDATE ............................................BLOCK......77 .6.2.2405 VALUE ..........................................CORE EXT......72 250 .6.1.2410 VARIABLE ...........................................CORE......61 11.6.1.2425 W/O ................."w-o"..........................FILE.....101 .6.1.2430 WHILE ..............................................CORE......62 .6.2.2440 WITHIN .........................................CORE EXT......72 .6.1.2450 WORD ...............................................CORE......62 16.6.1.2460 WORDLIST .........................................SEARCH.....137 15.6.1.2465 WORDS .............................................TOOLS.....129 11.6.1.2480 WRITE-FILE .........................................FILE.....101 11.6.1.2485 WRITE-LINE .........................................FILE.....102 .6.1.2490 XOR ................."x-or".........................CORE......62 .6.1.2500 [ ..................."left-bracket".................CORE......62 .6.1.2510 ['] ................."bracket-tick".................CORE......62 .6.1.2520 [CHAR] .............."bracket-char".................CORE......63 .6.2.2530 [COMPILE] ..........."bracket-compile"..........CORE EXT......72 15.6.2.2531 [ELSE] .............."bracket-else"............TOOLS EXT.....132 15.6.2.2532 [IF] ................"bracket-if"..............TOOLS EXT.....132 15.6.2.2533 [THEN] .............."bracket-then"............TOOLS EXT.....133 .6.2.2535 \ ..................."backslash"................CORE EXT......72 7.6.2.2535 \ ..................."backslash"...............BLOCK EXT......78 .6.1.2540 ] ..................."right-bracket"................CORE......63 251