Пишем на Pascal и Oberon под OpenBSD

Памяти Никлауса Вирта посвящается.

Опубликовано: 2025-01-19

Категория: OpenBSD

Теги: хауту openbsd oberon pascal modula-2

С некоторым опозданием, но считаю своим долгом.

Год назад, 1 января 2024 года, ушел из жизни профессор Никлаус Вирт (нем. Niklaus Emil Wirth), один из величайших мировых специалистов в теории разработки языков программирования, один из основоположников парадигмы структурного программирования, автор и соавтор кучи языков программирования: Eiler, Algol-W, PL/360, Pascal, Modula, Modula-2, Oberon, Oberon-2 и Component Pascal.

"Делай просто, насколько возможно, но не проще того" - эту цитату Эйнштейна Никлаус Вирт вынес в эпиграф своего "Объявления о языке Оберон", поскольку именно этим принципом он руководствовался в своей работе. И результат всегда являлся образцом разумной достаточности: использовать только то, без чего нельзя обойтись, но не всё, что захотелось, такое упрощение - залог надежности решений и стабильного результата. Вирт был противником "американского подхода" в программировании, когда коммерческая выгода ставится выше соображений надежности и математической стройности решения. "Программы становятся медленнее куда шустрее, чем компьютеры становятся быстрее" - этот "закон Вирта" не был бы объективно наблюдаемой правдой, если бы компьютерная индустрия чаще прислушивалась к его идеям... "Инструмент должен соответствовать задаче, если соответствующего инструмента нет, нужно придумать новый, а не пытаться приспособить существующий", - это еще один из подходов, практиковавшихся Виртом.

Идеи Никлауса Вирта опередили индустрию на годы и десятилетия - скажем, разработанная Виртом еще в 1970-х система "Pascal-P", предполагающая компиляцию программ на паскале в универсальный "пи-код", исполняемый далее на любой платформе легко портируемым интерпретатором - более чем на два десятилетия опередила идею интерпретатора промежуточного кода на платформах Java и .NET. Сюда же и идея совмещения системы программирования, среды исполнения и сборщика мусора - реализованная Виртом еще в 1988 году в операционной системе и языке Oberon, она лишь во второй половине 1990-х была переиспользована в .NET и Java.

Я же лично благодарен Никлаусу Вирту именно за Pascal - этот язык, а точнее один из коммерческих его диалектов - Turbo Pascal 7.0 от Borland - стал для меня первым языком программирования, с которым я научился именно что получать от программирования удовольствие! Попытаюсь же воскресить хоть на секунду эти воспоминания юности.

Дано: система OpenBSD 7.6 на amd64, к чему из наследия великого Никлауса Вирта я могу прикоснуться здесь?

Ну, в наши дни, когда говорят "Pascal", чаще всего имеется в виду компилятор Free Pascal. Только вот беда: в OpenBSD на amd64 этот компилятор поломался при переходе на LLVM 16 и с тех пор никем не починен. Да, вот оно, проклятие маленького комьюнити: мало людей ⇒ мало кому нужно ⇒ мало стимулов чинить... Но не будем отчаиваться: в пакетной базе OpenBSD присутствует GNU Pascal! И даром, что на сайте этого поделия застой и стагнация еще чуть не с 2005 года, а в списках рассылки ни одного нового письма с 2021-го - для применения оно все-таки пригодно. Установим:

doas pkg_add gpc

создадим файл программы на паскале:

program HelloWorld;

begin
    WriteLn('Спасибо товарищу Николаю Вальтеровичу Вирту за моё счастливое детство!');
end.

далее скомпилируем незамысловатым gpc -o HelloWorld HelloWorld.pas и запустим (результат не привожу, он очевиден).

Но не Pascal'ем единым. Что касается языка Modula-2, структурного модульного языка программирования, с синтаксисом, основанным на языке Pascal, но улучшенным (улучшенным в понимании Никлауса Вирта - то есть сделанным более строгим и упрощенным, то с некоторых пор компилятор этого языка был включен в GCC (которая вообще-то коллекция годных компиляторов, а вовсе не "компилятор для сей и плюсцов", как многие, включая меня, привыкли думать).

