Этой статьей начинаю краткий цикл о трех языках программирования, знакомство с которыми считаю очень важным для любого профессионала в программировании: Форт, Лисп и Оберон.
Сразу оговорюсь, что я не призываю на этих языках разрабатывать (хотя это было бы неплохо), нужны очень веские причины, чтобы принять такое решение. Но знакомство с ними — важная часть профессионального роста.
Историческая справка
4 октября 1957 году Советский Союз запустил в космос первый искусственный спутник земли, а затем 3 ноября 1957 года — второй спутник. Это были события поистине планетарного масштаба! Победа советской научной и технической мысли, результат титанических усилий тысяч ученых и инженеров. Мы по праву гордимся этим достижением и по сей день.
У конкурирующей же стороны, американцев, еще не было своих спутников (появятся позже), они очень внимательно следили за советскими. Научное сообщество всего мира собирало данные о полете спутников, проводило расчеты и пыталось предсказывать траекторию движения, параллельно подстраивая расчетные методики. Помимо расчета положения спутника (расчета эфемерид и других данных полета), ученые проводили изучение ионосферы Земли, поскольку данные передатчиков, излучающих знаменитое «Бип! Бип!» были известны. На основе наблюдений и расчетов было сделано много научных открытий.
Занималась этим и Смитсоновская астрофизическая обсерватория, где работал Чарльз Мур, позднее ставший создателем языка Форт.
Очень любопытным представляется отчет с данными наблюдений за спутниками, а также расчетами, пытающихся предсказать место пролета спутников для проведения их фотосъемки. Это несколько томов многостраничных таблиц, перемежающихся небольшими статьями с расчетами тех или иных характеристик полета или окружающей среды.
На странице 30 отчета (страница 175 в PDF) приведена статья «Predictions for Photographic Satellite Tracking Stations — APO Ephemeris 4» за авторством Чарльза Мура (физика-ассистента) и Дона Лаутмана (математика). В этой статье описывается программа Ephemeris 4 для компьютера IBM EDPM 704, предсказывающая положение спутника для использования следящими станциями.
На трех листах печатного текста дается сухое описание того, что сейчас жаргонно называется «числодробилка», то есть программа из входного массива данных получает другие данные, непосредственно используемые в экспериментах и практической работе.
Как позже сам Мур напишет в статье The Evolution of Forth, чтобы избежать постоянной перекомпиляции исходных текстов программы, он реализовал простой интерпретатор, читающий входные данные с карт. Это позволило компоновать уравнения для разных спутников без повторной компиляции.
Интерпретатор предоставлял несколько команд и концепций, перекочевавших в современные реализации Форта. Использовалась команда чтения «слов», разделенных пробелами, команда преобразования чисел из внешнего во внутреннее представление (по всей видимости имеется ввиду лексический разбор — прим. авт.), а также конструкт IF ... ELSE ...
.
Мур обнаружил, что свободное форматирование кода может быть и более эффективным (код меньше и производительнее), и более надежным в сравнении с распространенным в то время колоночным расположением кода на Фортране.
После завершения учебы Мур в работе использовал разные языки программирования: ALGOL, JOVIAL, PL/I, FORTRAN и всевозможные ассемблеры, не оставляя, тем не менее, идеи использования интерпретатора, который он «таскал с собой, буквально нося пачку перфокарт» (прямая цитата — прим. авт.)
Из языков программирования Мур заимствовал идеи в свой интерпретатор, реализуя с его помощью все более сложные программы. Так появились кросс-ассемблер, примитивный редактор и система управления исходниками. Кроме того, он создал программу для генерации анимированных 3D изображений и шахматную программу, а также игру Spacewar. В интерпретатор добавился стек значений, переменные, арифметические операции и операции сравнения, возможность задания процедур.
В это время появляется название FORTH. Оно отсылает к четвертому поколению компьютеров, как тогда называли маленькие компьютеры. Буквой U из слова FOURTH (четвертый) пришлось пожертвовать из-за того, что файловые системы того времени не позволяли использовать имена файлов длиной более 5 символов. Написание Forth (без капитализации) появилось значительно позже, опять же благодаря файловым системам, способным различать строчные и заглавные буквы.
Важной вехой стало появление «словаря». Это отдельная сущность, в которую помещались имена процедур вместе с указателем на код, который их реализует. Фактически это была реализация «косвенного шитого кода», осуществленная за 5 лет до появления этого термина.
Наконец, последней концепцией, дополнившей картину Форта стала идея отдельного «стека возвратов», упростившего использование данных и процедур, без необходимости балансировать стек до/после вызова процедуры.
Философия Мура
Для Мура Форт был личным ответом на разочарование от современного ему программного обеспечения, которое он называл «Вавилонской башней»:
The software provided with large computers supplies a hierarchy of languages: the assembler defines the language for describing the compiler and supervisor; the supervisor the language for job control; the compiler the language for application programs; the application program the language for its input. The user may not know, or know of, all these languages: but they are there. They stand between him and his computer, imposing their restrictions on what he can do and what it will cost.
And cost it does, for this vast hierarchy of languages requires a huge investment of man and machine time to produce, and an equally large effort to maintain. The cost of documenting these programs and of reading the documentation is enormous. And after all this effort the programs are still full of bugs, awkward to use and satisfying to no one.
Вольный перевод:
ПО, предоставляемое с большими компьютерами привносит иерархию языков: ассемблер определяет язык для описания компилятора и супервизора; супервизор — языки для управления заданиями; компилятор — язык для приложений; приложения — входной язык для данных. Пользователь может не знать все языки или знать не все языки, но они присутствуют. Языки находятся между пользователем и его компьютером, выставляя собственные ограничения того, что можно делать и ожидаему стоимость решения.
И эта стоимость обширной иерархии языков требует огромных вложений времени человека и машины для создания, равно как и огромных усилий по поддержанию работоспособности. Огромна и стоимость документирования и изучения документации этих программ. В конечном итоге программы все-равно полны ошибок, неудобны в использовании и никому не нравятся.
С религиозной настойчивостью Мур отстаивал принцип «Keep it simple!», считая его «Основополагающим принципом». Не без оснований он считал, что для многих задач Форта достаточно.
С этим можно спорить, но Мур был последователен в отстаивании своих принципов. Он реализовал Форт для 18 разных ЦПУ, писал весь требуемый инструментарий, включая кросс-ассемблеры, драйверы и т.д.
Мур был очень требователен к ПО, которое он разрабатывал. Многократно перерабатывая и улучшая Форт, он добивался того, что система выполняла требуемые функции, оставаясь при этом маленькой, эффективной и гибкой.
Гибкость Форта вместе с его интерпретируемой природой показали огромную эффективность и впечатляющие результаты во многих приложениях.
Важность Форта
Форт очень простой язык, и ценность его для программиста состоит в том, что он позволяет практически дотронуться до нескольких концепций, лежащих в его основе.
Интерпретация
Код на Форте интерпретируется. Каждое «слово» на языке исполняется либо кодом внутри интерпретатора, либо комбинацией других «слов». Понимание этого механизма позволяет лучше разбираться в системах, которые используют подобные техники. Так, то, что сейчас называется intrinsic в виртуальных машинах или в других системах, где есть сколь-нибудь сложный рантайм, корнями уходят в том числе в Форт.
Стек значений
Использование стека для значений выражений с непривычки может показаться неудобным. Однако, подобная структура данных позволяет очень компактно и элегантно реализовывать весьма непростые вещи. Кроме того, алгоритмы для работы со стеком очень легко генерировать. Поэтому нередко виртуальные машины для высокоуровневых языков реализуются именно как стековые машины.
Словари
Структура, отображающая имя в какую-то другую сущность, сегодня, кажется, проникла во все языки программирования в том или ином виде, однако, в Форте она имеет особое значение. Словарь является более высокоуровневой сущностью, по сравнению со «словом». Он может быть наделен своей семантикой и в программе может быть разное количество словарей.
Простота реализации
Интерпретатор Форт можно реализовать за один-два вечера. Причем это будет полноценная реализация.
Современные реализации
Сегодня сам по себе Форт используется нечасто. Однако идеи этого языка и того, как он реализован используются очень много.
Так, PDF и PostScript — это прямые потомки языка Форт. Во FreeBSD с версии 3.1 до версии 12 в загрузчике использовался интерпретатор Forth (позже заменен на Lua). Уже упомянутые стековые виртуальные машины используют идеи Форта.
TON Blockchain внутри использует Форт-подобный язык и стековую машину.
Не могу не упомянуть российскую разработку — SP-Forth и разработку российского разработчика по рождению Славы Пестова Factor.
Надеюсь, эта информация поможет расширить ваш программный инструментарий!
Обновлено:
Краткое введение в язык с примерами.
Комментарии (21)
includedlibrary
24.10.2024 18:48Сразу оговорюсь, что я не призываю на этих языках разрабатывать (хотя это было бы неплохо), нужны очень веские причины, чтобы принять такое решение. Но знакомство с ними — важная часть профессионального роста.
Однако, после прочтения не понятно, почему стоит попробовать форт. Тут даже примеров кода на нём не было. Было интересно прочитать историческую справку, но всё равно хотелось бы примеров и подтверждения данного в начале тезиса. Сразу скажу, что немного на форте я писал, так разные простые задачки чисто для гимнастики, но не сказал бы что его прямо стоит попробовать. Гораздо больше мне в своё время сломали шаблон язык ассемблера и хаскель.
DmitrySolomennikov Автор
24.10.2024 18:48Добавил в статью ссылку на краткий вводный материал с примерами.
YuriPanchul
24.10.2024 18:48В языке статьи есть запах ChatGPT и нет примеров кода на Форте. А Оберон имхо язык просто никакой, зачем его вспоминать?
nemavasi
24.10.2024 18:48Языков много не потому, что старые хуже. Просто есть разные сферы использования языков, каждая из которых имеет свои особенности и свои требования к языку. Оберон по сочетанию многих характеристик уникален.
YuriPanchul
24.10.2024 18:48Насколько я понимаю, Оберон - это Модула-2 с наследованием типа. А сама Модула-2 - это Паскаль с модулями/пакетами. А Паскаль - это Алгол-60 с указателями и записями. Где уникальность Оберона? Это все было в других языках.
Уникальные языки: Фортран, Алгол-58 (предшественник Алгол-60, не путать с Алгол-68), Симула-67 (классы до C++), Лисп (списки), Пролог (ленивая эвалюация), Verilog (моделирование сигналов и вентилей), Snobol (шаблоны), Форт (стековая машина с минимализмом), Occam (каналы для многопроцессорныз систем) итд
nemavasi
24.10.2024 18:48Смотрите на уникальное сочетание характеристик, а не на одну. Вы же в работе при выборе смотрите на комплекс характеристик, а не одну единственную.
Оберон (и его вариант Компонентный Паскаль) в отличие от Модула-2 имеют автоматическое управление памятью, что как бы существенно разделяет сферы применения этих языков.
Тут задача понять не в каком первом языке появились какие-то фичи, а в котором они сейчас пригодны для использования. Уникальность - это уже давно не про одну характеристику. Какой из перечисленных языков имеет автоматическое управление памятью, компактен снаружи и внутри? Разве что Лисп с Фортом могут конкурировать с Обероном по своей простоте. В этом смысле автор правильно их хочет рассматривать группой. Но к последним двум надо немного дольше привыкать.
Ветка потомков Алгола вообще очень разделилась.
YuriPanchul
24.10.2024 18:48Автоматическое управление памятью - вы имеете в виду garbage collection? Дык она появилась еще в 1960-е годы, это не уникальная фича.
nemavasi
Оберон лучше всех бы подошёл в качестве первого языка программирования. Самый простой язык из всех. Все основные идеи на нем можно объяснить прекрасно и доступно. Но почему-то все хотят в качестве первого языка иметь промышленный язык, который изначально совсем не предназначен для обучения.
includedlibrary
Чисто ради интереса спрошу, чем оберон лучше того же паскаля, питона или бейсика? Питон как по мне очень простой и вполне подходит для обучения ещё и промышленным является, паскаль я особо не трогал, но он, вроде как, предшественник оберона. Бейсик очень простой, у меня в своё время сложностей, связанных конкретно с использованием бейсика в качестве обучающего языка не было.
Оберон я как-то хотел потрогать, но так и не понял, какой компилятор использовать и забил
SIISII
У Оберона синтаксис, пожалуй, ещё проще паскалевского, хотя все достоинства Паскаля он сохранил. На классическом Бейсике нельзя изучить изрядную часть полезностей -- в частности, там нет процедур/функций, только подпрограммы с передачей параметров через глобальные переменные (так как локальных переменных или параметров тоже нет).
includedlibrary
Я имел дело только с Visual Basic, там таких проблем не было. Насчёт простоты оберона могу только поверить на слово, так как дел с ним не имел
SIISII
Ну, у ВизуалБейсика от классического только название; ничего общего они не имеют.
Newbilius
Ну возьмите более поздний BASIC, например QBasic из какой-то поставки MS-DOS или более современный какой-нибудь - полноценные процедуры-функции там есть. Оберон же, если использовать - тоже явно не версию из 80х)
jobless
Вы всерьёз думаете, что под словом Basic сегодня все понимают то, что было 60 лет назад? Это всё равно, что говорить Fortran и представлять именно тот, которым он родился. Посмотрите самый доступный на всех платформах
https://www.freebasic.net/wiki/DocToc
p.s. и особенно вот по этой ссылке весело про полезности
https://www.freebasic.net/wiki/CatPgUserDefTypes
axe_chita
Классический Basic закончился на восьмибитных машинах во второй половине 80-х, и все те ужасы которые вы расписываете (нет процедур/функций, только подпрограммы с передачей параметров через глобальные переменные (так как локальных переменных или параметров тоже нет) уже отсутствуют. Что в TurboBasic, что в QBasic/Quick/PDS/Visual Basic for DOS.
nemavasi
Python выглядит простым. Но внутри очень очень непрост. Лазить в кишки этого языка школьнику...
У Оберона же есть книжка средней толщины, внутри которой учебник, полный код компилятора и операционной системы. Просто у Вирта была идея создать простой язык с минимальным синтаксисом. Он ее с успехом выполнил, правда прошло немало итераций.
includedlibrary
Не помню, чтобы мне приходилось лазить. Я не питонист, но периодически пишу простые скрипты. Полагаю, что школьникам с их задачами тоже лазить не придётся. Как по мне тому же школьнику сложнее разобраться, а где мне взять компилятор оберона и какой именно?
nemavasi
найдите в телеге группу - там быстрее ответят. Их просто несколько разных, каждый может под себя компилятор подкрутить.
includedlibrary
Уже сложнее, чем пайтон. Совершать столько усилий ради языка, который почти нигде не используется, мне лень.
funny_falcon
Присоединюсь к соседнему комментарию: есть ли возможность использовать Оберон как промышленный язык? Если да, то какой стэк окружения вы посоветуете?
nemavasi
Лучше вам задать вопрос на их форуме, или в группе в Телеграме. Там есть специалисты, которые используют Оберон на БПЛА и атомных электростанциях.