Загадочный Forth. Знакомимся с одним из важнейших языков программирования, о котором мало кто знает

Почему Forth, один из старейших языков программирования, до сих пор привлекает к себе внимание и будоражит воображение? Не претерпев больших изменений, он позволяет воплотить многие современные парадигмы программирования. Forth применяют в самых разных областях, включая чипсеты PCI и космические аппараты, а Павел Дуров будет использовать схожий язык в смарт-контрактах криптовалюты TON. Так что же такое этот загадочный Forth?

Создатель Forth Чарльз Мур изначально описал его так:

FORTH — это программа, которая связывает клавиатуру с компьютером.

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

Мур продолжает:

Получившийся язык достаточно мощный, чтобы описать сам FORTH, и достаточно гибкий, чтобы делать запросы. Он может быть легко расширен для обработки стольких и столь сложных приложений, насколько позволяет аппаратное обеспечение.
FORTH — это компьютерная программа. Он обеспечивает полный программный интерфейс между терминалом и компьютером. Включая язык, на котором пользователь может описать свое приложение. И на котором написан FORTH.

Сегодня существует масса языков программирования, и в каждой из областей свои лидеры. Но для Мура проблема разработки языка была гораздо более глобальной: как кодифицировать мысленные абстракции, чтобы ими можно было оперировать программно?

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

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

 

Основы синтаксиса, идеология

Вот еще одно определение Forth, на этот раз из «Википедии»:

Форт (англ. Forth) — один из первых конкатенативных языков программирования, в котором программы записываются последовательностью лексем («слов» в терминологии языка Форт). Математические выражения представляются постфиксной записью при использовании стековой нотации. Поддерживает механизмы метарасширения семантики и синтаксиса языка для адаптации к нужной предметной области. Синтаксис базового уровня в Форте прост и состоит из единственного правила: «все определения разделяются пробелами».

Увы, несмотря на всю свою точность, оно не позволяет прочувствовать суть языка. Поэтому покажу на примерах.

Форт интерактивен, то есть сразу начинает работать. Запускаем Gforth (популярная опенсорсная реализация) и набираем

1 2 + ok

Вот это и есть постфиксная запись и стековая нотация. Но где же результат? Результат в стеке. Чтобы его увидеть, нужно ввести точку и снова нажать Enter. Вот как он выглядит:

. 3 ok

Программирование на форте состоит в определении новых слов на основе слов, определенных в словаре. Допустим, ты хочешь написать знаменитую программу «Здравствуй, мир!». Для этого определяем слово:

: привет ." Здравствуй, мир!" ;

Теперь вводим

привет

И получаем

Здравствуй, мир!

Ладно, знакомство состоялось. Предположим теперь, что надо сложить несколько чисел. Можно, конечно, на каждое число ввести по одному плюсу и получить результат. Но почему бы не поручить это сделать самому форту? Определяем слово сумма:

: сумма ( n -- ) 0 DO + LOOP ;

Слова можно определять в любом национальном алфавите. Определение начинается с двоеточия. Далее идет слово, семантику которого необходимо определить. В скобках — стековая нотация, в данном случае сказано, что для слова сумма в стеке должно находиться число, обозначающее количество чисел, которые необходимо просуммировать. Далее 0 — нижний предел цикла. Начало цикла — слово DO. Дальше описано, что будет делать цикл. И конец цикла — LOOP.

Тестируем программу. Наберем несколько произвольных чисел:

1 2 3 4 5

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

4 сумма .

Получим

15 ok

Чтобы не думать о том, что для правильной работы цикла нужно указывать число на единицу меньшее, чем количество чисел, пусть само слово сумма этим и занимается:

: сумма ( n -- ) 1- 0 DO + LOOP ;

Теперь вводим

1 2 3 4 5 5 сумма .

И получаем правильный ответ.

 

Где применяется Forth и какой он бывает

Изначально Forth применялся для программирования встроенных приложений (embedded) и приложений реального времени. Сегодня же на нем можно писать программы для Windows и разных вариантов Unix, включая macOS. Кроме того, коммерческие кросс-компиляторы Forth генерируют высокооптимизированный код, который работает на хорошо зарекомендовавших себя микропроцессорах и микроконтроллерах.

 

Open Firmware