Но тут есть нюанс, именно что в OpenBSD пакет gcc доступен версии 11.2 и собран он с поддержкой фронтендов для C, C++, Objective-C, Fortran, Java и еще Ada. Но без каких-либо намеков на компилятор Modula-2 (включенный в GCC с версии 13.1), разумеется, нет и в помине. Утверждается, впрочем, что ванильную GCC c поддержкой Modula-2 и даже с поддержкой всего прочего включенного - благополучно можно собрать (Dr. Brian Robert Callahan, сподобился, но я поленился, лишь прикопаю ссылки на память):

=> GCC --enable-languages=all on OpenBSD | GCC now includes Modula-2 and Rust. Do they work on OpenBSD?

Куда интереснее мне лично оказалось попробовать еще одну жемчужину мысли Никлауса Вирта, язык Oberon. В пакетной базе и портах OpenBSD ничего на эту тему не нашлось, посему я воспользовался компилятором OBNC, созданным Карлом Ландстрёмом. Это решение компилирует программы на Oberon в промежуточный код на C, который далее можно собрать любым C-компилятором в любой POSIX-системе. OBNC реализует последний завершенный вариант Oberon с уточнениями от 2013 и 2016 года:

=> Компилятор OBNC брать тут

Прежде всего, необходимо установить зависимости (сборщик мусора Boehm-Demers-Weiser и мультимедиа-библиотеку SDL1):

doas pkg_add boehm-gc sdl

Затем распакуем полученный по ссылке выше архив с компилятором и чуть-чуть подтюним скрипты сборки. Идем в каталог с распакованным архивом и добавляем в скрипт build куда-нибудь в самое начало:

CFLAGS="-I/usr/local/include"

Потом редактируем два файла: ./src/Util.env и ./lib/obnc/OBNC.env, в обоих случаях в LDFLAGS добавим

LDLIBS="-L/usr/local/lib ... " (конец строки не меняем)

И запускаем скрипт ./build. По ходу сборки будут отображаться разные смешные ворнинги, это нормально (например, warning: strcpy() is almost always misused, please use strlcpy()).После того, как всё собралось, инсталлируем (doas ./install) Если нужна будет кросс-компиляция, то можно указать ключ -include-lib-c-src, а деинсталляция так: doas ./install u. Оно помимо man-страниц еще положит в /usr/local/share/doc/obnc/ манифест языка Oberon и набор документации в формате html.

Ну а теперь создадим файл тестовой программы (внимание, в Oberon имя файла должно совпадать с именем модуля, создайте файл hello.mod или hello.obn):

MODULE hello;
	IMPORT Out;
BEGIN
	Out.String("Спасибо товарищу Николаю Вальтеровичу Вирту за моё счастливое детство!");
	Out.Ln
END hello.

Обратите внимание на синтаксис: в силу тяжного наследия времен Алгола, зарезервированные синтаксические элементы нужно вводить в верхнем регистре (это, безусловно, делает текст читаемым на монохромных мониторах и в печатных изданиях).

Скомпилируем программу: obnc hello.mod и запустим - результат предсказуем.

Ну и вишенка на тортике: если открыть наш файл hello.mod в редакторе Neovim, вы чудесным образом увидите работающую подсветку синтаксиса. Как так? Неужели Neovim в дефолтной своей комплектации знает что-то про язык Oberon? Нет, не знает. Зато знает про язык Modula-2 и даже про его диалекты - посему файл с расширением .mod или .Mod редактор Neovim распознает как тип файла "modula-2" и включит соответствующую ему подсветку. А для .obn не включит. В принципе, это приемлемое решение, так как Oberon лишь несколько упрощает и почти не дополняет синтаксис Modula-2, но если хочется иметь подсветку синтаксиса именно для Oberon, то поступаем так:

mkdir -p ~/.config/nvim/syntax
git clone https://github.com/kekcleader/vim-oberon.git
cp ./vim-oberon/syntax/oberon.vim ~/.config/nvim/syntax

а потом добавляем в настойки Neovim (куда-нибудь в options.lua) следующее:

vim.filetype.add({extension = {obn = "oberon"}})

Всё, теперь файлы с расширением .obn будут иметь нужную подсветку синтаксиса.

На этом считаю удовольствие полученным.

Proxy Information
Original URL
gemini://muu-online.ru/2025/01/niklaus.gmi
Status Code
Success (20)
Meta
text/gemini;
Capsule Response Time
294.289269 milliseconds
Gemini-to-HTML Time
2.425591 milliseconds

This content has been proxied by September (ba2dc).