Loading AI tools
Из Википедии, свободной энциклопедии
Форт (англ. Forth) — один из первых конкатенативных языков программирования, в котором программы записываются последовательностью лексем («слов» в терминологии языка Форт). Математические выражения представляются постфиксной записью при использовании стековой нотации. Поддерживает механизмы метарасширения семантики и синтаксиса языка для адаптации к нужной предметной области. Синтаксис базового уровня в Форте прост и состоит из единственного правила: «все определения разделяются пробелами». Определения Форта могут иметь любое сочетание символов.
Эта статья должна быть полностью переписана. |
Forth | |
---|---|
Семантика | императивный |
Класс языка | язык программирования, интерпретируемый и компилируемый язык программирования |
Тип исполнения | интерпретатор/компилятор |
Появился в | 1971 год |
Автор | Чарльз Х. Мур |
Расширение файлов |
.fth , .fs , .4th , .fb , .f или .forth |
Система типов | бестиповый |
Основные реализации | gForth, pForth, kForth, SP-Forth[1], win32forth[2] |
Диалекты | FORTH-79, FORTH-83, ANSI FORTH 1994 года, ColorForth, RetroForth. Forth 2012 Standart |
Испытал влияние | АПЛ, Лисп |
Повлиял на | PostScript, Factor и другие конкатенативные языки |
Сайт | forth-standard.org (англ.) |
Медиафайлы на Викискладе |
Ряд свойств, а именно интерактивность, гибкость и простота разработки делают Форт эффективным языком в прикладных исследованиях и при создании инструментальных средств. Очевидными областями применения этого языка являются встраиваемые системы управления. За счёт простоты транслятор, а зачастую и компилятор Форта легко реализуется для подавляющего числа микроконтроллеров, также используется как кросс-средство программирования. Применяется также при программировании компьютеров под управлением различных операционных систем или как самостоятельная операционная среда.
Язык Форт был создан Чарльзом X. Муром в конце 1960-х — начале 1970-х годов. Мур назвал свой язык Fourth, считая, что это будет язык для ЭВМ четвёртого (англ. fourth) поколения. Но так как он работал на машине IBM 1130[англ.], которая допускала имена, составленные не более чем из пяти прописных букв, название было преобразовано в FORTH (англ. forth — вперёд). Впрочем, первые эксперименты Мура по созданию простого интерпретатора, облегчающего написание программ управления астрономическим оборудованием, относятся ещё к концу 1950-х годов.[3]
С 1971 года Мур работал в Национальной радиоастрономической обсерватории, участвуя в разработке программ сбора и обработки получаемых радиотелескопом данных. Именно тогда появилась первая реализация языка Форт. В этой работе также участвовала сотрудница Мура Элизабет Ратер (англ. Elizabeth Rather), которую можно считать вторым в мире форт-программистом.
Вновь созданный язык был принят в качестве основного языка программирования в Американском астрономическом обществе. Позднее, в 1973 году, Чарльз Мур и Элизабет Ратер основали компанию FORTH, Inc[4], в ходе работы которой в течение следующего десятилетия язык был портирован на множество платформ.
В конце 1970-х годов программистами, заинтересованными в развитии языка, была создана группа FORTH Interest Group (FIG). Этой группой разработана концепция FIG Forth Model — общедоступной форт-системы, которая может быть легко перенесена на популярные компьютерные архитектуры. Эту эталонную форт систему — FIG-FORTH часто рассматривают как первоначальный стандарт языка.
Идея официальной стандартизации Форта первоначально возникла в рамках Международного объединения астрономов (англ. Astronomical Sciences, AST). В мае 1977 года на встрече в Национальной обсерватории Китт-Пик (США) был выработан глоссарий языка Форт, обозначенный как AST.01.
В феврале 1978 года в Утрехте был принят стандарт FORTH-77, ориентированный на реализацию на микрокомпьютеры.
В октябре 1979 года встреча на острове Санта-Каталина (Калифорния) закончилась разработкой стандарта FORTH-79, который распространяется на ЭВМ всех типов.
Осенью 1983 года состоялась встреча по разработке следующего стандарта, утверждённого в 1984 году как FORTH-83. Стандарт Форт-83 отличается от стандарта Форт-79 некоторыми деталями, но не по существу.
В 1988 году в составе ACM была организована группа SIGFORTH[5]; была и соответствующая Российская группа ACM (председатель — проф. С. Н. Баранов (Санкт-Петербург, СПИИРАН)). Сейчас SIGFORTH существует в составе более общей группы SIGPLAN[англ.].
В 1994 году после продолжительного согласования, в котором участвовали многие заинтересованные фирмы, был принят ANSI стандарт языка Форт.[6]
Текущий стандарт языка Форт был принят в 2012 году.[7]
Известный пример успешного применения Форта — его использование в программном обеспечении глубоководного спускаемого аппарата, при поисках «Титаника» в 1985 году. Также Форт был применён в программном обеспечении спектрографа на Шаттле, в микромодулях управления искусственными спутниками Земли, для системы управления в аэропорту Эр-Рияда, системах компьютерного зрения, автоматизации анализа крови и кардиологического контроля, карманных переводчиках.
Диалект языка Форт используется в OpenBoot — базовом программном обеспечении ЭВМ на базе процессоров SPARC и PowerPC.
В начале 1980-x Джон Уорнок и Чак Гешке из Adobe Systems создали язык PostScript[8]. Несмотря на сходство языков, Джон Уорнок отмечал[9], что Форт не оказал влияние на создание PostScript
Существуют процессоры и контроллеры, поддерживающие вычислительную модель языка на аппаратном уровне. Создано множество открытых реализаций Форта для различных аппаратных платформ. Отдельные фирмы (среди которых следует отметить прежде всего основанную Чарльзом Муром FORTH, Inc и британскую компанию MicroProcessor Engineering Ltd.[10]) поставляют различные по своим возможностям коммерческие версии языка.
Две домашние компьютерные игры от Electronic Arts, созданные в 1980-х, были написаны на Форте: Worms? (1983)[11] и Starflight (1986).[12] В качестве языка для системного программирования в Canon Cat (1987) использовался Форт.
Ежегодно проводятся конференции ЕвроФорт (EuroForth), в том числе в России, Англии, Австрии, Германии, Испании, Чехии (ранее в Чехословакии).[13]
Основная часть Форт-системы — это связный список слов, или словарь, из которого слово вызывается по имени для выполнения специфических функций. Программирование на Форте состоит в определении новых слов на основе слов, определённых в словаре ранее. Как только новые слова скомпилированы в словарь, они не отличаются по форме от слов, которые в нём уже имелись. Описание слова в словаре называется статьёй.
Структура «типичной» статьи словаря Форта:
Условно статьи Форта можно разделить на две категории: низкоуровневые статьи и форт-статьи. Статьи первого типа содержат в поле кода указатель на процедуру в кодах целевого процессора, непосредственно выполняющую семантику слова. В поле параметров таких статей располагаются передаваемые процедуре параметры, либо сам её код. Форт-статьи содержат в поле параметров указатели на другие статьи, а поле кода указывает на специальную процедуру, называемую интерпретатором ссылок. На практике структура статьи зависит от реализации, но, как правило, похожа на рассмотренную выше. Принцип, используемый внутри поля параметров форт-статьи, называется шитый код (англ. threaded code), а интерпретатор ссылок — виртуальной Форт-машиной.
Грамматически текст, обрабатываемый транслятором Форта, представляет собой последовательность лексем (англ. token), разделённых пробелами и символами конца строки. Транслятор входной строки выбирает очередной токен и производит его поиск в текущем словаре, причём поиск ведётся от более новых слов к старым. Если слово не найдено, предпринимается попытка интерпретировать токен в качестве записи числа, которое, в случае успеха, помещается на вершину стека. Если же токен соответствует слову Форта, анализируется текущее состояния флага compile Форт-системы. Если флаг сброшен, то слово исполняется — управление передаётся по указателю поля кода найденной статьи. Если флаг установлен, слово компилируется, то есть указатель на его поле кода дописывается в текущую создаваемую статью. Если было оттранслировано число, оно снимается со стека и компилируется в литеральный код, исполнение которого внутри словарной статьи помещает число на вершину стека. Кроме того, слова могут содержать флаг immediate («немедленный»), в этом случае они всегда исполняются.
Механизм передачи параметров между словами:
Язык предоставляет способ работы с памятью системы, как с линейной областью.
Обязательным компонентом системы является также стек возвратов. Доступен программно для изменения потока управления программы.
Всё вышесказанное относится к понятию Форт только в первом приближении. Форт — это не совсем язык программирования; вернее, он перекрывает понятие языка программирования. Форт в большей степени является виртуальной машиной и операционной системой ForthOS.[14]
Синтаксис и семантику Форта можно расширить до любого другого языка программирования прямо во время интерпретации (компиляции) форт-программы. Использовать Форт в качестве метаязыка удобно благодаря доступности средств Форта, поддерживающих те языки, которые уже есть в Форт-системе. Все ресурсы Форт-системы доступны пользователю и представлены в виде словарных статей. Как правило, словарные статьи, определённые пользователем, имеют точно такое же представление в Форт-системе, как и все остальные словарные статьи, из которых и состоит вся Форт-система.
В качестве машинного представления скомпилированной форт-программы используется тот или иной вид шитого кода.
При использовании подпрограммного кода получается машинный код, в котором, по сравнению с кодом, сгенерированном компилятором обычного языка программирования, где на единственный стек кладутся и переменные, и адреса возвратов из подпрограмм, отсутствуют операции по «перетаскиванию» параметров подпрограмм. В качестве стека возвратов используется основной стек процессора, стек данных организуется программно.
При использовании шитого кода, отличающегося от подпрограммного, определения Форта, состоящие только из машинного кода, называются примитивы. В таком шитом коде часто стараются использовать основной стек процессора в качестве стека данных, а обращения к данным, лежащим на нём, в виде машинных команд pop
и push
.
Одно из не совсем очевидных преимуществ использования косвенного шитого кода в том, что весь машинный код, то есть примитивы, вызовы интерпретатора кода и переменных, могут размещаться в одном сегменте кода, который будет недоступен для изменения. Весь остальной код Форта размещается в сегменте данных. Этих сегментов может быть много, а работать с единственным номером сегмента легче, чем с двумя.
Форт системы могут также использовать байт-код, как логическое завершение развития косвенного шитого кода и свёрнутого шитого кода с адресной таблицей. В этом случае код программы (Форта) представляет собой последовательность байтов, или код некоторого придуманного виртуального процессора. Для исполнения этого кода должна существовать таблица на 256 адресов (2-байтовых, 4- или 8-байтовых), по которым расположены примитивы Форта или сложные определения.
Этот вариант сильно отличается от других видов кода и заслуживает особого внимания.
.( Привет Мир)
Пример определения слова .SIGN, печатающего соответствующую фразу в зависимости от знака числа на вершине стека:
\ Напечатать знак числа
: .SIGN ( n -- )
?DUP 0= IF
." НОЛЬ"
ELSE
0> IF
." ПОЛОЖИТЕЛЬНОЕ ЧИСЛО" ELSE
." ОТРИЦАТЕЛЬНОЕ ЧИСЛО" THEN
THEN
;
Пример реального кода, создающего строчную константу в принятом в Форт виде (со счётчиком):
\ Создать "константу" из строки
: S-CONSTANT ( c-addr u "<spaces>name" -- )
CREATE
DUP , 0 ?DO
DUP C@ C, CHAR+
LOOP DROP 0 C,
DOES>
DUP CELL+ SWAP @
;
В этом примере создаётся определение слова name
с помощью слова CREATE
. При исполнении слова name на стек будет положен адрес указателя области памяти, который был во время компиляции слова. Для того, чтобы его можно было как-то использовать, туда записывается («компилируется» строка). При выполнении слова выполняются слова, указанные после слова DOES>
.
Таким образом, в этом примере была создана новая синтаксическая конструкция. Подобные возможности редко представлены в других языках программирования.
Кроме создания новых синтаксических конструкций, одной из самых сильных возможностей Форта является возможность вмешиваться в процесс компиляции с помощью слов немедленного исполнения (immediate-слов).
Примеры таких стандартных слов:
[
— Временное переключение в режим исполнения (фактически, часто просто записывает 0 в переменную STATE).
]
— Переключиться обратно в режим компиляции.
LITERAL
— Компилировать число, в данный момент лежащее на вершине стека, как константу. Также является словом немедленного исполнения.
Пример кода, где используются эти слова:
\ Некоторый размер данных в килобайтах
16 CONSTANT size
\ Напечатать отчёт о пересчёте килобайтов в байты
: report ( -- )
size . ." килобайт эквивалентны "
[ size 1024 * ] LITERAL . ." байтам"
;
В разделе не хватает ссылок на источники (см. рекомендации по поиску). |
Одна из постоянных тем споров вокруг языка Форт — это место, которое он занимает среди «классических» императивных языков. Программы на Форте имеют крайне непривычный вид:
Йоды магистра тайна речи раскрыта:
Старым Форта программистом был он просто.Оригинальный текст (англ.)The mistery of Yoda’s speech uncovered is:
Just an old Forth programmer Yoda was.[15]
!
и @
, а символов — словами C!
и C@
), некоторые сущности выносятся в специальные стеки (например, стек чисел с плавающей запятой, согласно стандарту ANSI FORTH 94; он может быть, а может и не быть, реализован с помощью основного стека).Эти особенности и определяют преимущества и недостатки языка Форт:
Возможно, что на самом деле больше всего развитию Форта препятствует «тяжёлое наследство», пришедшее от машин с низкими возможностями, для которых он изначально создавался. В стандарте ANSI FORTH 94 существуют, например, следующие особенности:
2*
производит не умножение на два, как следует из его названия, а «смещает число на один бит к старшему двоичному разряду, заполняя младший бит нулём». Конечно, на большинстве современных машин — это одно и то же, но сам факт использования особенностей конкретной архитектуры настораживает. (Существуют также более очевидные стандартные слова для сдвига битов — LSHIFT
и RSHIFT
.)Многие из этих особенностей — следствие того, что на момент принятия стандарта существовало множество плохо совместимых Форт-систем, которые базировались на двух частично различающихся стандартах 1979 и 1983 годов.
Seamless Wikipedia browsing. On steroids.
Every time you click a link to Wikipedia, Wiktionary or Wikiquote in your browser's search results, it will show the modern Wikiwand interface.
Wikiwand extension is a five stars, simple, with minimum permission required to keep your browsing private, safe and transparent.