stringtranslate.com

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

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

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

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

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

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

Использует

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

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

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

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

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

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

Язык программирования Forth использовался при производстве фильма «Звездные войны: Эпизод IV – Новая надежда» . [ требуется ссылка ] В частности, он использовался для управления системой управления движением Dystraflex, созданной Джоном Дайкстрой и его командой в Industrial Light & Magic . Эта система сыграла важную роль в создании сложных и точных движений камеры, необходимых для сцен космических сражений и сцен бега по траншее на Звезде Смерти .

Система Dystraflex позволяла предварительно программировать движения камеры, которые затем можно было точно повторять для нескольких дублей. Это было важно для объединения кадров живого действия с модельными кадрами и другими визуальными эффектами. Forth был выбран за его эффективность и способность обрабатывать данные в реальном времени, необходимые для этих сложных задач.

История

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

Forth так назван, потому что в 1968 году «файл, содержащий интерпретатор, был помечен как FOURTH, для программного обеспечения 4-го (следующего) поколения, но операционная система IBM 1130 ограничила имена файлов пятью символами». [14] Мур рассматривал Forth как преемника языков программирования третьего поколения , работающих по принципу компиляции-связывания-выполнения , или программного обеспечения для оборудования «четвертого поколения».

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

Forth был популярен в начале 1980-х годов, [16] потому что он хорошо подходил для ограниченной памяти микрокомпьютеров . Простота реализации языка привела к появлению множества реализаций. [17] Домашний компьютер Jupiter ACE имеет Forth в своей ROM -резидентной операционной системе. 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 подчеркивает использование небольших, простых функций, называемых словами . Слова для более крупных задач вызывают множество меньших слов, каждое из которых выполняет отдельную подзадачу. Большая программа Forth представляет собой иерархию слов. Эти слова, являющиеся отдельными модулями, которые неявно взаимодействуют через механизм стека, могут быть прототипированы, построены и протестированы независимо. Самый высокий уровень кода Forth может напоминать описание приложения на английском языке. Forth был назван языком метаприложений : языком, который может использоваться для создания проблемно-ориентированных языков . [24]

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

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

 25 10 * 50 + CR . 300 ок        

Сначала в стек помещаются числа 25 и 10.


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

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


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

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

 : ЭТАЖ5 ( n - n' ) ДОП 6 < ЕСЛИ ОТБРОСИТЬ 5 ИНАЧЕ 1 - ТОГДА ;             

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

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

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

int floor5 ( int v ) { return ( v < 6 ) ? 5 : ( v - 1 ); }             

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

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

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

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

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

Удобства

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

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

 : X DUP 1+ . . ;      

скомпилирует слово Xи сделает имя доступным для поиска в словаре. При выполнении путем ввода 10 Xна консоли это выведет 11 10. [27]

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

 ... DUP 6 < ЕСЛИ ОТБРОСИТЬ 5 ИНАЧЕ 1 - ТО ...           

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

 ... ДВОЙНАЯ ЛИТ 6 < ?ВЕТВЬ 5 ОТКАЗ ЛИТ 5 ВЕТВЬ 3 ЛИТ 1 - ...               

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

В большинстве систем Forth тело определения кода состоит либо из машинного языка , либо из некоторой формы потокового кода . Исходный Forth, который следует неформальному стандарту FIG (Forth Interest Group), является TIL (Threaded Interpretive Language). Это также называется косвенно-потоковым кодом, но Forth с прямым потоком и потоком подпрограмм также стали популярными в наше время. Самые быстрые современные Forth, такие как SwiftForth, VFX Forth и iForth, компилируют Forth в машинный код.

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

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

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

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

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

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

Примеры

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

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

Слово (Carriage Return) приводит к отображению CRследующего вывода на новой строке. Слово анализа (dot-quote) считывает строку, разделенную двойными кавычками, и добавляет код к текущему определению, чтобы проанализированная строка отображалась при выполнении. Символ пробела, отделяющий слово от строки, не включается в строку. Он необходим для того, чтобы анализатор распознавал ее как слово Forth.CR."."Hello, World!."

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

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

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

Слово CRпредшествует тексту для печати. ​​По соглашению интерпретатор Forth не начинает вывод на новой строке. Также по соглашению интерпретатор ожидает ввода в конце предыдущей строки, после приглашения ok. В Forth нет подразумеваемого действия "очистить буфер" 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]можно было бы определить так:

 : [СИМВОЛ] СИМВОЛ ОТЛОЖИТЬ ЛИТЕРАЛ ; НЕМЕДЛЕННО      

Программа шифрования 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.

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

0 значение ii 0 значение jj 0 значение KeyAddr 0 значение KeyLen создать SArray 256 выделить \ состояние массива из 256 байт : KeyArray KeyLen mod KeyAddr ;                   : get_byte + c@ ; : 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 min 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 . LOOP cr ; AKey 5 rc4_init 2 C F9 4 C EE DC 5 test \ вывод должен быть: F1 38 29 C9 DE                             

Реализации

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

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

Примечания

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

