Форт (язык программирования)
Парадигма | конкатенативный ( на основе стека ), процедурный , рефлексивный |
---|---|
Разработано | Чарльз Х. Мур |
Впервые появился | 1970 год |
Дисциплина набора текста | Бестиповый |
Расширения имен файлов | .fs, .fth, .4th, .f, .forth [ нужна ссылка ] |
Веб-сайт | четвертый стандарт |
Основные реализации | |
SwiftForth (Форт, Инк.) Гфорт (проект GNU) VFX Форт (микропроцессорная инженерия) | |
Под влиянием | |
Биткойн-скрипт , Фактор , Джой , РПЛ , Ребол , СТОИК |
Форт — это стек-ориентированный язык программирования и интерактивная интегрированная среда разработки, разработанный Чарльзом Х. «Чаком» Муром и впервые использованный другими программистами в 1970 году. Хотя это не аббревиатура , название языка в первые годы своего существования часто писалось заглавными буквами. как ФОРТ . Реализации FORTH-79 и FORTH-83, которые не были написаны Муром, стали стандартами де-факто , а официальный технический стандарт языка был опубликован в 1994 году как ANS Forth. До и после ANS Forth существовал широкий спектр производных Форта. бесплатного программного обеспечения с открытым исходным кодом Реализация Gforth активно поддерживается, как и несколько коммерчески поддерживаемых систем.
Форт обычно сочетает в себе компилятор со встроенной командной оболочкой. [а] где пользователь взаимодействует с помощью подпрограмм, называемых словами . Слова можно определять, тестировать, переопределять и отлаживать без перекомпиляции или перезапуска всей программы. Все синтаксические элементы, включая переменные, операторы и поток управления, определяются как слова. Стек стилю используется для передачи параметров между словами, что приводит к обратной польской нотации .
На протяжении большей части существования Форта стандартным методом была компиляция в многопоточный код , который можно интерпретировать быстрее, чем байт-код . Одним из первых преимуществ Форта был размер: вся среда разработки, включая компилятор, редактор и пользовательские программы, могла поместиться в памяти 8-битной или аналогичной ограниченной системы. Существуют современные реализации, которые больше не ограничены пространством и генерируют оптимизированный машинный код , как и компиляторы других языков. Относительная простота создания базовой системы Форта привела к появлению множества личных и частных вариантов, таких как специальный Форт, используемый для реализации бестселлера 1986 года видеоигры Starflight от Electronic Arts . [1]
Форт используется в Open Firmware загрузчике , в космических полетов . приложениях [2] такие как космический корабль Филе , [3] [4] и в других встроенных системах, которые требуют взаимодействия с аппаратным обеспечением.
Мур разработал серию микропроцессоров для прямого выполнения скомпилированного Forth-подобного кода и экспериментировал с меньшими языками, основанными на концепциях Forth, включая cmForth и colorForth . Большинство этих языков были разработаны для поддержки собственных проектов Мура, таких как проектирование микросхем.
Использование
[ редактировать ]Форт занимает свою нишу в астрономических и космических приложениях. [5] а также история встроенных систем . с открытой прошивкой, Загрузочные ПЗУ используемые Apple , IBM , Sun и OLPC XO-1, содержат среду Forth.
Форт часто использовался для создания нового оборудования. Forth был первым резидентным программным обеспечением на новом чипе Intel 8086 в 1978 году, а MacFORTH был первой резидентной системой разработки для Macintosh 128K в 1984 году. [6]
Atari, Inc. использовала тщательно продуманную анимированную демонстрацию, написанную на Форте, для демонстрации возможностей 8-битных компьютеров Atari в универмагах. [7] Electronic Arts опубликовала в 1980-х годах несколько видеоигр, написанных на Форте, включая Worms? (1983), [8] Приключенческий конструктор (1984), [9] Амнезия (1986), [10] Звездный полет (1986), [1] и Лорды завоеваний (1986). Игра по программированию роботов ChipWits (1984) была написана на MacFORTH. [11]
RapidFile Эштона-Тейта (1986), программа базы данных в виде плоских файлов, и VP-Planner. [12] от Paperback Software International Программа для работы с электронными таблицами (1983), конкурирующая с Lotus 1-2-3 , была написана на Форте.
Canon Cat (1987) использует Форт для системного программирования.
Rockwell производила однокристальные микрокомпьютеры с резидентным ядром Forth: R65F11 и R65F12. ASYST был расширением Форта для измерения и управления на ПК. [13]
Язык программирования Форт использовался при создании фильма «Звёздные войны: Эпизод IV – Новая надежда» . [ нужна ссылка ] В частности, он использовался для управления системой управления движением Dystraflex, которую создали Джон Дайкстра и его команда в Industrial Light & Magic . Эта система сыграла важную роль в создании сложных и точных движений камеры, необходимых для сцен космических сражений и сцен бега по траншеям на Звезде Смерти .
Система Dystraflex позволяла заранее программировать движения камеры, которые затем можно было точно повторять для нескольких дублей. Это имело решающее значение для объединения кадров живых выступлений с кадрами моделей и другими визуальными эффектами. Форт был выбран из-за его эффективности и способности выполнять обработку в реальном времени, необходимую для решения этих сложных задач.
История
[ редактировать ]Форт произошел от персональной системы программирования Чарльза Х. Мура , которая постоянно развивалась с 1968 года. [6] Впервые Форт познакомился с другими программистами в начале 1970-х годов, начиная с Элизабет Разер США из Национальной радиоастрономической обсерватории (NRAO). [6] После работы в NRAO Чарльз Мур и Элизабет Разер в 1973 году основали компанию FORTH, Inc., которая в течение следующего десятилетия доработала и перенесла системы Forth на десятки других платформ.
Форт назван так потому, что в 1968 году «файл, содержащий интерпретатор, был помечен как ЧЕТВЕРТЫЙ для программного обеспечения 4-го (следующего) поколения, но операционная система IBM 1130 ограничивала имена файлов пятью символами». [14] Мур видел в Форте преемника языков программирования третьего поколения «компилировать-связывать-идти » или программного обеспечения для аппаратного обеспечения «четвертого поколения».
MicroFORTH компании FORTH, Inc. был разработан для микропроцессоров Intel 8080 , Motorola 6800 , Zilog Z80 и RCA 1802 , начиная с 1976 года. Позже MicroFORTH использовался любителями для создания систем Forth для других архитектур, таких как 6502 в 1978 году. Четвертая группа интересов была создана в 1978 году. [15] Она продвигала и распространяла собственную версию языка Fig-Forth для большинства моделей домашних компьютеров.
Форт был популярен в начале 1980-х годов. [16] потому что он хорошо подходил для ограниченной памяти микрокомпьютеров . Простота реализации языка привела к множеству реализаций. [17] Домашний компьютер Jupiter ACE имеет Forth в своей резидентной в ПЗУ операционной системе. Insoft GraFORTH — это версия Forth с графическими расширениями для Apple II. [18]
Общая практика была закреплена в стандартах де-факто FORTH-79. [19] и ФОРТ-83 [20] в 1979 и 1983 годах соответственно. Эти стандарты были унифицированы ANSI в 1994 году и обычно называются ANS Forth. [21] [22]
По состоянию на 2018 год исходный код исходной версии FORTH 1130 был восстановлен и теперь обновляется для работы на восстановленной или эмулируемой системе 1130. [23]
Обзор
[ редактировать ]В Форте особое внимание уделяется использованию небольших простых функций, называемых словами . Слова для более крупных задач требуют множества более мелких слов, каждое из которых выполняет отдельную подзадачу. Большая программа на Форте представляет собой иерархию слов. Эти слова, представляющие собой отдельные модули, которые неявно взаимодействуют через механизм стека, могут быть прототипированы, построены и протестированы независимо. Самый высокий уровень кода Forth может напоминать англоязычное описание приложения. Форт называют языком метаприложений : языком, который можно использовать для создания проблемно-ориентированных языков . [24]
Форт опирается на явное использование стека данных и обратную польскую нотацию , которая обычно используется в калькуляторах Hewlett-Packard . В RPN оператор помещается после своих операндов, в отличие от более распространенной инфиксной записи , где оператор помещается между операндами. Постфиксная нотация упрощает синтаксический анализ и расширение языка; Гибкость Форта делает статическую грамматику BNF неприемлемой, и у него нет монолитного компилятора. Расширение компилятора требует только написания нового слова вместо изменения грамматики и изменения базовой реализации.
Используя РПН, можно получить результат математического выражения (25 * 10 + 50)
Сюда:
25 10 * 50 + CR .
300 ok
Сначала в стек кладутся числа 25 и 10.
Слово *
берет два верхних числа из стека, умножает их и помещает произведение обратно в стек.
Затем число 50 помещается в стек.
Слово +
добавляет два верхних значения, помещая сумму. CR
( возврат каретки ) начинает вывод с новой строки. Окончательно, .
печатает результат. Поскольку все завершилось успешно, система Форта печатает OK
. [25]
Даже структурные особенности Форта основаны на стеках. Например:
: FLOOR5 ( n -- n' ) DUP 6 < IF DROP 5 ELSE 1 - THEN ;
Двоеточие указывает на начало нового определения, в данном случае нового слова (опять же, слово — это термин, используемый для подпрограммы), называемого FLOOR5
. Текст в круглых скобках представляет собой комментарий, сообщающий, что это слово ожидает число в стеке и вернет возможно измененное число (в стеке).
В подпрограмме используются следующие команды: DUP
дублирует число в стеке; 6
помещает 6 на вершину стека; <
сравнивает два верхних числа в стеке (6 и DUP
ed input) и заменяет их значением true или false; IF
принимает значение «истина» или «ложь» и выбирает выполнение команд сразу после него или переход к ELSE
; DROP
отбрасывает значение в стеке; 5
помещает 5 на вершину стека; и THEN
завершает условное предложение.
The FLOOR5
слово эквивалентно этой функции, написанной на языке программирования C с использованием условного оператора '?:'
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
перемещает вывод на новую строку (опять же, это сделано только для удобства чтения). Наконец, звонок в .
выдает результат и печатает.
Удобства
[ редактировать ]Форта Грамматика не имеет официальной спецификации. Вместо этого он определяется простым алгоритмом. Интерпретатор считывает строку ввода с пользовательского устройства ввода, которая затем анализируется на наличие слова, используя пробелы в качестве разделителя ; некоторые системы распознают дополнительные символы пробелов . Когда переводчик находит слово, он ищет его в словаре . Если слово найдено, интерпретатор выполняет код, связанный с этим словом, а затем возвращается для анализа остальной части входного потока. Если слово не найдено, оно считается числом и предпринимается попытка преобразовать его в число и поместить в стек; в случае успеха интерпретатор продолжает анализ входного потока. В противном случае, если и поиск, и преобразование чисел завершаются неудачей, интерпретатор печатает слово, за которым следует сообщение об ошибке, указывающее, что слово не распознано, сбрасывает входной поток и ожидает ввода нового пользователя. [26]
Определение нового слова начинают со слова :
(двоеточие) и заканчивается словом ;
(точка с запятой). Например,
: X DUP 1+ . . ;
составлю слово X
и делает имя доступным для поиска в словаре. При выполнении путем ввода 10 X
на консоли это будет напечатано 11 10
. [27]
Большинство систем Форта включают в себя ассемблер для записи слов с использованием возможностей процессора. Ассемблеры Форта часто используют обратный польский синтаксис, в котором параметры инструкции предшествуют инструкции. Типичный обратный польский ассемблер подготавливает операнды в стеке, а мнемоника копирует всю инструкцию в память на последнем этапе. Ассемблер Форта по своей природе является ассемблером макросов, поэтому легко определить псевдоним для регистров в соответствии с их ролью в системе Форт: например, «dsp» для регистра, используемого в качестве указателя стека данных. [28]
Операционная система, файлы и многозадачность
[ редактировать ]Большинство систем Forth работают под управлением операционной системы хоста, такой как Microsoft Windows , Linux или версия Unix , и используют файловую систему операционной системы хоста для исходных файлов и файлов данных; Стандарт ANSI Forth описывает слова, используемые для ввода-вывода. Все современные системы Forth используют в качестве исходного кода обычные текстовые файлы, даже если они встроены. Встроенная система с резидентным компилятором получает исходный код по последовательному каналу.
Классические системы Forth традиционно не используют ни операционную систему , ни файловую систему . Вместо хранения кода в файлах исходный код хранится в дисковых блоках, записанных по адресам физических дисков. Слово BLOCK
используется для перевода номера блока дискового пространства размером 1 КБ в адрес буфера, содержащего данные, который автоматически управляется системой Forth. Использование блоков стало редким явлением с середины 1990-х годов. В размещенной системе эти блоки в любом случае также размещаются в обычном файле.
Многозадачность , чаще всего совместное циклическое планирование , обычно доступна (хотя слова и поддержка многозадачности не охватываются стандартом ANSI Forth). Слово PAUSE
используется для сохранения контекста выполнения текущей задачи, поиска следующей задачи и восстановления ее контекста выполнения. Каждая задача имеет свои собственные стеки, частные копии некоторых управляющих переменных и рабочую область. Обмен задачами прост и эффективен; в результате многозадачность Форта доступна даже на очень простых микроконтроллерах , таких как Intel 8051 , Atmel AVR и TI MSP430 . [29]
Другие нестандартные возможности включают в себя механизм вызова хостовой ОС или оконных систем , а многие из них предоставляют расширения, использующие планирование, предоставляемое операционной системой. Обычно они имеют более крупный и отличающийся от отдельного словаря Форта набор слов. PAUSE
слово для создания, приостановки, уничтожения и изменения приоритета задачи.
Самокомпиляция и кросс-компиляция
[ редактировать ]Полнофункциональная система Forth со всем исходным кодом скомпилируется сама. Этот метод программисты Forth обычно называют мета-компиляцией или самостоятельным размещением (хотя этот термин не совсем соответствует мета-компиляции в том смысле, в котором он обычно определяется). Обычный метод — переопределить несколько слов, которые помещают скомпилированные биты в память. В словах компилятора используются специально названные версии операций выборки и сохранения, которые можно перенаправить в буферную область памяти. Буферная область имитирует или осуществляет доступ к области памяти, начинающейся с адреса, отличного от адреса буфера кода. Такие компиляторы определяют слова для доступа как к памяти целевого компьютера, так и к памяти главного (компилирующего) компьютера. [30]
После того, как операции выборки и сохранения переопределены для пространства кода, компилятор, ассемблер и т. д. перекомпилируются с использованием новых определений выборки и сохранения. Это эффективно повторно использует весь код компилятора и интерпретатора. Затем код системы Форт компилируется, но эта версия сохраняется в буфере. Буфер в памяти записывается на диск, и предусмотрены способы его временной загрузки в память для тестирования. Когда новая версия работает, она записывается поверх предыдущей версии.
Существуют многочисленные варианты таких компиляторов для разных сред. Для встроенных систем код вместо этого может быть записан на другой компьютер (метод, известный как кросс-компиляция) , через последовательный порт или даже один бит TTL , сохраняя при этом имена слов и другие неисполняемые части словаря в исходной компиляции. компьютер. Минимальными определениями для такого компилятора Форта являются слова, которые извлекают и сохраняют байт, и слово, которое командует выполнить слово Форта. Часто наиболее трудоемкой частью написания удаленного порта является построение исходной программы для реализации выборки, сохранения и выполнения, но многие современные микропроцессоры имеют встроенные функции отладки (например, Motorola CPU32 ), которые устраняют эту задачу. [31]
Структура языка
[ редактировать ]Базовая структура данных Форта — это «словарь», который отображает «слова» в исполняемый код или именованные структуры данных. Словарь размещается в памяти в виде дерева связанных списков со ссылками, идущими от самого последнего (самого последнего) определенного слова к самому старому, пока не будет найдено контрольное значение , обычно это NULL-указатель. Переключение контекста приводит к запуску поиска по списку на другом листе. Поиск по связанному списку продолжается по мере того, как ветвь сливается с основным стволом и в конечном итоге возвращается к дозорному корню. Словарей может быть несколько. В редких случаях, таких как метакомпиляция, словарь может быть изолированным и автономным. Эффект напоминает эффект вложения пространств имен и может перегружать ключевые слова в зависимости от контекста.
Определенное слово обычно состоит из заголовка и тела , причем заголовок состоит из поля имени (NF) и поля ссылки (LF), а тело состоит из поля кода (CF) и поля параметра (PF).
Голова и тело словарной статьи рассматриваются отдельно, поскольку они могут не быть смежными. Например, когда программа на Форте перекомпилируется для новой платформы, голова может оставаться на компилирующем компьютере, а тело переходит на новую платформу. В некоторых средах (например, во встроенных системах ) головки занимают память без необходимости. Однако некоторые кросс-компиляторы могут помещать головы в цель, если ожидается, что сама цель будет поддерживать интерактивный Форт. [32]
Точный формат словарной статьи не предписан, и реализации различаются.
Структура компилятора
[ редактировать ]Сам компилятор не является монолитной программой. Он состоит из слов Форта, видимых системе и доступных для использования программистом. Это позволяет программисту изменять слова компилятора для специальных целей.
Флаг «время компиляции» в поле имени устанавливается для слов с поведением «время компиляции». Большинство простых слов выполняют один и тот же код независимо от того, вводятся ли они в командной строке или встроены в код. При их компиляции компилятор просто помещает в слово код или связанный указатель. [27]
Классическими примерами слов времени компиляции являются управляющие структуры, такие как IF
и WHILE
. Почти все управляющие структуры Форта и почти весь его компилятор реализованы как слова времени компиляции. За исключением некоторых редко используемых слов потока управления , встречающихся только в нескольких реализациях, таких как слово условного возврата ?EXIT
используется в preForth Ульриха Хоффмана, [33] [34] Форта все слова потока управления выполняются во время компиляции для компиляции различных комбинаций примитивных слов вместе с адресами их ветвей. Например, IF
и WHILE
, и слова, соответствующие им, задайте BRANCH
(безусловная ветвь) и ?BRANCH
(извлеките значение из стека и выполните ветвление, если оно ложно). счетным циклом Слова потока управления работают аналогично, но создают комбинации примитивных слов, которые работают со счетчиком, и так далее. Во время компиляции стек данных используется для поддержки балансировки структуры управления, вложения и обратного исправления адресов ветвей. Фрагмент:
... DUP 6 < IF DROP 5 ELSE 1 - THEN ...
часто компилируется в следующую последовательность внутри определения:
... DUP LIT 6 < ?BRANCH 5 DROP LIT 5 BRANCH 3 LIT 1 - ...
Цифры после BRANCH
представляют относительные адреса перехода. LIT
— это примитивное слово для помещения «буквального» числа в стек данных. (Более быстрый и более короткий код будет скомпилирован с использованием указателей на константы вместо LIT
и встроенные данные, если какое-либо из задействованных чисел отдельно определено как константа. Аналогичные изменения произошли бы, если бы вместо констант использовались другие слова и так далее.)
Состояние компиляции и состояние интерпретации
[ редактировать ]Слово :
(двоеточие) анализирует имя как параметр, создает словарную запись ( определение двоеточия ) и переходит в состояние компиляции. Интерпретатор продолжает считывать слова, разделенные пробелами, с пользовательского устройства ввода. Если слово найдено, интерпретатор выполняет семантику компиляции , связанную с этим словом, вместо семантики интерпретации . Семантика компиляции слова по умолчанию заключается в добавлении семантики его интерпретации к текущему определению. [27]
Слово ;
(точка с запятой) завершает текущее определение и возвращается в состояние интерпретации. Это пример слова, семантика компиляции которого отличается от значения по умолчанию. Интерпретационная семантика ;
(точка с запятой), большинство слов потока управления и некоторые другие слова не определены в ANS Forth, а это означает, что их следует использовать только внутри определений, а не в интерактивной командной строке. [27]
Состояние интерпретатора можно изменить вручную словами [
(левая скобка) и ]
(правая скобка), которые переходят в состояние интерпретации или состояние компиляции соответственно. Эти слова можно использовать со словом LITERAL
для вычисления значения во время компиляции и вставки вычисленного значения в текущее определение двоеточия. LITERAL
имеет семантику компиляции, позволяющую брать объект из стека данных и добавлять семантику к текущему определению двоеточия, чтобы поместить этот объект в стек данных.
В ANS Forth текущее состояние интерпретатора можно прочитать по флагу STATE
который содержит значение true в состоянии компиляции и false в противном случае. Это позволяет реализовать так называемые слова с интеллектуальным состоянием , поведение которых меняется в зависимости от текущего состояния интерпретатора.
Непосредственные слова
[ редактировать ]Слово IMMEDIATE
отмечает самое последнее определение двоеточия как непосредственное слово , эффективно заменяя его семантику компиляции семантикой интерпретации. [35] Непосредственные слова обычно выполняются во время компиляции, а не компилируются, но это может быть отменено программистом в любом состоянии. ;
является примером непосредственного слова. В ANS Forth слово POSTPONE
принимает имя в качестве параметра и добавляет семантику компиляции именованного слова к текущему определению, даже если слово было помечено как немедленное. Форт-83 определил отдельные слова COMPILE
и [COMPILE]
для принудительной компиляции непрямых и непосредственных слов соответственно.
Вместо резервирования места для флага Immediate в каждом определении некоторые реализации Forth используют словарь Immediate, который проверяется первым в режиме компиляции.
Безымянные слова и жетоны выполнения
[ редактировать ]В ANS Forth безымянные слова можно определить с помощью слова :NONAME
который компилирует следующие слова до следующего ;
(точка с запятой) и оставляет токен выполнения в стеке данных. Маркер выполнения предоставляет непрозрачный дескриптор скомпилированной семантики, аналогичный функции указателям на языка программирования C.
Токены выполнения могут храниться в переменных. Слово EXECUTE
берет токен выполнения из стека данных и выполняет соответствующую семантику. Слово COMPILE,
(compile-comma) берет токен выполнения из стека данных и добавляет связанную семантику к текущему определению.
Слово '
(галочка) принимает имя слова в качестве параметра и возвращает токен выполнения, связанный с этим словом в стеке данных. В состоянии интерпретации ' RANDOM-WORD EXECUTE
эквивалентно RANDOM-WORD
. [36]
Разбор слов и комментариев
[ редактировать ]Слова :
(двоеточие), POSTPONE
, '
(галочка) — примеры синтаксического анализа слов , которые получают аргументы из устройства пользовательского ввода, а не из стека данных. Другой пример – слово (
(круглая скобка), которая считывает и игнорирует следующие слова до следующей правой круглой скобки включительно и используется для размещения комментариев в определении через двоеточие. Аналогично, слово \
(обратная косая черта) используется для комментариев, продолжающихся до конца текущей строки. Чтобы правильно разобрать, (
(круглая скобка) и \
(обратная косая черта) должна быть отделена пробелом от следующего текста комментария.
Структура кода
[ редактировать ]В большинстве систем Форта тело определения кода состоит либо из машинного языка , либо из некоторой формы многопоточного кода . Исходный язык Forth, который следует неофициальному стандарту Fig (группа интересов Forth), представляет собой TIL (поточный интерпретирующий язык). Это также называется кодом с непрямой резьбой, но Форты с прямой резьбой и подпрограммами также стали популярными в наше время. Самые быстрые современные Форты, такие как SwiftForth, VFX Forth и iForth, компилируют Forth в собственный машинный код.
Объекты данных
[ редактировать ]Когда слово является переменной или другим объектом данных, CF указывает на код времени выполнения, связанный с определяющим словом, которое его создало. Определяющее слово имеет характерное «определяющее поведение» (создание словарной статьи плюс, возможно, выделение и инициализация пространства данных), а также определяет поведение экземпляра класса слов, созданного этим определяющим словом. Примеры включают в себя:
VARIABLE
- Называет неинициализированную ячейку памяти, состоящую из одной ячейки. Поведение экземпляра
VARIABLE
возвращает свой адрес в стеке. CONSTANT
- Называет значение (заданное как аргумент
CONSTANT
). Поведение экземпляра возвращает значение. CREATE
- Называет место; В этом месте может быть выделено пространство или оно может содержать строку или другое инициализированное значение. Поведение экземпляра возвращает адрес начала этого пространства.
Форт также предоставляет возможность, с помощью которой программист может определять новые определяющие слова, специфичные для приложения, определяя как собственное определяющее поведение, так и поведение экземпляра. Некоторые примеры включают кольцевые буферы, именованные биты порта ввода-вывода и автоматически индексируемые массивы.
Объекты данных, определяемые этими и подобными словами, являются глобальными по своей области действия. Функция, предоставляемая локальными переменными в других языках, обеспечивается стеком данных в Форте (хотя в Форте также есть настоящие локальные переменные). Стиль программирования Форт использует очень мало именованных объектов данных по сравнению с другими языками; обычно такие объекты данных используются для хранения данных, которые используются рядом слов или задач (в многозадачной реализации). [37]
Форт не обеспечивает согласованность использования типов данных ; программист несет ответственность за использование соответствующих операторов для извлечения и сохранения значений или выполнения других операций с данными.
Примеры
[ редактировать ]"Привет, мир!"
[ редактировать ] : HELLO ( -- ) CR ." Hello, World!" ;
HELLO <cr> Hello, World!
Слово CR
(Возврат каретки) приводит к следующему выводу CR
для отображения в новой строке. Слово для разбора ."
(точечная кавычка) считывает строку, разделенную двойными кавычками, и добавляет код к текущему определению, чтобы проанализированная строка отображалась при выполнении. Пробел, разделяющий слово ."
из строки Hello, World!
не включается как часть строки. Это нужно для того, чтобы парсер распознал ."
как слово Форта.
Стандартная система Форта также является интерпретатором, и тот же результат можно получить, введя в консоль Форта следующий фрагмент кода:
CR .( Hello, World!)
.(
(dot-paren) — это непосредственное слово, которое анализирует строку, разделенную круглыми скобками, и отображает ее. Как и слово ."
пробел, разделяющий .(
от Hello, World!
не является частью строки.
Слово CR
идет перед текстом для печати. По соглашению интерпретатор Forth не начинает вывод с новой строки. Также по соглашению интерпретатор ожидает ввода в конце предыдущей строки после ok
быстрый. В языке Форта нет подразумеваемого действия «очистки буфера». CR
, как иногда бывает в других языках программирования.
Смешение состояний компиляции и интерпретации
[ редактировать ]Вот определение слова EMIT-Q
который при выполнении выдает один символ Q
:
: EMIT-Q 81 ( the ASCII value for the character 'Q' ) EMIT ;
Это определение было написано для использования ASCII значения Q
символ (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.
В следующей версии стандартного Форта используются только слова 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
Реализации
[ редактировать ]Поскольку Форт прост в реализации и не имеет стандартной эталонной реализации, существует множество версий языка. Помимо поддержки стандартных разновидностей настольных компьютерных систем ( POSIX , Microsoft Windows , macOS ), многие из этих систем Forth также предназначены для различных встроенных систем . Здесь перечислены некоторые системы, соответствующие стандарту ANS Forth 1994 года.
- ASYST, Форт-подобная система для сбора и анализа данных. [38]
- Gforth , портативная реализация ANS Forth из проекта GNU.
- noForth , реализация ANS Forth (насколько это возможно) для Flash-микроконтроллеров (MSP430 и Risc-V).
- Open Firmware , загрузчик и стандарт прошивки на основе ANS Forth.
- pForth , портативный язык Forth, написанный на C.
- SP-Forth, реализация ANS Forth от Российской группы Forth Interest Group (RuFIG)
- Swift Forth, реализация генерации машинного кода от Forth, Inc.
- VFX Forth, оптимизация собственного кода Forth
- Ферт — адаптация Форта для компьютера Little Man Stack Machine.
См. также
[ редактировать ]- RTX2010 , процессор, который изначально работает на Forth
Примечания
[ редактировать ]Ссылки
[ редактировать ]- ^ Jump up to: а б Махер, Джимми (28 октября 2014 г.). «Звездный полет» . Цифровой антиквар . Проверено 29 апреля 2023 г.
- ^ Приложения НАСА на Форте (исходный сервер НАСА больше не работает, копия с archive.org)
- ^ «Процессоры Intersil RTX и программное обеспечение Forth контролировали успешную посадку Philae» (PDF) . Микропроцессор Инжиниринг Лимитед . 13 октября 2014 года . Проверено 29 апреля 2023 г.
- ^ «А вот и Philae! На базе RTX2010» . Музей «Хажина процессора» . 12 октября 2014 года . Проверено 29 апреля 2023 г.
- ^ «Применения Форта в космосе» . Архивировано из оригинала 24 октября 2010 г. Проверено 4 сентября 2007 г.
- ^ Jump up to: а б с Вернее, Элизабет Д.; Колберн, Дональд Р.; Мур, Чарльз Х. (1996) [1993]. «Эволюция Форта» . В Бергине, Томас Дж.; Гибсон, Ричард Г. (ред.). История языков программирования---II . Ассоциация вычислительной техники. стр. 625–670. дои : 10.1145/234286.1057832 . ISBN 0201895021 .
- ^ «Демонстрационная программа Atari в магазинах» . Атари Мания .
- ^ Мейнард, Дэвид С. «Дэвид Мейнард: художник-программист» .
- ^ Джон Ромеро (23 сентября 2020 г.). «Искажение времени: Эпизод 9 - Стюарт Смит» (подкаст). Событие происходит в 29:02.
- ^ Эйкок, Джон (2023). Вспомнилась амнезия: обратный инжиниринг цифрового артефакта . Книги Бергана. п. 79. ИСБН 978-1800738676 .
- ^ Шарп, Дуг (8 апреля 2023 г.). «Язык программирования FORTH (Вперед)» .
- ^ «ФОРТ ПОЛУЧАЕТ СВОЮ СПЕЦИАЛЬНУЮ ГРУППУ ПО ЗАИНТЕРЕСАМ» . Технический монитор . 6 февраля 1989 г.
- ^ Кэмпбелл и др., «Начало работы с Asyst 2.0», MacMillan Software Co., 1987 г.
- ^ Мур, Чарльз Х (1991). «Четвертый – Ранние годы» . Архивировано из оригинала 15 июня 2006 г. Проверено 3 июня 2006 г.
- ^ «Спецификация ANS 1994, Приложение C («Перспектива»)» . taygeta.com .
- ^ «Четвертый язык» , журнал BYTE , 5 (8), 1980 г.
- ^ М. Антон Эртл. «Четвертое генеалогическое древо и хронология» .
- ^ Клэй, Пол (1982). «Руководство по языку GraFORTH» . archive.org Инсофт
- ^ «Стандарт Форт-79» (PDF) . Проверено 29 апреля 2023 г.
- ^ «Стандарт Форт-83» .
- ^ «Языки программирования: Форт» . Технический комитет ANSI X3J14. 24 марта 1994 года . Проверено 3 июня 2006 г.
- ^ «Справочник по стандарту Forth (ANSI INCITS 215-1994)» (PDF) . Портативное программное обеспечение Quartus. 13 сентября 2005 г. Проверено 29 апреля 2023 г.
- ^ Клаунч, Карл (2 марта 2018 г.). «Восстановление исходного кода FORTH на IBM 1130» . спасение1130 . Проверено 30 июля 2018 г.
- ^ Броди, Лео (1987). Начиная вперед (2-е изд.). Прентис-Холл. ISBN 978-0-13-843079-5 .
- ^ Броди 1987 , с. 20
- ^ Броди 1987 , с. 14
- ^ Jump up to: а б с д Броди 1987 , с. 16
- ^ Родригес, Брэд. «Создайте свой собственный ассемблер, часть 2: ассемблер 6809 Forth» . Проверено 29 апреля 2023 г.
- ^ Родригес, Брэд. «Многозадачность 8051 CamelForth» (PDF) . Проверено 29 апреля 2023 г.
- ^ Родригес, Брэд (июль – август 1995 г.). «ДВИЖЕНИЕ ВПЕРЕД, Часть 8: CamelForth для 6809» . Проверено 29 апреля 2023 г.
- ^ Шобридж, Питер (21 декабря 1998 г.). «Драйвер режима фоновой отладки Motorola для Windows NT» . Архивировано из оригинала 6 июня 2007 г. Проверено 19 июня 2006 г.
- ^ Мартин, Гарольд М. (март 1991 г.). «Разработка привязанной модели Forth». Информационный бюллетень ACM Sigforth . 2 (3). ACM Press: 17–19. дои : 10.1145/122089.122091 . S2CID 26362015 .
- ^ Слайды preForth Ульриха Хоффмана
- ^ ПреФорт Ульриха Хоффмана
- ^ Броди 1987 , с. 273
- ^ Броди 1987 , с. 199
- ^ «Под капотом». Броди, 1987 год . п. 241.
Подводя итог, можно сказать, что существует три типа переменных: Системные переменные содержат значения, используемые всей системой Форта. Пользовательские переменные содержат значения, уникальные для каждой задачи, хотя определения могут использоваться всеми задачами в системе. Обычные переменные могут быть доступны либо в масштабе всей системы, либо только в рамках одной задачи, в зависимости от того, определены ли они внутри.
OPERATOR
или в рамках частной задачи. - ^ Гарри, Дэвид; Ошио, Коичи; Фланаган, Стивен Д. (1987). «Программное обеспечение ASYST для научных вычислений». Наука . 236 (4805): 1128–32. Бибкод : 1987Sci...236.1128H . дои : 10.1126/science.236.4805.1128 . JSTOR 1699106 . ПМИД 17799670 . S2CID 30463062 .
Внешние ссылки
[ редактировать ]- стандарта Fort 2012 Официальный сайт
- «Программирование проблемно-ориентированного языка» (1970). Неопубликованная книга Чарльза Х. Мура
- Ежегодная четвертая Европейская конференция с 1985 г. по настоящее время.
- Четвертое исследование в Институте компьютерных языков
- Семейство языков программирования Форт
- Конкатенативные языки программирования
- Виртуальные машины на основе стека
- Языки системного программирования
- Языки программирования, созданные в 1970 году.
- Языки программирования с расширяемым синтаксисом
- Языки программирования со стандартом ISO
- Языки программирования
- программное обеспечение 1970 года