Это хорошая статья. Для получения дополнительной информации нажмите здесь.
Из Википедии, бесплатной энциклопедии
Перейти к навигации Перейти к поиску

Forth является обязательным стека на основе компьютерного языка программирования и среды , первоначально разработанный Чак Мур . Возможности языка включают структурированное программирование , рефлексию (способность исследовать и изменять структуру программы во время выполнения), конкатенативное программирование (функции составляются с сопоставлением) и расширяемость (программист может создавать новые команды). Название языка, хотя и не является аббревиатурой , иногда пишется заглавными буквами как FORTH, после того, как это было принято в более ранние годы.

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

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

Реализация бесплатного программного обеспечения Gforth активно поддерживается, как и несколько коммерчески поддерживаемых систем.

Обзор [ править ]

Forth - простой, но расширяемый язык; его модульность и расширяемость позволяют писать важные программы.

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

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

Использует [ редактировать ]

Forth успешно использовался в больших и сложных проектах, а приложения, разработанные компетентными, дисциплинированными профессионалами, за десятилетия использования доказали свою простоту поддержки на развивающихся аппаратных платформах. [6] Forth занимает свою нишу как в астрономических, так и в космических приложениях. [7] Forth все еще используется в некоторых встроенных системах из-за его переносимости , эффективного использования памяти, короткого времени разработки и высокой скорости выполнения. Он был эффективно реализован на современных компьютерах с сокращенным набором команд , и были созданы процессоры, использующие Forth в качестве машинного языка . [8] Другие варианты использования Forth включают Open Firmware. загрузочные ПЗУ, используемые Apple , IBM , Sun и OLPC XO-1 .

История [ править ]

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

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

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

MicroFORTH был разработан FORTH, Inc. для микропроцессоров Intel 8080 , Motorola 6800 , Zilog Z80 и RCA 1802 , начиная с 1976 года. MicroFORTH позже использовался любителями для создания систем Forth для других архитектур, таких как 6502 в 1978 году. Общая практика была кодифицирована в стандартах де-факто FORTH-79 [11] и FORTH-83 [12] в 1979 и 1983 годах, соответственно. Эти стандарты были унифицированы ANSI в 1994 году, обычно называемые ANS Forth. [13] [14]

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

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

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

Взгляд программиста [ править ]

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

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

 25  10  *  50  +  CR  .  300  ок

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


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

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


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

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

 :  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 )  {  возврат  ( v  <  6 )  ?  5  :  ( v  -  1 ); }

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

 :  FLOOR5  (п - п»)  1-  5  MAX  ;

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

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

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

Услуги [ править ]

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

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

 :  X  DUP  1+  .  .  ;

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

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

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

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

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

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

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

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

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

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

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

Структура языка [ править ]

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

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

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

Словарная статья [ править ]

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

  байт  структуры : флаг  \ 3-битные флаги + длина имени слова  массив символов:  имя  \ длина времени выполнения неизвестна во время компиляции  адрес:  предыдущее  \ поле ссылки, обратный ptr к предыдущему слову  адрес:  кодовое слово  \ ptr к коду для выполнения это слово  любой-массив:  поле параметра  \ неизвестная длина данных, слов или  кодов операций конечная структура  четвертого слова

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

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

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

Структура компилятора [ править ]

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

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

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

 ...  DUP  6  <  IF  DROP  5  ELSE  1  -  ТО  ...

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

 ...  DUP  LIT  6  <  ? ФИЛИАЛ  5  DROP  LIT  5  ФИЛИАЛ  3  LIT  1  -  ...

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

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

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

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

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

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

Немедленные слова [ править ]

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

Неназванные слова и жетоны казни [ править ]

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

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

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

Разбор слов и комментариев [ править ]

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

Структура кода [ править ]

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

Объекты данных [ править ]

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

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

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

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

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

Программирование [ править ]

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

Во время разработки программист использует интерпретатор в режиме REPL для выполнения и тестирования каждого маленького фрагмента по мере его разработки. Поэтому большинство программистов Forth отстаивают свободный нисходящий дизайн и восходящую разработку с непрерывным тестированием и интеграцией. [33]

Дизайн сверху вниз обычно представляет собой разделение программы на «словари», которые затем используются в качестве высокоуровневых наборов инструментов для написания окончательной программы. Хорошо спроектированная программа Forth читается как естественный язык и реализует не только одно решение, но и наборы инструментов для атаки связанных проблем. [34]

Примеры кода [ править ]

"Привет, мир!" [ редактировать ]