Ссылки

  1. ^ ab Maher, Jimmy (28 октября 2014 г.). "Starflight". The Digital Antiquarian . Получено 29 апреля 2023 г.
  2. ^ Приложения NASA Forth (исходный сервер NASA больше не работает, копия с archive.org)
  3. ^ «Процессоры RTX компании Intersil и программное обеспечение Forth контролировали успешную посадку Philae» (PDF) . MicroProcessor Engineering Limited . 13 октября 2014 г. . Получено 29 апреля 2023 г. .
  4. ^ "Here comes Philae! Powered by an RTX2010". Музей CPU Shack . 12 октября 2014 г. Получено 29 апреля 2023 г.
  5. ^ "Space Related Applications of Forth". Архивировано из оригинала 2010-10-24 . Получено 2007-09-04 .
  6. ^ abc Rather, Elizabeth D.; Colburn, Donald R.; Moore, Charles H. (1996) [1993]. "Эволюция Forth". В Bergin, Thomas J.; Gibson, Richard G. (ред.). История языков программирования --- II . Association for Computing Machinery. стр. 625–670. doi :10.1145/234286.1057832. ISBN 0201895021.
  7. ^ "Программа демонстрации Atari в магазине". Atari Mania .
  8. ^ Мейнард, Дэвид С. «Дэвид Мейнард: Художник программного обеспечения».
  9. ^ Джон Ромеро (2020-09-23). ​​"Time Warp: Episode 9 - Stuart Smith" (Подкаст). Событие происходит в 29:02.
  10. ^ Эйкок, Джон (2023). Amnesia Remembered: Reverse Engineering a Digital Artifact. Berghahn Books. стр. 79. ISBN 978-1800738676.
  11. Шарп, Дуг (8 апреля 2023 г.). «Язык программирования FORTH (Going FORTH)».
  12. ^ «ФОРТ ОБРЕТАЕТ СВОЮ СОБСТВЕННУЮ ГРУППУ СПЕЦИАЛЬНЫХ ИНТЕРЕСОВ». Tech Monitor . 6 февраля 1989 г.
  13. ^ Кэмпбелл и др., «Запуск и работа с Asyst 2.0», MacMillan Software Co., 1987 г.
  14. ^ Мур, Чарльз Х. (1991). "Forth - The Early Years". Архивировано из оригинала 2006-06-15 . Получено 2006-06-03 .
  15. ^ "Спецификация ANS 1994, Приложение C ("Перспектива")". taygeta.com .
  16. ^ "Четвертый язык", журнал BYTE , 5 (8), 1980
  17. ^ М. Антон Эртл. «Генеалогическое древо и хронология рода Форт».
  18. ^ Лутус, Пол (1982). «Руководство по языку GraFORTH». archive.org . Инсофт.
  19. ^ "The Forth-79 Standard" (PDF) . Получено 29.04.2023 .
  20. ^ «Стандарт Форт-83».
  21. ^ "Языки программирования: Forth". Технический комитет ANSI X3J14. 24 марта 1994 г. Получено 03.06.2006 .
  22. ^ "Справочник по стандарту Forth (ANSI INCITS 215-1994)" (PDF) . Программное обеспечение Quartus Handheld. 13 сентября 2005 г. Получено 29 апреля 2023 г.
  23. ^ Claunch, Carl (2018-03-02). "Восстановление исходного кода FORTH на IBM 1130". rescue1130 . Получено 30 июля 2018 г.
  24. ^ Броди, Лео (1987). Starting Forth (2-е изд.). Prentice-Hall. ISBN 978-0-13-843079-5.
  25. ^ Броди 1987, стр. 20
  26. ^ Броди 1987, стр. 14
  27. ^ abcd Броди 1987, стр. 16
  28. ^ Родригес, Брэд. «Соберите свой собственный ассемблер, часть 2: ассемблер Forth 6809» . Получено 29 апреля 2023 г.
  29. ^ Родригес, Брэд. "Многозадачность 8051 CamelForth" (PDF) . Получено 29.04.2023 .
  30. Родригес, Брэд (июль–август 1995 г.). «ДВИЖЕНИЕ ВПЕРЕД, часть 8: CamelForth для 6809» . Получено 29 апреля 2023 г.
  31. ^ Shoebridge, Peter (1998-12-21). "Драйвер режима фоновой отладки Motorola для Windows NT". Архивировано из оригинала 2007-06-06 . Получено 2006-06-19 .
  32. ^ Мартин, Гарольд М. (март 1991 г.). «Разработка привязанной модели Форта». ACM Sigforth Newsletter . 2 (3). ACM Press: 17–19. doi :10.1145/122089.122091. S2CID  26362015.
  33. ^ Слайды Ульриха Хоффмана до Форта
  34. ^ Ульрих Хоффманн preForth
  35. ^ Броди 1987, стр. 273
  36. ^ Броди 1987, стр. 199
  37. ^ "Under The Hood". Brodie 1987. стр. 241. Подводя итог, можно сказать, что существует три вида переменных: Системные переменные содержат значения, используемые всей системой Forth. Пользовательские переменные содержат значения, которые являются уникальными для каждой задачи, хотя определения могут использоваться всеми задачами в системе. Обычные переменные могут быть доступны либо в масштабах всей системы, либо только в пределах одной задачи, в зависимости от того, определены ли они внутри или внутри частной задачи.OPERATOR
  38. ^ Хари, Дэвид; Ошио, Коичи; Фланаган, Стивен Д. (1987). «Программное обеспечение ASYST для научных вычислений». Science . 236 (4805): 1128–32. Bibcode :1987Sci...236.1128H. doi :10.1126/science.236.4805.1128. JSTOR  1699106. PMID  17799670. S2CID  30463062.

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