stringtranslate.com

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

Форт — это процедурный , конкатенативный , стек-ориентированный язык программирования и интерактивная среда разработки, разработанный Чарльзом Х. «Чаком» Муром и впервые использованный другими программистами в 1970 году. Хотя это и не было аббревиатурой , название языка в первые годы своего существования часто писалось в все заглавные буквы как FORTH . Реализации FORTH-79 и FORTH-83, которые не были написаны Муром, стали стандартами де-факто , а официальная стандартизация языка была опубликована в 1994 году как ANS Forth. До и после ANS Forth существовал широкий спектр производных Форта. Реализация бесплатного программного обеспечения Gforth активно поддерживается, как и несколько коммерчески поддерживаемых систем.

Форт обычно сочетает в себе компилятор со встроенной командной оболочкой, [a] где пользователь взаимодействует через подпрограммы, называемые словами . Слова можно определять, тестировать, переопределять и отлаживать без перекомпиляции или перезапуска всей программы. Все синтаксические элементы, включая переменные, операторы и поток управления, определяются как слова. Стек используется для передачи параметров между словами, что приводит к стилю обратной польской нотации .

На протяжении большей части существования Форта стандартным методом была компиляция в многопоточный код , который можно интерпретировать быстрее, чем байт-код . Одним из первых преимуществ Форта был размер: вся среда разработки, включая компилятор, редактор и пользовательские программы, могла поместиться в памяти 8-битной или аналогичной ограниченной системы. Существуют современные реализации, которые больше не ограничены пространством и генерируют оптимизированный машинный код , как и компиляторы других языков. Относительная простота создания базовой системы Форта привела к появлению множества личных и частных вариантов, таких как специальный Форт, используемый для реализации бестселлера 1986 года видеоигры Starflight от Electronic Arts . [1]

Форт используется в загрузчике открытой прошивки , в приложениях космических полетов [2] , таких как космический корабль Philae , [3] [4] и в других встроенных системах, которые предусматривают взаимодействие с аппаратным обеспечением.

Мур разработал серию микропроцессоров для прямого выполнения скомпилированного Forth-подобного кода и экспериментировал с меньшими языками, основанными на концепциях Forth, включая cmForth и colorForth . Большинство этих языков были разработаны для поддержки собственных проектов Мура, таких как проектирование микросхем.

Использование

Форт занимает свою нишу в астрономических и космических приложениях [5] , а также имеет опыт разработки встроенных систем . Загрузочные ПЗУ с открытой прошивкой , используемые Apple , IBM , Sun и OLPC XO-1 , содержат среду Forth.

Форт часто использовался для создания нового оборудования. Forth был первым резидентным программным обеспечением на новом чипе Intel 8086 в 1978 году, а MacFORTH был первой резидентной системой разработки для Macintosh 128K в 1984 году .

Atari, Inc. использовала тщательно продуманную анимированную демонстрацию, написанную на Форте, чтобы продемонстрировать возможности компьютеров Atari 400 и 800 в универмагах. [7] В 1980-х годах Electronic Arts опубликовала несколько видеоигр, написанных на Форте, включая Worms? (1983), [8] Adventure Construction Set (1984), [9] Amnesia (1986), [10] Starflight (1986), [1] и Lords of Conquest (1986). Игра по программированию роботов ChipWits (1984) была написана на MacFORTH. [11]

RapidFile (1986) Эштона-Тейта , программа работы с базами данных в виде плоских файлов, и VP-Planner [12] от Paperback Software International (1983), программа для работы с электронными таблицами, конкурирующая с Lotus 1-2-3 , были написаны на Форте.

Canon Cat (1987) использует Форт для системного программирования.

Rockwell производила однокристальные микрокомпьютеры с резидентным ядром Forth: R65F11 и R65F12. ASYST был расширением Форта для измерения и управления на ПК. [13]

История

Форт развился из системы персонального программирования Чарльза Х. Мура , которая находилась в постоянном развитии с 1968 года. [6] Форт впервые познакомился с другими программистами в начале 1970-х годов, начиная с Элизабет Разер из Национальной радиоастрономической обсерватории США ( НРАО). [6] После работы в NRAO Чарльз Мур и Элизабет Разер в 1973 году основали FORTH, Inc., дорабатывая и портируя системы Forth на десятки других платформ в течение следующего десятилетия.

