Paradigm | Procedural, стек-ориентированный, отражающий, конкатенативный |
---|---|
Разработан | Чарльзом Х. Муром |
Впервые появился | 1970; 50 лет назад (1970) |
Дисциплина печати | без типа |
Основное обеспечение реализации | |
SwiftForth (Forth, Inc.). Gforth (Бесплатное программное). VFX Forth (MicroProcessor Engineering) | |
Под данной | |
большими системами Burroughs, Lisp, APL | |
Под местной | |
Фактор, Джой, PostScript, RPL, REBOL |
Форт - это императивный компьютер на основе стека язык программирования и среда, среда разработанная Чаком Муром. Возможности включают язык структурированное программирование, отражение (способность исследовать и тестировать программы во время выполнения), конкатенативное программирование (функции составляются с сопоставлением) и расширяемость (программист может создать новые команды). Хотя это и не аббревиатура, название языка иногда идет заглавными буквами как FORTH, следуя обычному использованию в его более ранние годы.
A язык процедурного программирования без проверки типов, Forth поддерживает интерактивное выполнение команд (что делает его подходящим в качестве оболочки для систем, в которых отсутствует более формальная операционная system ) и возможность компилировать установить команд для последующего выполнения. Для большей части существования Форта стандартной техникой компиляция в многопоточный код, но есть современные реализации, которые генерируют оптимизированный машинный код, как компиляторы других языков.
Forth используется в Open Firmware загрузчике, в space приложениях, таких как космический корабль Philae и в других встроенных системы, которые предполагают взаимодействие с оборудованием. Самая продаваемая компьютерная игра 1986 года Starflight от Electronic Arts была написана с использованием специального использования Forth.
Реализация бесплатного программного обеспечения Gforth активно поддерживается, как и несколько коммерческих поддерживаемых систем.
Forth это простой, но расширяемый язык; его модульность и расширяемость позволяют писать важные программы.
Среда Forth объединяет компилятор с интерактивной оболочкой, где пользователь определяет и запускает подпрограммы, называемые словами. Слова можно проверять, переопределять и отлаживать по мере ввода исходного кода без перекомпиляции или перезапуска всей программы. Таким образом, программисты для получения удовольствия от непосредственности интерпретатора и в то же время производительности и эффективности компилятора . Все синтаксические элементы, включая переменные и базовые операторы, устойчивые как слова. Среды Forth различаются по способу сохранения результирующей программы, но в идеале запускает программу, которая дает тот же эффект, что и повторный ввод исходного кода вручную.
Философия Особенно подчеркивает использование небольших простых слов (подпрограмм), которые выполняют минимально возможное количество функций. Слова для более крупных задач используют множество слов, каждое из которых выполняет отдельную подзадачу. Они, в свою очередь, вызывают слова все меньшего размера, к достижению целей словосочетания промежуточных целей на более высоких уровнях. Таким образом, самая большая программа Forth будет состоять из иерархии слов, каждое из которых является самым наименьшим и самым самым из наиболее из числа самого своего уровня. Эти слова, отдельные модули, которые неявно обмениваются данными (переданы данные) через механизмы, прототипы, созданы и протестированы независимо. Такая структура программы обеспечивает быструю и легкую урегулировать как сверху вниз, так и снизу вверх. Это также делает универсальную модификацию программы для удовлетворения постоянно меняющихся требований.
Возможность создания новых слов и их смайлов в словарь среды (расширяемость Форта) позволяет программисту создать ориентированный код, адаптированный к конкретной задаче программирования. Самый высокий уровень кода Forth будет напоминать русскоязычное описание приложения. Форт был назван «языком метаприложений» - язык, который можно использовать для создания проблемно-ориентированных языков.
Большинство сред программирования с рекурсивными подпрограммами використовуют стек для потока управления. Эта структура обычно также хранит локальные переменные, включая подпрограммы (в системе вызов по значению, такой как C). Однако Forth часто не имеет ни локальных чисел, ни вызов по значению. Вместо этого промежуточные значения хранятся в другом стеке, отличном от того, который он использует для адресов возврата, счетчиков циклов и т. Д. Слова работают непосредственно с самыми верхними значениями в первом из этих двух стеков. Поэтому его можно назвать стеком «параметров» или «данных», но чаще всего просто «стеком». Второй стеком функций функций называется стеком «связывание» или «возврат», сокращенно rstack. Сообщается, что сообщается, что он не использует никаких сообщений.
Большинство слов указано с точки зрения их влияния на стек. Обычно параметры помещаются в верхнюю часть стека перед выполнением слова. После выполнения параметров были стерты и заменены любыми возвращаемыми значениями. Для арифметических операторов это следует правилу обратной польской записи. Ниже приведены примеры использования стека.
Forth успешно использовался в больших и сложных приложениях, разработанные компетентными, дисциплинированными профессионалами, за десятилетия использования доказали, что их легко поддерживать на различных аппаратных платформах. Четвертый занимает свою нишу как в астрономических, так и в космических приложениях. Впредь до сих пор используется во многих встроенных системах (небольших компьютеризированных устройств) из-за его переносимости, эффективное использование памяти, короткого времени разработки и высокой скорости выполнения. Он был эффективно реализован на современном компьютере с сокращенным набором команд, и были использованы новые процессоры , используя Forth в качестве машинного языка. Другие варианты использования Forth включают Open Firmware загрузочные ПЗУ, бывшие Apple, IBM, Sun и OLPC XO-1.
Форт произошел от системы персонального программирования Чарльза Х. Мура, которая постоянно развивалась с 1968 года. Форт впервые познакомился с другими программистами в начале 1970-х, начиная с Элизабет Рэзер в Национальной радиоастрономической обсерватории США (NRAO). После работы в NRAO Чарльз Мур и Элизабет Рэзер основали FORTH, Inc. в 1973 году, доработав и перенеся системы Forth на десятки других в последующих десятилетиях.
Форт назван так, потому что в 1968 году «файл, предоставленный интерпретатор, был помечен как ЧЕТВЕРТЫЙ для программного обеспечения 4-го (следующего) поколения, но операционная система IBM 1130 ограничивала имена файлов пять символов. "Мур рассматривал Forth как преемника compile-link-go языков программирования третьего поколения или программного обеспечения для аппаратного обеспечения« четвертого поколения », а не языка программирования четвертого поколения, как в в Этот термине приходят, чтобы их использовали.
Чарльз Мур в течение своей карьеры часто переходил с работы на работу, первое компьютерное давление на языке оказывала простота переноса на разные компьютерные системы. Например, Forth был первым резидентным программным продуктом на новом чипе Intel 8086 в 1978 году, а MacFORTH был первой резидентной системой ра. зработки для 128K Macintosh. в 1984 году.
MicroFORTH, Inc. был разработан FORTH, Inc. для Intel 8080, Motorola 6800 и Zilog Z80 микропроцессоров, начиная с 1976 года. MicroFORTH позже использовался любителями для создания систем Forth для других архитектур, таких как 6502 в 1978 году. Широкое распространение, наконец, привело к стандартизации языка. Общая практика была закреплена в стандарте де-факто FORTH-79 и FORTH-83 в 1979 и 1983 годах соответственно. Эти стандарты были унифицированы ANSI в 1994 году, обычно называемым ANS Forth.
Форт стал популярным в 1980-х, потому что он хорошо подходил для небольших микрокомпьютеров в то время, будучи компактным и портативным. Далее также прост в реализации, что приводит к большому количеству реализаций. По крайней мере, один домашний компьютер, британский Jupiter ACE имел в своей ROM -резидентной операционной системе. Canon Cat также использовал Forth для своего системного программирования, а Rockwell производил однокристальные микрокомпьютеры с резидентными ядрами Forth, R65F11 и R65F12. Insoft GraFORTH - это версия Forth с графическими расширениями для Apple II. ASYST был расширением Forth для измерения и управления на ПК.
По состоянию на 2018 год исходный код для исходной версии FORTH 1130 был восстановлен и теперь обновлен для работы в восстановленной или эмулированной системе 1130.
Форт в степени степени полагается на явное использование стека данных и обратной польской нотации (RPN или постфиксная нотация), обычно используемые в калькуляторах от Hewlett-Packard. В RPN оператор помещается после его операндов, в отличие от более распространенной инфиксной записи , где оператор помещается между его операндами. Постфиксная нотация упрощает синтаксический анализ и расширение языка; Гибкость Forth делает статическую грамматику BNF неприемлемой, и у нее нет монолитного компилятора. Для расширения компилятора требуется только написать новое слово, вместо того, чтобы исследовать грамматику и базовую работу.
Используя RPN, можно получить результат математического выражения (25 * 10 + 50)
следующим образом:
25 10 * 50 + CR. 300 ok
Эта командная строка сначала помещает числа 25 и 10.
. Слово *
умножает два числа в верхней части стека и заменяет их их произведением.
Затем в стек помещается число 50.
. Слово +
отмет его к предыдущему продукту. CR
перемещает вывод в новую строку (это только для целей форматирования и может быть опущено, но в большинстве реализаций - без вывода будет находиться в той же строке, что и ввод, и будет менее читаемым.). Наконец, команда .
выводит результат на пользовательский терминал. В этот момент все было успешно завершено, текстовый интерпретатор выводит приглашение ОК
и переходит на новую строку, чтобы получить дополнительные данные, не требуя для этого ничего явного.
Даже структурные особенности Форта предоставить собой стек. -на основе. Например:
: FLOOR5 (n - n ') DUP 6 < IF DROP 5 ELSE 1 - THEN ;
Двоеточие указывает начало нового определения, в данном случае новое слово (опять же, слово - это терминатор для подпрограммы) с именем ЭТАЖ5
. Текст в скобках - это комментарий, сообщающий, что это слово ожидает число в стеке и вернет возможно измененное число (в стеке).
Подпрограмма использует следующие команды: DUP
дублирует номер в стеке; 6
помещает 6 на вершину стека; <
сравнивает два верхних числа в стеке (6 и ввод DUP
ed) и заменяет их истинным или ложным значением; ЕСЛИ
принимает значение «истина или ложь» и выбирает выполнение команд сразу после него или переход к ELSE
; DROP
отбрасывает значение в стеке; 5
помещает 5 на вершину стека; и ТОГДА
завершает условное выражение.
Слово 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
выводит вывод в новую строку (опять же, это здесь только для удобства чтения). Наконец, вызов .
выводит результат и печатает его пользователю терминал.
Форт не явной грамматики. Интерпретатор имеет ввод с устройства ввода пользователя, затем анализируется на предмет слова с использованием пробелов как разделитель ; некоторые системы распознают дополнительные символы пробела. Когда интерпретатор находит слово, оно это слово в данном. Если слово найдено, интерпретатор код, связанный со словом, а затем возвращается, чтобы проанализировать остальную часть входного потока. Попытка преобразовать его в число и его в стек; в случае успеха интерпретатор продолжает синтаксический анализ входного потока. В противном случае, если и поиск, и преобразование числа завершились неудачно, интерпретатор печатает сообщение, за которое следует сообщение об ошибке, что слово не распознано, очищает входной поток и ожидает нового ввода пользователя.
Определение слова новое слово начинается со слова :
(двоеточие) и заканчивается словом ;
(точка с запятой). Например,
: X DUP 1+.. ;
скомпилирует слово X
и сделает имя доступным для поиска в настоящем. При выполнении ввода 10 X
на консоли будет выведено 11 10
.
Большинство систем Forth включают ассемблер, который позволяет задавать слова, используя средства процессора на его самый низкий уровень. В основном ассемблер спрятан в отдельном словом имен имен (список), так как относительно небольшое количество пользователей хотят его использовать. Ассемблеры Forth могут использовать синтаксис обратной полировки, в каких параметрах указаны инструкции, но конструкции различаются и специфичны для реализации Forth. Типичный ассемблер с обратной полировкой подготавливает операнды в стеке и в последний шага заставляет мнемоническую копию всей команды в память. Ассемблер Forth по своей природе является макроассемблером, поэтому легко определить псевдоним для регистров в соответствии с их ролью в системе Forth: например, «указатель пакета данных» для используемого в качестве указателя стека.
Большинство систем Forth работают под управлением операционной системы хоста, такие как Microsoft Windows, Linux или версия Unix и использовать файловую систему операционной системы хоста для файлового источника и данных; Стандарт ANSI Forth данного слова, используемый для ввода / вывода. Все современные системы Forth используют обычные текстовые файлы в качестве источника, даже если они встроены. Встроенная система с резидентным компилятором получает исходный код через последовательную линию.
Классические системы Для того чтобы традиционно не использовать ни операционную систему, ни файловую систему. Вместо того, чтобы хранить код в файлех, исходный код хранится в дисковых блоках, записанных по физическим дисковым адресам. Слово BLOCK
используется для преобразования количества блока дискового пространства размером 1 КБ в адрес буфера, содержащего данные который, автоматически управляется системой Forth. Использование блоков стало редкостью с середины 1990-х годов. В размещенной системе эти блоки в любом случае также размещаются в обычном файле.
Многозадачность, чаще всего кооперативное циклическое планирование, обычно доступно (хотя слова и поддержка многозадачности не охватываются стандартом ANSI Forth). Слово PAUSE
используется для сохранения контекста текущей задачи, для поиска следующей задачи и восстановления контекста ее выполнения. Каждая задача имеет свои собственные стеки, частные копии некоторых управляющих чисел и рабочую область. Обмен заданиями прост и эффективен; в результате многозадачность Forth доступна даже на очень простых микроконтроллерах, таких как Intel 8051, Atmel AVR и TI MSP430.
Другие нестандартные средства включают механизм для выдачи вызовов основной ОС или оконным системам, и многие предоставляют расширения, которые используют планирование, предоставляемое операционной системой. Обычно они имеют больший и отличный от слова PAUSE
автономного Forth набор слов для создания, приостановки, уничтожения и изменения приоритета задачи.
Полнофункциональная Forth-система со всем исходным кодом будет компилироваться сама, метод, обычно называемый мета-компиляцией или самообслуживанием, программистами Forth (хотя этот термин не совсем соответствует мета-компиляции, как он обычно определяется). Обычный метод - переопределить несколько слов, которые помещают скомпилированные биты в память. В словах компилятора используются специально названные версии выборки и сохранения, которые могут быть перенаправлены в буферную область в памяти. Буферная область имитирует или обращается к области памяти, начинающейся с адреса, отличного от адреса буфера кода. Такие компиляторы определяют слова для доступа как к памяти целевого компьютера, так и к памяти главного (компилирующего) компьютера.
После переопределения операций выборки и сохранения для области кода компилятор, ассемблер и т. Д. Перекомпилируются с использованием новые определения выборки и хранения. Это эффективно повторно использует весь код компилятора и интерпретатора. Затем код системы Forth компилируется, но эта версия сохраняется в буфере. Буфер в памяти записывается на диск, и предусмотрены способы его временной загрузки в память для тестирования. Когда кажется, что новая версия работает, она записывается поверх предыдущей.
Для разных сред существует множество вариантов таких компиляторов. Для встроенных систем код вместо этого может быть записан на другой компьютер, метод, известный как кросс-компиляция, через последовательный порт или даже через один бит TTL, при сохранении названий слов и других неисполняемых частей словаря на исходном компилирующем компьютере. Минимальные определения для такого Forth-компилятора - это слова, которые выбирают и хранят байт, и слово, которое приказывает выполнить Forth-слово. Часто наиболее трудоемкой частью написания удаленного порта является построение начальной программы дляреализации выборки, хранения и выполнения, но многие современные микропроцессоры имеют встроенные функции отладки (такие как Motorola CPU32 ), которые устраняют эту задачу..
Базовая структура данных Forth - это «словарь», который отображает «слова» на исполняемый код или именованные структуры данных. Словарь размещен в памяти в виде дерева связанных списков со ссылками, идущими от последнего (самого последнего) самого слова к самому старому, до контрольного значения, обычно NULL указатель, найден. Переключение контекста приводит к тому, что поиск по списку начинается с другого листа. Поиск в связанном списке продолжается по мере того, как ветвь сливается с основной работой, ведущей в конечном итоге обратно к стражу, корню. Словаря может быть несколько. В редких случаях, таких как мета-компиляция, словарь может быть изолированным и автономным. Эффект напоминает вложение пространств имен и может перегрузить ключевые слова в зависимости от контекста.
Определенное слово обычно состоит из заголовка и тела, причем заголовок состоит из поля имени (NF) и поля ссылок (LF), а тело состоит из поля кода (CF) и поля параметра (PF).
Заголовок и словарной статьи обрабатываются отдельно, поскольку они не могут быть частными. Например, когда программа Forth перекомпилируется для новой платформы, голова может оставаться на компилирующем компьютере, в то время как тело переходит на новую платформу. В некоторых средах (например, встроенные системы ) головки без необходимости занимают память. Однако некоторые кросс-компиляторы могут вставлять заголовки в цель, если ожидается, что цель сама будет поддерживать интерактивный Форт.
Точный формат словарной статьи не предписан, и реализации различаются. Однако некоторые компоненты присутствуют почти всегда, хотя их точный размер и порядок могут отличаться. Описанная как структура, словарная запись может выглядеть так:
байт структуры: флаг \ 3битные флаги + длина имени слова массив символов: имя \ длина времени выполнения неизвестна во время компиляции адрес: предыдущее \ поле ссылки, обратный ptr к адресу предыдущего слова : codeword \ ptr к коду для выполнения этого слова any-array: parameterfield \ unknown length of data, word или opcodes forwardword end-structure forwardword
Поле имени начинается с префикса, указывающего длину имени слова (обычно до 32 байтов) и несколько бит для флагов. Затем за префиксом следует символьное представление имени слова. В зависимости от реализации реализации может быть один или несколько байтов NUL ('\ 0') для выравнивания.
Поле ссылки содержит указатель на ранее определенное слово. Указатель может быть относительным смещением или абсолютным адресом, который указывает на следующего старшего брата.
Указатель поля кода будет либо адресом слова, которое будет выполнять код или данные в поле параметра, который будет работать напрямую. Для слов, определенных двоеточием, указатель поля указывает на слово, которое сохраняет текущий указатель инструкции Forth (IP) в стеке возврата и загрузочного IP-адреса с новым адресом, с которого будет продолжено выполнение слов. Это то же самое, что и инструкции вызова / возврата процессора.
Сам компилятор не является монолитной программой. Он состоит из Forth-слов, видимых систем и используемых программистом. Это позволяет программисту изменить слова компилятора для специальных целей.
Флаг «время компиляции» в поле имени устанавливается для слов с поведением «время компиляции». Независимо от того, вводится ли система простых слов, вводится код. При их компиляции компилятор просто помещает код или нитевой указатель на слово.
Классическими примерами слов времени компиляции являются управляющие структуры, такие как IF
и ПОКА
. Почти все управляющие структуры Forth и почти весь его компилятор реализованы как слова времени компиляции. За исключением некоторых редко используемых слов потока управления, которые встречаются только в реализациях, таких как условный возврат, все слова потока управления Форта выполняются во время компиляции различных комбинаций примитивных слов вместе с адресами их филиалов. Например, IF
и WHILE
, а также слова, соответствующие этим словам, устанавливают BRANCH
(безусловный переход) и ? ФИЛИАЛ
(извлекать значение из стека и переходить, если оно ложно). Счетный цикл поток управления работают аналогично, но задают комбинации простых слов, которые работают со счетчиком, и так далее. Во время компиляции данных используется для поддержки балансировки управляющих структур, вложения и обратного исправления ветвлений. Фрагмент:
... DUP 6 < IF DROP 5 ELSE 1 - THEN...
будет скомпилирован в следующей последовательности внутри определения:
... DUP LIT 6 < ?BRANCH 5 DROP LIT 5 BRANCH 3 LIT 1 -...
Цифры после BRANCH
указать относительный скачок адреса. LIT
- это примитивное слово для помещения "буквального" числа в стек данных.
Слово :
(двоеточие) анализирует имя как параметр, словарную запись (определение двоеточия) и входит в состояние компиляции. Интерпретатор продолжает считывать слова, разделенные пробелами, с пользовательского устройства ввода. Если слово найдено, интерпретатор функции семантику компиляции, связанное со словом, вместо семантики интерпретации. По умолчанию семантика компиляции слова заключается в добавлении семантики его интерпретации к текущему определению.
Слово ;
(точка с запятой) завершенное определение и возвращается в состояние интерпретации. Это пример слова, семантика компиляции которого отличается от значения по умолчанию. Семантика интерпретации ;
(точка с запятой) в новой строке управления ANS Forth.
Состояние интерпретатора можно изменить вручную с помощью слов [
(левая скобка) и ]
(правая скобка), которые переходят в состояние интерпретации или состояние компиляции, соответственно.. Эти слова можно использовать со словом LITERAL
для вычисления значений во время компиляции и для вставки вычисленного значения в текущем определении двоеточия. LITERAL
имеет семантику компиляции, чтобы объект взять из стека данных и добавить семантику к текущему определению двоеточия, чтобы поместить этот объект в стек.
В ANS Forth текущее состояние интерпретатора может быть прочитано из флага СОСТОЯНИЕ
, которое содержит значение true в состоянии компиляции и false в состоянии потери. Это позволяет реализовать так называемые «умные» слова с поведением, которое изменяется в соответствии с текущим состоянием интерпретатора.
Слово IMMEDIATE
отмечает самое последнее определение двоеточия как непосредственное слово, эффективно заменяя его семантику компиляции семантикой интерпретации. Непосредственные слова обычно выполняются во время компиляции, а не компилируются, но это может быть отменено программистом в любом состоянии. ;
- пример непосредственного слова. В ANS Forth слово POSTPONE
принимает имя как параметр и параметр семантику компиляции названного слова к текущему определению, если даже слово было помечено как немедленное. Forth-83 определил отдельные слова COMPILE
и [COMPILE]
для принудительной компиляции не немедленных и немедленных слов, соответственно.
В ANS Forth безымянные слова могут быть использованы с помощью слова : NONAME
, которое компилирует следующие слова до следующего ;
(точка с запятой) и оставляет токен выполнения в стеке данных. Маркер обеспечивает непрозрачный дескриптор для скомпилированной семантики, аналогично указателям на функции языка программирования C.
Маркеры выполнения могут храниться в единице. Слово EXECUTE
берет на себя маркер выполнения из стека данных и виновную семантику. Слово COMPILE,
(compile-comma) берет маркер выполнения из стека данных и связанного семантику к текущему определению.
Слово '
(тик) принимает имя слова в качестве роли и возвращает токен выполнения, связанного с этим словом в стеке данных. В состоянии интерпретации 'RANDOM-WORD EXECUTE
эквивалентно RANDOM-WORD
.
Слова :
(двоеточие), POSTPONE
, '
(галочка) - это примеры синтаксического анализа слов, которые принимают свои аргументы из устройства ввода пользователя, а не из стека данных. Другим примером является слово (
(paren), которое показывает и игнорирует следующие слова до следующей правой круглой скобки включительно и используется для размещения значений в определении двоеточия. Аналогичным образом, слово \
(обратная косая) Логический анализ (
(скобка) и \
(обратная косая черта) (обратная косая черта) должны быть разделены пробелом из следующего текста комментария. <черта) используется для комментариев, которые продолжаются до конца текущей строки. 11>
Основное тело кода состоит из машинного языка, либо из некоторой формы многопоточный код. неформальному стандарту FIG (Четвертая группа интересов), является TIL (многопоточным интерпретирующим языком). грамм, вставляют простые слова в качестве макросов и выполняют оптимизацию глазком или др. ее стратегии оптимизации, чтобы сделать код меньше и быстрее.
Когда используется или используемые данные, CF указывает на код времени, выполняемый с определяющим словом, создавшим Это. Определяющее слово имеет характерное «определяющее поведение» (создание словарной статьи плюс, возможно, выделение и инициализация пространства данных), а также определяет поведение экземпляра класса слов, созданное этим определяющим словом. Примеры включают:
ПЕРЕМЕННАЯ
ПЕРЕМЕННОЙ
возвращает его адрес в стеке.КОНСТАНТА
КОНСТАНТА
). Поведение экземпляра возвращает значение.СОЗДАТЬ
Форт также программное средство, с помощью которого может определять новые определяющие слова для конкретного приложения, определяющее как настраиваемое поведение определения, так и поведение экземпляра. Некоторые примеры включают кольцевые буферы, именованные биты порта ввода-вывода и автоматический индексируемые массивы.
Объекты данных, соответствующие и подобными словами, являются глобальными по охвату. Функция, предоставляемая локальными переменными на других языках, предоставляется стеком данных в Forth (хотя Forth также имеет реальные локальные переменные). Стиль программирования Forth использует очень мало именованных объектов данных по сравнению с другими языками; обычно такие объекты данных используются для хранения данных, которые используются рядом слов или задач (в многозадачной реализации).
Forth не обеспечивает согласованности использования типов данных; программист несет ответственность за использование операторов для выборки и выполнения других операций с данными.
Слова, написанные на Forth, компилируются в исполняемую форму. Классические реализации с «косвенными потоками» составляют списки адресов слов, которые должны выполняться по очереди; многие современные системы генерируют реальный машинный код (включая вызовы одних внешних слов и код для других, расширенный на месте). В некоторых системах есть оптимизирующие компиляторы. Вообще говоря, программа Forth сохраняется как образ памяти скомпилированной программы с помощью одной команды (например, RUN), которая выполняется при загрузке скомпилированной версии.
Во время разработки программист использует интерпретатор в режиме REPL для выполнения и тестирования каждого маленького фрагмента по мере его разработки. Поэтому большинство программистов Forth отстаивают свободный нисходящий дизайн и восходящую разработку с непрерывным тестированием и интеграцией.
Нисходящий дизайн обычно представляет собой разделение программы на «словари», которые затем используются в -уровневые наборы инструментов для написания финальной программы. Хорошо спроектированная программа Forth читается как естественный язык и реализует не только одно решение, но и набор инструментов для атаки связанных проблем.
Одна возможная реализация:
: HELLO (-) CR. "Hello, world!" ;
ПРИВЕТПривет, мир!
Слово CR
(возврат каретки) приводит к отображению следующего вывода на новой строке. Слово синтаксического анализа . "
(точка-кавычка) считывает строку, разделенную двойными кавычками, и добавляет код к текущему определению, чтобы проанализированная строка отображалась при выполнении. Пробел, разделяющий слово . "
из строки Hello, world!
не включается как часть строки. Это необходимо для того, чтобы синтаксический анализатор распознал . "
как слово Forth.
Стандартная система Forth также является интерпретатором, и такой же результат можно получить, набрав следующий фрагмент кода в консоль Forth:
CR. (Привет, мир!)
.(
(точка-парен) - это непосредственное слово, которое анализирует строку, разделенную скобками, и отображает ее. Как и в случае со словом . "
пробел, разделяющий . (
от Привет, мир!
не является частью строки.
Слово CR
стоит перед текстом для печати. Также по соглашению интерпретатор ожидает ввода в конце предыдущей строки после приглашения ok
. В Forth CR
нет подразумеваемого действия "flush-buffer", как это иногда
Вот определение слова EMIT-Q
, которое при выполнении испускает одиночный символ Q
:
: EMIT-Q 8 1 (значение ASCII для символа «Q») EMIT;
Это определение было написано для непосредственного использования значения ASCII символов Q
(81). Текст в скобках является комментарием и игнорируется компилятором. Слово EMIT
берет значение из стека данных и отображает соответствующий символ.
В следующем переопределении EMIT-Q
скобки используются слова [
(леваяка), ]
(правая скобка), CHAR
и LITERAL
для временного переключения в состояние интерпретатора, значения ASCII символов Q
, возврат в состояние компиляции и добавление вычисленных значений к текущему определению двоеточия:
: EMIT-Q [CHAR Q] ЛИТЕРАЛЬНОЕ ЭМИТ;
Слово анализа CHAR
принимает слово, разделенное пробелами, в качестве и помещает значение его первого символа в стек данных. Слово [CHAR]
является непосредственной версией CHAR
. Используя [CHAR]
, пример определения для EMIT-Q
можно переписать следующим образом:
: EMIT-Q [CHAR] Q EMIT; \ Выдает одиночный символ 'Q'
В этом определении используется \
(обратная косая черта) для описывающего комментария.
И CHAR
, и [CHAR]
предопределены в ANS Forth. Используя IMMEDIATE
и POSTPONE
, [CHAR]
можно было бы определить следующим образом:
: [CHAR] CHAR POSTPONE LITERAL; НЕМЕДЛЕННО
В 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 и устанавливаются в 0. Все добавление производятся по модулю 256.
В стандартной версии Forth используются только слова Core и Core Extension.
0 значение ii 0 значение jj 0 значение KeyAddr 0 значение KeyLen создать массив SArray 256 распределить \ состояние 256 байтов: KeyArray KeyLen mod KeyAddr; : get_byte + c @; : set_byte + c! ; : as_byte 255 и; : reset_ij 0 TO ii 0 TO jj; : i_update 1 + as_byte TO ii; : j_update ii SArray get_byte + as_byte TO jj; : swap_s_ij jj SArray get_byte ii SArray get_byte jj SArray set_byte ii SArray set_byte; : rc4_init (KeyAddr KeyLen -) 256 мин. TO KeyLen TO KeyAddr 256 0 DO ii 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 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 должен быть: F1 38 29 C9 DE
Временная виртуальная машина Forth проста в реализации и не имеет стандартной эталонной реализации, существует множество реализаций. языка. Помимо поддержки разновидностей настольных компьютерных систем (POSIX, Microsoft Windows, Mac OS X ), многие из этих систем предназначены также для различных встроенных систем. Здесь представлены некоторые из наиболее известных систем, которые соответствуют стандарту ANS Forth 1994 года.
На Викискладе есть материалы, связанные с Форт (язык программирования). |
В Викиучебнике есть книга по теме : Форт |