У Forth есть все необходимое, чтобы управлять вычислительной системой в целом, независимо от того, на каком железе она реализована и какая у нее периферия. Это свойство Forth интенсивно используется в разных системах.

Open Firmware (OpenBoot) — это стандарт, определяющий интерфейсы компьютерной микропрограммной системы. Он был разработан в Sun, и его поддержали Apple, IBM, ARM и большинство других поставщиков чипсетов PCI, отличных от x86. Открытая прошивка позволяет системе загружать независимые от платформы драйверы непосредственно с карты PCI, что повышает совместимость.

Обращаться к Open Firmware можно с помощью командной оболочки на языке Forth, и большая часть кода написана на нем же. Код Forth может быть скомпилирован в байт-код FCode, независимый от таких деталей компьютерной архитектуры, как набор инструкций и иерархия памяти. Поэтому Open Firmware предоставляет платформенно независимые средства для диагностики во время загрузки и для конфигурирования.

 

Микроконтроллеры

Forth часто применяют для программирования микроконтроллеров. Множество ссылок по этой теме ты можешь найти в топике на русском Forth Forum. Встречаются решения на ARM, AVR, MSP430 и PIC.

Мне также попалась занимательная книга на русском о применении контроллеров PIC в измерительной технике (PDF) и компилятор программы на форте для микроконтроллеров серии 16Cxx.

Если же тебе интересен Arduino, можешь использовать AmForth — легко расширяемый интерпретатор команд для Atmel, AVR8 ATmega, T1 MSP430, 32-разрядных вариантов ARM и RISC-V.

Также из интересного: британская компания MpeForth разработала VFXforth для использования во встроенных решениях; RoboForth — программное обеспечение, которое работает в контроллере робота.

Ну и конечно же, Forth летал в космос, причем неоднократно. Список миссий и систем, которые работали на Forth, можно найти на сайте NASA. Точнее, можно было некоторое время назад.

 

Процессоры на Forth

В разное время предпринимались разные по подходу и по успешности попытки создать процессор, который бы работал с инструкциями на Forth. В частности, в середине двухтысячных годов такой процессор проектировали в России на основе ПЛИС.

Но наиболее продвинутая реализация на данный момент — это чипы SEAforth. Создатель Forth Чарльз Мур еще с восьмидесятых годов работает над их архитектурой и успел поучаствовать в создании череды предприятий, которые занимаются коммерческим продвижением этих чипов. Последняя из таких компаний называется GreenArrays и выпускает чипы GA144.

SEAforth можно рассматривать как однородную вычислительную структуру, изготовленную на одном кристалле. Она состоит из асинхронно работающих вычислительных узлов (nodes). Топология двумерной решетки, лежащая в основе SEAforth, легко масштабируется: созданы мультикомпьютеры, имеющие 24, 40 и 144 узла на кристалле (тот самый GA144).

Отдельный узел выполняет около 700 миллионов операций в секунду. Пиковое быстродействие мультикомпьютера S40 можно оценить в 28 миллиардов операций в секунду. Подробнее смотри в даташите (PDF).

 

Наука и обучение

Помимо перечисленного, Forth также применяется в академической среде — в аппаратном обеспечении курсов по цифровой обработке сигналов, параллельного программирования, архитектуры вычислительных систем и так далее. А для научных расчетов существует семейство библиотек Forth Scientific Library.

 

TON

Одна из новейших реинкарнаций Forth — это Telegram Open Network Virtual Mashine, или TVM (PDF). Она разработана для того, чтобы выполнять код смарт-контракта в блокчейне TON. TVM является стековой машиной.

Язык программирования Fift (PDF) специально разработан для создания смарт-контракта TON Blockchain, управления им и взаимодействия с TVM и блокчейном TON.

В руководстве к Fift написано, что Fift основан на стековом языке и мало чем отличается от форта. Так что учти: знание форта пригодится для понимания Fift!

 

Реализуем пример посложнее: код Грея

В качестве более продвинутого примера, чем «Привет, мир», рассмотрим реализацию генератора кода Грея. Это двоичный код, в котором две соседние кодовые комбинации отличаются цифрой только в одном двоичном разряде. Это свойство кода Грея проявляется в упорядоченном наборе.

Источник: xakep.ru

Ответить

Ваш адрес email не будет опубликован. Обязательные поля помечены *