Форт назван так потому, что в 1968 году «файл, содержащий интерпретатор, был помечен как ЧЕТВЕРТЫЙ для программного обеспечения 4-го (следующего) поколения, но операционная система IBM 1130 ограничивала имена файлов пятью символами». [14] Мур рассматривал Форт как преемника языков программирования третьего поколения «компилировать-связывать-идти » или программного обеспечения для аппаратного обеспечения «четвертого поколения».

MicroFORTH компании FORTH, Inc. был разработан для микропроцессоров Intel 8080 , Motorola 6800 , Zilog Z80 и RCA 1802 , начиная с 1976 года. Позже MicroFORTH использовался любителями для создания систем Forth для других архитектур, таких как 6502 в 1978 году. Группа интересов Forth была сформирована в 1978 году. [15] Она продвигала и распространяла собственную версию языка Fig-Forth для большинства марок домашних компьютеров.

Форт был популярен в начале 1980-х годов [16] , потому что он хорошо подходил для ограниченной памяти микрокомпьютеров . Простота реализации языка привела к множеству реализаций. [17] Домашний компьютер Jupiter ACE имеет Forth в своей резидентной в ПЗУ операционной системе. Insoft GraFORTH — это версия Forth с графическими расширениями для Apple II. [18]

Общая практика была закреплена в фактических стандартах FORTH-79 [19] и FORTH-83 [20] в 1979 и 1983 годах соответственно. Эти стандарты были унифицированы ANSI в 1994 году и обычно называются ANS Forth. [21] [22]

По состоянию на 2018 год исходный код исходной версии FORTH 1130 был восстановлен и теперь обновляется для работы на восстановленной или эмулируемой системе 1130. [23]

Обзор

В Форте особое внимание уделяется использованию небольших простых функций, называемых словами . Слова для более крупных задач требуют множества более мелких слов, каждое из которых выполняет отдельную подзадачу. Большая программа на Форте представляет собой иерархию слов. Эти слова, представляющие собой отдельные модули, которые неявно взаимодействуют через механизм стека, могут быть прототипированы, построены и протестированы независимо. Самый высокий уровень кода Forth может напоминать англоязычное описание приложения. Форт называют языком метаприложений : языком, который можно использовать для создания проблемно-ориентированных языков . [24]

Форт опирается на явное использование стека данных и обратную польскую нотацию , которая обычно используется в калькуляторах Hewlett-Packard . В RPN оператор помещается после своих операндов, в отличие от более распространенной инфиксной записи , где оператор помещается между операндами. Постфиксная нотация упрощает синтаксический анализ и расширение языка; Гибкость Форта делает статическую грамматику BNF неприемлемой, и у него нет монолитного компилятора. Расширение компилятора требует только написания нового слова вместо изменения грамматики и изменения базовой реализации.

Используя RPN, можно получить результат математического выражения (25 * 10 + 50)следующим образом:

 25 10 * 50 + СР . 300 ок        

Сначала в стек кладутся числа 25 и 10.


Слово *берет два верхних числа из стека, умножает их и помещает произведение обратно в стек.

Затем число 50 помещается в стек.


Слово +складывает два верхних значения, увеличивая сумму. CR( возврат каретки ) начинает вывод с новой строки. Наконец, .печатает результат. Поскольку все завершилось успешно, система Forth печатает OK. [25]