Возможная реализация:

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

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

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

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

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

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

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

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

 :  EMIT-Q  81  (значение ASCII для символа «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  ;  \ Вывести одиночный символ 'Q'

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

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

 :  [ЗНАК]  СИМ  POSTPONE  буквального  ;  НЕМЕДЛЕННЫЙ

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

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

гекс создать  AKEY  61  с,  8 A  с,  63  с,  D2  с,  FB  с, :  тест  CR  0  DO  rc4_byte  .  LOOP  cr  ; AKey  5  rc4_init 2 C  F9  4 C  EE  DC  5  test  \ output должен быть: F1 38 29 C9 DE

Реализации [ править ]

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

  • Gforth , переносимая реализация ANS Forth от проекта GNU
  • SwiftForth , рабочий стол с собственным кодом и встроенные форты от Forth, Inc.
  • VFX Forth, сильно оптимизирующий собственный код Forth
  • Win32Forth , ориентированный на Windows, первоначально написанный в 1994-95 годах и постоянно обновляемый
  • Откройте прошивку , загрузчик и стандарт прошивки на основе ANS Forth
  • pForth , переносимый Forth, написанный на C
  • SP-Forth , реализация ANS Forth от Russian Forth Interest Group (RuFIG)
  • Mecrisp-Stellaris , популярный встроенный Forth с введением здесь hackaday-intro с простой демонстрацией на рабочем столе здесь с использованием docker demo

См. Также [ править ]

  • colorForth , более поздний вариант Forth от Чака Мура
  • RTX2010 , процессор, который изначально работает с Forth

Ссылки [ править ]

  1. ^ Приложения Форта НАСА (исходный сервер НАСА больше не работает, скопируйте с archive.org)
  2. ^ «Процессоры Intersil RTX и программное обеспечение Forth контролировали успешную посадку Philae» (PDF) . MicroProcessor Engineering Limited . 13 октября 2014 г.
  3. ^ «А вот и Philae! Работает на RTX2010» . Музей CPU Shack . 12 октября 2014 . Проверено 23 мая 2017 года .
  4. Махер, Джимми (28 октября 2014 г.). «Звездный полет» . Цифровой антиквар . Проверено 23 мая 2017 года .
  5. ^ Броди, Лео. «Стартовый форт» . Forth точка com . Forth, Inc . Проверено 14 июля 2020 года .
  6. ^ "Forth Истории успеха" . Проверено 9 июня 2006 .
  7. ^ "Космические приложения Форта" . Архивировано из оригинала на 2010-10-24 . Проверено 4 сентября 2007 .
  8. ^ "Четвертая страница фишек" . Проверено 9 июня 2006 .
  9. ^ a b c К. Х. Мур; ЭД Скорее; Д. Р. Колберн (март 1993 г.). «Эволюция форта» . Уведомления ACM SIGPLAN . ACM SIGPLAN История языков программирования. 28 .
  10. ^ Мур, Чарльз H (1991). «Форт - Ранние годы» . Архивировано из оригинала на 2006-06-15 . Проверено 3 июня 2006 .
  11. ^ "Стандарт Forth-79" (PDF) . Архивировано (PDF) из оригинала 12.04.2019.
  12. ^ "Стандарт Forth-83" .
  13. ^ "Языки программирования: Форт" . Технический комитет ANSI X3J14. 24 марта 1994 . Проверено 3 июня 2006 .
  14. ^ "Стандартный Forth (ANSI INCITS 215-1994) Справочник" (PDF) . Портативное программное обеспечение Quartus. 13 сентября 2005 . Проверено 14 апреля 2013 .
  15. ^ "The Forth Language" , журнал BYTE , 5 (8), 1980
  16. ^ М. Антон Эртл. «Четвертая родословная и хронология» .
  17. ^ Lutus, Paul (1982). «Языковое руководство GraFORTH» . archive.org . Insoft.
  18. ^ Campbellдр "и работает с Asyst 2.0", Макмиллан Software Co., 1987
  19. ^ Клаунч, Карл (2018-03-02). «Восстановление исходного исходного кода FORTH на IBM 1130» . спасение1130 . Проверено 30 июля 2018 года .
  20. Перейти ↑ Brodie, Leo (1987). Начиная с четвертого (второе изд.). Прентис-Холл. п. 20. ISBN 978-0-13-843079-5.
  21. Перейти ↑ Brodie, Leo (1987). Начиная с четвертого (второе изд.). Прентис-Холл. п. 14. ISBN 978-0-13-843079-5.
  22. ^ a b c d Броди, Лео (1987). Начиная с четвертого (второе изд.). Прентис-Холл. п. 16. ISBN 978-0-13-843079-5.
  23. ^ Родригес, Брэд. "ПОБЕДИТЕЛЬ" . Архивировано из оригинала на 2006-06-23 . Проверено 19 июня 2006 .
  24. ^ Родригес, Брэд. "МНОГОЗАДАЧНАЯ 8051 CAMELFORTH" (PDF) . Архивировано из оригинального (PDF) 22 июня 2006 года . Проверено 19 июня 2006 .
  25. Родригес, Брэд (июль 1995 г.). «ДВИЖЕНИЕ ВПЕРЕД» . Архивировано из оригинала на 2006-06-23 . Проверено 19 июня 2006 .
  26. ^ Шобридж, Питер (1998-12-21). «Драйвер режима отладки Motorola в фоновом режиме для Windows NT» . Архивировано из оригинала на 2007-06-06 . Проверено 19 июня 2006 .
  27. ^ Мартин, Гарольд М. (март 1991). «Разработка привязанной модели Форта». Информационный бюллетень ACM Sigforth . ACM Press. 2 (3): 17–19. DOI : 10.1145 / 122089.122091 . S2CID 26362015 . 
  28. Перейти ↑ Brodie, Leo (1987). Начиная с четвертого (второе изд.). Прентис-Холл. С. 200–202. ISBN 978-0-13-843079-5.
  29. Перейти ↑ Brodie, Leo (1987). Начиная с четвертого (второе изд.). Прентис-Холл. п. 273. ISBN. 978-0-13-843079-5.
  30. Перейти ↑ Brodie, Leo (1987). Начиная с четвертого (второе изд.). Прентис-Холл. п. 199. ISBN 978-0-13-843079-5.
  31. ^ Эртль, М. Антон; Грегг, Дэвид. «Проблемы реализации суперинструкций в Gforth» (PDF) . Архивировано из оригинального (PDF) 25 июня 2006 года . Проверено 19 июня 2006 .
  32. Перейти ↑ Brodie, Leo (1987). "Под капотом". Начиная с Форта (2-е изд.). Прентис-Холл. п. 241. ISBN. 978-0-13-843079-5. Подводя итог, можно сказать, что существует три типа переменных: Системные переменные содержат значения, используемые всей системой Forth. Пользовательские переменные содержат значения, уникальные для каждой задачи, хотя определения могут использоваться всеми задачами в системе. Обычные переменные могут быть доступны либо для всей системы, либо только в рамках одной задачи, в зависимости от того, определены ли они OPERATORв частной задаче или внутри нее.
  33. Перейти ↑ Brodie, Leo (1984). Думая дальше . Прентис-Холл. ISBN 978-0-13-917568-8.
  34. ^ В классическом примере со стиральной машиной описывается процесс создания словаря для естественного представления предметной области в удобочитаемой форме.

Дальнейшее чтение [ править ]

  • Бьянкуцци, Федерико; Шейн Уорден (2009). «Глава четвертая [Разговор с Чаком Муром]». Идеи программирования, разговоры с создателями основных языков программирования . О'РЕЙЛИ. ISBN 978-0-596-51517-1.
  • Броди, Лео (2007). Марсель Хендрикс (ред.). Начиная с четвертого . Марлин Оуверсон (Интернет-ред.). ВПЕРЕД, Inc . Проверено 29 сентября 2007 .
  • Броди, Лео (2004). Бернд Пайсан (ред.). Мыслить дальше (Электронная книга в формате PDF) . ISBN 978-0-9764587-0-8. Проверено 15 сентября 2008 .
  • Конклин, Эдвард К .; Элизабет Д. Скорее; и другие. (8 сентября 2007 г.). Forth Programmer's Handbook (мягкая обложка) (3-е изд.). BookSurge Publishing. п. 274. ISBN 978-1-4196-7549-2.
  • Скорее, Элизабет Д. (2000). Четвертые методы нанесения (спираль) . Forth Inc. стр. 158. ISBN 978-0-9662156-1-8.
  • Пелц, Стивен Ф. (2005). Программирование форта (спиральная привязка) . ООО «Микропроцессор Инжиниринг» с. 188.
  • Kelly, Mahlon G .; Николас Спайс (1986). FORTH: Текст и справочная информация . Прентис-Холл. ISBN 978-0-13-326331-2.
  • Купман-младший, Филип Дж. (1989). Стековые компьютеры: Новая волна (в твердом переплете) . Эллис Хорвуд Лимитед. ISBN 978-0-7458-0418-7.
  • Понтан, Дик (1987). Объектно-ориентированный Форт: реализация структур данных . Харкорт Брейс Йованович. ISBN 978-0-12-563570-7.
  • Пейн, Уильям (19 декабря 1990 г.). Встроенный контроллер Forth для семейства 8051 . Эльзевир. п. 528. ISBN 978-0-12-547570-9.
  • Уинфилд, Алан (1983). Полный Форт . Джон Вили. ISBN 978-0471882350.
  • Бальони, Джио Федерико (1983). Четверть согласно VIC20 e CBM64 . Джексон. ISBN 978-88-7056-141-8.