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

Четвертый
Парадигма Процедурный , стек-ориентированный , рефлексивный , конкатенативный
Разработано Чарльз Х. Мур
Впервые появился 1970 ; 51 год назад ( 1970 )
Печатная дисциплина Бестиповый
Расширения имени файла .fs, .fth, .forth
Основные реализации
SwiftForth (Forth, Inc.)
Gforth (Проект GNU)
VFX Forth (Разработка микропроцессоров)
Под влиянием
Большие системы Берроуза , Лисп , APL
Под влиянием
Фактор , Радость , PostScript , РПЛ , REBOL

Forth - это процедурный , ориентированный на стек язык программирования и интерактивная среда, разработанный Чарльзом Х. «Чаком» Муром и впервые использованный другими программистами в 1970 году. Название языка, хотя и не является аббревиатурой , в первые годы его существования часто писалось заглавными буквами. как FORTH , но Forth встречается чаще.

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

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

Forth используется в Open Firmware загрузчиком , в космических приложениях , таких как космический корабль Philae , и в других встраиваемых систем , которые включают взаимодействие с аппаратными средствами. Относительная простота создания базовой системы Forth привела к появлению множества личных и проприетарных вариантов, таких как пользовательский Forth, использованный для реализации бестселлера 1986 года Starflight от Electronic Arts . Реализация бесплатного программного обеспечения Gforth активно поддерживается, как и несколько коммерчески поддерживаемых систем.

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

Использует

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

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

Для демонстрации возможностей компьютеров Atari 400 и 800 в универмагах компания Atari, Inc. использовала тщательно разработанную анимационную демонстрацию, написанную на языке Forth . Две домашние компьютерные игры от Electronic Arts , изданные в 1980-х, были написаны на Forth: Worms? (1983) и Starflight (1986). Canon Cat (1987) использует Forth для его системного программирования.

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

История

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

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

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

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

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

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

Обзор

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

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

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

 25 10 * 50 + CR .
 300 ok
Stack1.svg

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

Forthstack1 5.svg


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

Forthstack2.svg

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

Forthstack3.svg


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

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

 : 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Слово эквивалентно этой функции , написанной на языке программирования С помощью тройной оператор «?:»

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

Эта функция более лаконично записана как:

 : FLOOR5 ( n -- n' ) 1- 5 MAX ;

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

 1 FLOOR5 CR .
 5 ok
 8 FLOOR5 CR .
 7 ok

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

Удобства

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

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

 : X DUP 1+ . . ;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Словарная статья

Точный формат словарной статьи не предписан, и реализации могут отличаться. Однако некоторые компоненты присутствуют почти всегда, хотя их точный размер и порядок могут отличаться. Словарная статья, описанная как структура, может выглядеть так:

 structure
   byte:       flag           \ length of word's name
   char-array: name           \ name's runtime length isn't known at compile time
   address:    previous       \ link field, backward ptr to previous word
   address:    codeword       \ ptr to the code to execute this word
   any-array:  parameterfield \ unknown length of data, words, or opcodes
 end-structure forthword

Поле имени начинается с префикса, указывающего длину имени слова. Затем за префиксом следует символьное представление имени слова. В зависимости от конкретной реализации Forth может быть один или несколько байтов NUL ('\ 0') для выравнивания.

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

Указатель поля кода будет либо адресом слова, которое будет выполнять код или данные в поле параметра, либо началом машинного кода, который процессор будет выполнять напрямую. Для слов, определенных двоеточием, указатель поля кода указывает на слово, которое сохранит текущий указатель инструкции Forth (IP) в стеке возврата и загрузит IP с новым адресом, с которого будет продолжено выполнение слов. Это то же самое, что и инструкции вызова / возврата процессора.

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

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

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

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

 ... DUP 6 < IF DROP 5 ELSE 1 - THEN ...

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

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

Цифры после BRANCHпредставляют собой относительные адреса перехода. LITэто простое слово для помещения "буквального" числа в стек данных.

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

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

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

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

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

Немедленные слова

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Примеры

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

 : HELLO  ( -- )  CR ." Hello, World!" ;
HELLO <cr>
Hello, World!

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

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

 CR .( Hello, World!)

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

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

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

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

 : EMIT-Q   81 ( the ASCII value for the character 'Q' ) EMIT ;

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

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

 : EMIT-Q   [ CHAR Q ]  LITERAL  EMIT ;

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

 : EMIT-Q   [CHAR] Q  EMIT ; \ Emit the single character 'Q'

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

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

 : [CHAR]   CHAR  POSTPONE LITERAL ; IMMEDIATE

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

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

0 value ii        0 value jj
0 value KeyAddr   0 value KeyLen
create SArray   256 allot   \ state array of 256 bytes
: KeyArray      KeyLen mod   KeyAddr ;

: get_byte      + c@ ;
: set_byte      + c! ;
: as_byte       255 and ;
: 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, 8A c, 63 c, D2 c, FB c,
: test   cr   0 DO  rc4_byte . LOOP  cr ;
AKey 5 rc4_init
2C F9 4C EE DC  5 test   \ output should be: F1 38 29 C9 DE

Реализации

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

  • Gforth , переносимая реализация ANS Forth от проекта GNU
  • Swift Forth, реализация для генерации машинного кода от Forth, Inc.
  • VFX Forth, оптимизация нативного кода Forth
  • Откройте прошивку , загрузчик и стандарт прошивки на основе ANS Forth
  • pForth , переносимый Forth, написанный на C
  • SP-Forth , реализация ANS Forth от Russian Forth Interest Group (RuFIG)

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

  • RTX2010 , процессор, который изначально запускает Forth

использованная литература

дальнейшее чтение