Даже структурные особенности Форта основаны на стеках. Например:

 : FLOOR5 ( n -- n' ) DUP 6 < IF DROP 5 ELSE 1 - THEN ;             

Двоеточие указывает на начало нового определения, в данном случае нового слова (опять же, слово — это термин, используемый для подпрограммы), называемого FLOOR5. Текст в круглых скобках представляет собой комментарий, сообщающий, что это слово ожидает число в стеке и вернет возможно измененное число (в стеке).

Подпрограмма использует следующие команды: DUPдублирует число в стеке; 6помещает 6 на вершину стека; <сравнивает два верхних числа в стеке (6 и DUPввод ed) и заменяет их значением «истина» или «ложь»; IFпринимает значение «истина» или «ложь» и выбирает выполнение команд сразу после него или переход к ELSE; DROPотбрасывает значение в стеке; 5помещает 5 на вершину стека; и THENзавершает условное предложение.

Это FLOOR5слово эквивалентно этой функции, написанной на языке программирования C с использованием тернарного оператора '?:'.

intfloor5 ( int v ) { return ( v < 6 ) ? _ 5 : ( в - 1 ); }             

Более кратко эта функция записывается так:

 : ЭТАЖ 5 ( n -- n' ) 1-5 МАКС ;      

Это можно запустить следующим образом:

 1 ЭТАЖ 5 CR . 5 ок 8 ЭТАЖ 5 CR . 7 ок           

Сначала число (1 или 8) помещается в стек, FLOOR5вызывается, который снова извлекает число и помещает результат. CRперемещает вывод на новую строку (опять же, это сделано только для удобства чтения). Наконец, вызов .извлекает результат и печатает.

Удобства

Грамматика Форта не имеет официальной спецификации. Вместо этого он определяется простым алгоритмом. Интерпретатор считывает строку ввода с пользовательского устройства ввода, которая затем анализируется на наличие слова, используя пробелы в качестве разделителя ; некоторые системы распознают дополнительные символы пробелов . Когда переводчик находит слово, он ищет его в словаре . Если слово найдено, интерпретатор выполняет код, связанный с этим словом, а затем возвращается для анализа остальной части входного потока. Если слово не найдено, оно считается числом и предпринимается попытка преобразовать его в число и поместить в стек; в случае успеха интерпретатор продолжает анализ входного потока. В противном случае, если и поиск, и преобразование чисел завершаются неудачей, интерпретатор печатает слово, за которым следует сообщение об ошибке, указывающее, что слово не распознано, сбрасывает входной поток и ожидает ввода нового пользователя. [26]

Определение нового слова начинается со слова :(двоеточие) и заканчивается словом ;(точка с запятой). Например,

 : Х ДУП 1+ . . ;      

скомпилирует слово Xи сделает его доступным для поиска в словаре. При выполнении с помощью 10 Xконсоли будет напечатано 11 10. [27]

Большинство систем Форта включают в себя ассемблер для записи слов с использованием возможностей процессора. Ассемблеры Форта часто используют обратный польский синтаксис, в котором параметры инструкции предшествуют инструкции. Типичный обратный польский ассемблер подготавливает операнды в стеке, а мнемоника копирует всю инструкцию в память на последнем этапе. Ассемблер Форта по своей природе является ассемблером макросов, поэтому легко определить псевдоним для регистров в соответствии с их ролью в системе Форт: например, «dsp» для регистра, используемого в качестве указателя стека данных. [28]

Операционная система, файлы и многозадачность

Большинство систем Forth работают под управлением операционной системы хоста, такой как Microsoft Windows , Linux или версия Unix , и используют файловую систему операционной системы хоста для исходных файлов и файлов данных; Стандарт ANSI Forth описывает слова, используемые для ввода-вывода. Все современные системы Forth используют в качестве исходного кода обычные текстовые файлы, даже если они встроены. Встроенная система с резидентным компилятором получает исходный код по последовательному каналу.

Классические системы Forth традиционно не используют ни операционную систему , ни файловую систему . Вместо хранения кода в файлах исходный код хранится в дисковых блоках, записанных по адресам физических дисков. Это слово BLOCKиспользуется для перевода номера блока дискового пространства размером 1 КБ в адрес буфера, содержащего данные, который автоматически управляется системой Forth. Использование блоков стало редким явлением с середины 1990-х годов. В размещенной системе эти блоки в любом случае также размещаются в обычном файле.

Многозадачность , чаще всего совместное циклическое планирование , обычно доступна (хотя слова и поддержка многозадачности не охватываются стандартом ANSI Forth). Это слово PAUSEиспользуется для сохранения контекста выполнения текущей задачи, для поиска следующей задачи и восстановления контекста ее выполнения. Каждая задача имеет свои стеки, частные копии некоторых управляющих переменных и рабочую область. Обмен задачами прост и эффективен; в результате многозадачность Форта доступна даже на очень простых микроконтроллерах , таких как Intel 8051 , Atmel AVR и TI MSP430 . [29]

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

Самокомпиляция и кросс-компиляция

Полнофункциональная система Forth со всем исходным кодом скомпилируется сама. Этот метод обычно называется мета-компиляцией или самостоятельным размещением программистами Forth (хотя этот термин не совсем соответствует мета-компиляции в том смысле, в котором он обычно определяется). Обычный метод — переопределить несколько слов, которые помещают скомпилированные биты в память. В словах компилятора используются специально названные версии операций выборки и сохранения, которые можно перенаправить в буферную область памяти. Буферная область имитирует или осуществляет доступ к области памяти, начинающейся с адреса, отличного от адреса буфера кода. Такие компиляторы определяют слова для доступа как к памяти целевого компьютера, так и к памяти главного (компилирующего) компьютера. [30]

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

Существуют многочисленные варианты таких компиляторов для разных сред. Для встроенных систем код вместо этого может быть записан на другой компьютер (метод, известный как кросс-компиляция) , через последовательный порт или даже один бит TTL , сохраняя при этом имена слов и другие неисполняемые части словаря в исходной компиляции. компьютер. Минимальными определениями для такого компилятора Форта являются слова, которые извлекают и сохраняют байт, и слово, которое командует выполнить слово Форта. Часто наиболее трудоемкой частью написания удаленного порта является построение исходной программы для реализации выборки, сохранения и выполнения, но многие современные микропроцессоры имеют встроенные функции отладки (например, Motorola CPU32 ), которые устраняют эту задачу. [31]

Структура языка

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

Определенное слово обычно состоит из заголовка и тела , причем заголовок состоит из поля имени (NF) и поля ссылки (LF), а тело состоит из поля кода (CF) и поля параметра (PF).

Голова и тело словарной статьи рассматриваются отдельно, поскольку они могут не быть смежными. Например, когда программа на Форте перекомпилируется для новой платформы, голова может оставаться на компилирующем компьютере, а тело переходит на новую платформу. В некоторых средах (например, во встроенных системах ) головки занимают память без необходимости. Однако некоторые кросс-компиляторы могут помещать головы в цель, если ожидается, что сама цель будет поддерживать интерактивный Форт. [32]

Точный формат словарной статьи не предписан, и реализации различаются.

Структура компилятора

Сам компилятор не является монолитной программой. Он состоит из слов Форта, видимых системе и доступных для использования программистом. Это позволяет программисту изменять слова компилятора для специальных целей.

Флаг «время компиляции» в поле имени устанавливается для слов с поведением «время компиляции». Большинство простых слов выполняют один и тот же код независимо от того, вводятся ли они в командной строке или встроены в код. При их компиляции компилятор просто помещает в слово код или связанный указатель. [27]

Классическими примерами слов времени компиляции являются управляющие структуры, такие как IFи WHILE. Почти все управляющие структуры Форта и почти весь его компилятор реализованы как слова времени компиляции. За исключением некоторых редко используемых слов потока управления , встречающихся только в нескольких реализациях, таких как слово условного возврата ?EXIT, используемое в preForth Ульриха Хоффмана, [33] [34] все слова потока управления Форта выполняются во время компиляции для компиляции различных комбинаций примитивные слова вместе с адресами их ветвей. Например, IFи WHILEи слова, соответствующие им, set up BRANCH(безусловный переход) и ?BRANCH(извлечение значения из стека и переход, если оно ложно). Слова потока управления счетным циклом работают аналогично, но создают комбинации примитивных слов, которые работают со счетчиком, и так далее. Во время компиляции стек данных используется для поддержки балансировки структуры управления, вложения и обратного исправления адресов ветвей. Фрагмент:

 ... DUP 6 < ЕСЛИ DROP 5 ELSE 1 - THEN ...           

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

 ... DUP LIT 6 < ?BRANCH 5 DROP LIT 5 BRANCH 3 LIT 1 - ...               

Цифры после BRANCHпредставляют относительные адреса перехода. LIT— это примитивное слово для помещения «буквального» числа в стек данных. (Более быстрый и более короткий код был бы скомпилирован с использованием указателей на константы вместо LITвстроенных данных, если бы какое-либо из задействованных чисел было отдельно определено как константы. Аналогичные изменения были бы, если бы вместо констант использовались другие слова и так далее. )

Состояние компиляции и состояние интерпретации

Слово :(двоеточие) анализирует имя как параметр, создает словарную запись ( определение двоеточия ) и переходит в состояние компиляции. Интерпретатор продолжает считывать слова, разделенные пробелами, с пользовательского устройства ввода. Если слово найдено, интерпретатор выполняет семантику компиляции , связанную с этим словом, вместо семантики интерпретации . Семантика компиляции слова по умолчанию заключается в добавлении семантики его интерпретации к текущему определению. [27]

Слово ;(точка с запятой) завершает текущее определение и возвращается в состояние интерпретации. Это пример слова, семантика компиляции которого отличается от значения по умолчанию. Семантика интерпретации ;(точка с запятой), большинства слов потока управления и некоторых других слов не определена в ANS Forth, а это означает, что их следует использовать только внутри определений, а не в интерактивной командной строке. [27]

Состояние интерпретатора можно изменить вручную с помощью слов [(левая скобка) и ](правая скобка), которые обозначают состояние интерпретации или состояние компиляции соответственно. Эти слова можно использовать со словом LITERALдля вычисления значения во время компиляции и для вставки вычисленного значения в текущее определение двоеточия. LITERALимеет семантику компиляции, позволяющую брать объект из стека данных и добавлять семантику к текущему определению двоеточия, чтобы поместить этот объект в стек данных.

В ANS Forth текущее состояние интерпретатора можно прочитать по флагу, который STATE содержит значение true в состоянии компиляции и false в противном случае. Это позволяет реализовать так называемые слова с интеллектуальным состоянием , поведение которых меняется в зависимости от текущего состояния интерпретатора.

Непосредственные слова

Это слово IMMEDIATEотмечает самое последнее определение двоеточия как непосредственное слово , эффективно заменяя семантику компиляции семантикой интерпретации. [35] Непосредственные слова обычно выполняются во время компиляции, а не компилируются, но это может быть отменено программистом в любом состоянии. ;является примером непосредственного слова. В ANS Forth слово POSTPONEпринимает имя в качестве параметра и добавляет семантику компиляции именованного слова к текущему определению, даже если слово было помечено как немедленное. Форт-83 определил отдельные слова COMPILEи [COMPILE]заставил компилировать непрямые и непосредственные слова соответственно.

Вместо резервирования места для флага Immediate в каждом определении некоторые реализации Forth используют словарь Immediate, который проверяется первым в режиме компиляции.

Безымянные слова и жетоны выполнения

В ANS Forth безымянные слова могут быть определены с помощью слова :NONAME, которое компилирует следующие слова до следующего ;(точка с запятой) и оставляет маркер выполнения в стеке данных. Маркер выполнения предоставляет непрозрачный дескриптор скомпилированной семантики, аналогичный указателям на функции языка программирования C.

Токены выполнения могут храниться в переменных. Слово EXECUTEберет токен выполнения из стека данных и выполняет соответствующую семантику. Слово COMPILE,(компиляция-запятая) берет токен выполнения из стека данных и добавляет соответствующую семантику к текущему определению.

Слово '(тик) принимает имя слова в качестве параметра и возвращает токен выполнения, связанный с этим словом в стеке данных. В состоянии интерпретации ' RANDOM-WORD EXECUTEэквивалентно RANDOM-WORD. [36]

Разбор слов и комментариев

Слова :(двоеточие), POSTPONE, '(галочка) являются примерами синтаксического анализа слов , которые берут аргументы из пользовательского устройства ввода, а не из стека данных. Другим примером является слово ((круглая скобка), которое считывает и игнорирует следующие слова до следующей правой скобки включительно и используется для размещения комментариев в определении через двоеточие. Аналогичным образом, слово \(обратная косая черта) используется для комментариев, продолжающихся до конца текущей строки. Для правильного анализа ((скобка) и \(обратная косая черта) должны быть отделены пробелом от следующего текста комментария.

Структура кода

В большинстве систем Форта тело определения кода состоит либо из машинного языка , либо из некоторой формы многопоточного кода . Исходный язык Forth, который следует неофициальному стандарту Fig (группа интересов Forth), представляет собой TIL (поточный интерпретирующий язык). Это также называется кодом с непрямой резьбой, но Форты с прямой резьбой и подпрограммами также стали популярными в наше время. Самые быстрые современные Форты, такие как SwiftForth, VFX Forth и iForth, компилируют Форт в собственный машинный код.

Объекты данных

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

VARIABLE
Называет неинициализированную ячейку памяти, состоящую из одной ячейки. Поведение экземпляра VARIABLEвозвращает свой адрес в стеке.
CONSTANT
Называет значение (указанное как аргумент для CONSTANT). Поведение экземпляра возвращает значение.
CREATE
Называет место; В этом месте может быть выделено пространство или оно может содержать строку или другое инициализированное значение. Поведение экземпляра возвращает адрес начала этого пространства.

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

Объекты данных, определяемые этими и подобными словами, являются глобальными по своей области действия. Функция, предоставляемая локальными переменными в других языках, обеспечивается стеком данных в Форте (хотя в Форте также есть настоящие локальные переменные). Стиль программирования Форт использует очень мало именованных объектов данных по сравнению с другими языками; обычно такие объекты данных используются для хранения данных, которые используются рядом слов или задач (в многозадачной реализации). [37]

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

Примеры

"Привет, мир!"

 : ПРИВЕТ ( -- ) CR « Привет, мир! » ;      
ПРИВЕТ, <cr>Привет, мир!

Слово CR(возврат каретки) приводит к отображению следующего вывода на новой строке. Слово синтаксического анализа ."(точечная кавычка) считывает строку, разделенную двойными кавычками, и добавляет код к текущему определению, чтобы проанализированная строка отображалась при выполнении. Символ пробела, отделяющий слово ."от строки, Hello, World!не включается в состав строки. Это нужно для того, чтобы парсер распознавал ."слово Форт.

Стандартная система Форта также является интерпретатором, и тот же результат можно получить, введя в консоль Форта следующий фрагмент кода:

 ЧР . ( Привет, мир!) 

.((dot-paren) — это непосредственное слово, которое анализирует строку, разделенную круглыми скобками, и отображает ее. Как и в случае со словом, ."символ пробела, отделяющий .(от, Hello, World!не является частью строки.

Слово CRставится перед текстом для печати. По соглашению интерпретатор Forth не начинает вывод с новой строки. Также по соглашению интерпретатор ожидает ввода в конце предыдущей строки после приглашения ok. В Форте нет подразумеваемого действия «очистки буфера» CR, как это иногда бывает в других языках программирования.

Смешение состояний компиляции и интерпретации

Вот определение слова EMIT-Q, которое при выполнении выдает один символ Q:

 : EMIT-Q 81 (значение ASCII для символа «Q») EMIT ;     

Это определение было написано для непосредственного использования значения ASCII символа Q(81). Текст в скобках является комментарием и игнорируется компилятором. Слово EMITпринимает значение из стека данных и отображает соответствующий символ.

В следующем переопределении EMIT-Qиспользуются слова [(левая скобка), ](правая скобка) CHARи LITERALдля временного переключения в состояние интерпретатора, вычисления значения ASCII символа Q, возврата в состояние компиляции и добавления вычисленного значения к текущему определению двоеточия:

 : EMIT-Q [ CHAR Q ] ЛИТЕРАЛ EMIT ;        

Слово синтаксического анализа CHARпринимает в качестве параметра слово, разделенное пробелами, и помещает значение его первого символа в стек данных. Это слово [CHAR]является непосредственной версией CHAR. Используя [CHAR], пример определения EMIT-Qможно переписать следующим образом:

 : EMIT-Q [CHAR] Q EMIT ; \ Выдайте одиночный символ «Q»      

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

Оба CHARи [CHAR]предопределены в ANS Forth. Использование IMMEDIATEи можно было бы определить следующим образом POSTPONE:[CHAR]

 : [CHAR] CHAR POSTPONE LITERAL ; НЕМЕДЛЕННЫЙ      

программа шифрования RC4

В 1987 году Рон Ривест разработал систему шифрования RC4 для RSA Data Security, Inc. Ее описание следующее:

У нас есть массив 256 байт, все разные. Каждый раз, когда массив используется, он изменяется путем замены двух байтов. Обмены контролируются счетчиками i и j , каждый из которых изначально равен 0. Чтобы получить новый i , добавьте 1. Чтобы получить новый j , добавьте байт массива в новый i . Поменяйте местами байты массива в i и j . Код представляет собой байт массива, представляющий собой сумму байтов массива в точках i и j . Это XOR с байтом открытого текста для шифрования или зашифрованного текста для расшифровки. Массив инициализируется, сначала устанавливая для него значения от 0 до 255. Затем последовательно просматривайте его, используя i и j , получая новый j , добавляя к нему байт массива в позиции i и ключевой байт, а также меняя местами байты массива в позициях i и j . Наконец, i и j устанавливаются в 0. Все сложения производятся по модулю 256.

В следующей версии стандартного Форта используются только слова Core и Core Extension.

0 значение ii 0 значение jj 0 значение KeyAddr 0 значение KeyLen create SArray 256 выделение \ состояние массива размером 256 байт : KeyArray KeyLen mod KeyAddr ;                   : get_byte + с@ ; : set_byte + c! ; : as_byte 255 и ; : reset_ij 0 TO ii 0 TO jj ; : i_update 1 + as_byte TO ii ; : j_update ii SArray get_byte + as_byte TO jj ; : swap_s_ij jj SArray get_byte ii SArray get_byte jj SArray set_byte ii SArray set_byte ;                                                 : rc4_init (KeyAddr KeyLen --) 256 мин TO KeyLen TO KeyAddr 256 0 DO i i SArray set_byte LOOP reset_ij BEGIN ii KeyArray get_byte jj + j_update swap_s_ij ii 255 < WHILE ii i_update REPEAT reset_ij ; : rc4_byte ii i_update jj j_update swap_s_ij ii SArray get_byte jj SArray get_byte + as_byte SArray get_byte xor ;                                                  

Это один из способов проверить код:

hex create AKey 61 c, 8 A c, 63 c, D2 c, FB c, : test cr 0 DO rc4_byte . ПЕТЛЯ кр ; AKey 5 rc4_init 2 C F9 4 C EE DC 5 тест \ вывод должен быть: F1 38 29 C9 DE                             

Реализации

Поскольку Форт прост в реализации и не имеет стандартной эталонной реализации, существует множество версий языка. Помимо поддержки стандартных разновидностей настольных компьютерных систем ( POSIX , Microsoft Windows , macOS ), многие из этих систем Forth также предназначены для различных встроенных систем . Здесь перечислены некоторые системы, соответствующие стандарту ANS Forth 1994 года.

Смотрите также

Примечания

  1. ^ Есть исключения, такие как preForth Ульриха Хоффмана [1] [2] и TCOM Тома Циммера.

Рекомендации

  1. ↑ Аб Махер, Джимми (28 октября 2014 г.). «Звездный полет». Цифровой антиквар . Проверено 29 апреля 2023 г.
  2. ^ Приложения НАСА на Форте (исходный сервер НАСА больше не работает, копия с archive.org)
  3. ^ «Процессоры RTX компании Intersil и программное обеспечение Forth контролировали успешную посадку Philae» (PDF) . Микропроцессор Инжиниринг Лимитед . 13 октября 2014 года . Проверено 29 апреля 2023 г.
  4. ^ «А вот и Philae! На базе RTX2010» . Музей «Хажина процессора» . 12 октября 2014 года . Проверено 29 апреля 2023 г.
  5. ^ «Приложения Форта, связанные с космосом» . Архивировано из оригинала 24 октября 2010 г. Проверено 4 сентября 2007 г.
  6. ^ abc Скорее, Элизабет Д.; Колберн, Дональд Р.; Мур, Чарльз Х. (1996) [1993]. «Эволюция Форта». В Бергине, Томас Дж.; Гибсон, Ричард Г. (ред.). История языков программирования---II . Ассоциация вычислительной техники. стр. 625–670. дои : 10.1145/234286.1057832. ISBN 0201895021.
  7. ^ «Демонстрационная программа Atari в магазине» . Атари Мания .
  8. ^ Мейнард, Дэвид С. «Дэвид Мейнард: художник-программист».
  9. ^ Джон Ромеро (23 сентября 2020 г.). «Искажение времени: Эпизод 9 - Стюарт Смит» (подкаст). Событие происходит в 29:02.
  10. ^ Эйкок, Джон (2023). Вспомнилась амнезия: реверс-инжиниринг цифрового артефакта. Книги Бергана. п. 79. ИСБН 978-1800738676.
  11. Шарп, Дуг (8 апреля 2023 г.). «Язык программирования FORTH (Вперед)».
  12. ^ «ФОРТ ПОЛУЧАЕТ СВОЮ СПЕЦИАЛЬНУЮ ГРУППУ ПО ИНТЕРЕСАМ» . Технический монитор . 6 февраля 1989 г.
  13. ^ Кэмпбелл и др., «Начало работы с Asyst 2.0», MacMillan Software Co., 1987 г.
  14. ^ Мур, Чарльз Х (1991). «Четвертый - Ранние годы». Архивировано из оригинала 15 июня 2006 г. Проверено 3 июня 2006 г.
  15. ^ «Спецификация ANS 1994, Приложение C («Перспектива»)» . taygeta.com .
  16. ^ "Четвертый язык", журнал BYTE , 5 (8), 1980.
  17. ^ М. Антон Эртл. «Четвертое генеалогическое древо и хронология».
  18. ^ Лутус, Пол (1982). «Руководство по языку GraFORTH». archive.org . Инсофт.
  19. ^ «Стандарт Форт-79» (PDF) . Проверено 29 апреля 2023 г.
  20. ^ "Стандарт Форт-83" .
  21. ^ «Языки программирования: Форт» . Технический комитет ANSI X3J14. 24 марта 1994 года . Проверено 3 июня 2006 г.
  22. ^ «Справочник по стандарту Forth (ANSI INCITS 215-1994)» (PDF) . Портативное программное обеспечение Quartus. 13 сентября 2005 г. Проверено 29 апреля 2023 г.
  23. ^ Клаунч, Карл (2 марта 2018 г.). «Восстановление исходного исходного кода FORTH на IBM 1130». спасение1130 . Проверено 30 июля 2018 г.
  24. ^ Броди, Лео (1987). Начиная вперед (2-е изд.). Прентис-Холл. ISBN 978-0-13-843079-5.
  25. ^ Броди 1987, с. 20
  26. ^ Броди 1987, с. 14
  27. ^ abcd Броди 1987, с. 16
  28. ^ Родригес, Брэд. «Создайте свой собственный ассемблер, часть 2: ассемблер 6809 Forth» . Проверено 29 апреля 2023 г.
  29. ^ Родригес, Брэд. «Многозадачность 8051 CamelForth» (PDF) . Проверено 29 апреля 2023 г.
  30. ^ Родригес, Брэд (июль – август 1995 г.). «ДВИЖЕНИЕ ВПЕРЕД, Часть 8: CamelForth для 6809» . Проверено 29 апреля 2023 г.
  31. ^ Шобридж, Питер (21 декабря 1998 г.). «Драйвер режима фоновой отладки Motorola для Windows NT». Архивировано из оригинала 6 июня 2007 г. Проверено 19 июня 2006 г.
  32. ^ Мартин, Гарольд М. (март 1991 г.). «Разработка привязанной модели Forth». Информационный бюллетень ACM Sigforth . АКМ Пресс. 2 (3): 17–19. дои : 10.1145/122089.122091. S2CID  26362015.
  33. ^ Слайды preForth Ульриха Хоффмана
  34. ^ ПреФорт Ульриха Хоффмана
  35. ^ Броди 1987, с. 273
  36. ^ Броди 1987, с. 199
  37. ^ «Под капотом». Броди, 1987 год . п. 241. Подводя итог, можно сказать, что существует три типа переменных: Системные переменные содержат значения, используемые всей системой Форта. Пользовательские переменные содержат значения, уникальные для каждой задачи, хотя определения могут использоваться всеми задачами в системе. Обычные переменные могут быть доступны либо в масштабе всей системы, либо только в рамках одной задачи, в зависимости от того, определены ли они внутри или внутри частной задачи.OPERATOR
  38. ^ Гарри, Дэвид; Ошио, Коичи; Фланаган, Стивен Д. (1987). «Программное обеспечение ASYST для научных вычислений». Наука . 236 (4805): 1128–32. Бибкод : 1987Sci...236.1128H. дои : 10.1126/science.236.4805.1128. JSTOR  1699106. PMID  17799670. S2CID  30463062.

Внешние ссылки