Главная » Хабрахабр » [Из песочницы] Мой компилятор Паскаля и польское современное искусство

[Из песочницы] Мой компилятор Паскаля и польское современное искусство

Истоки

Несколько лет назад я написал компилятор Паскаля. Мотивация была простой: в юности я узнал из своих первых книжек по программированию, что компилятор — вещь чрезвычайно сложная. Это утверждение засело занозой в мозгу и в конце концов потребовало проверки на опыте.

image
ha.art.pl

Вдохновением мне служила книга Compiler Construction, написанная создателем языка Паскаль Никлаусом Виртом. Сперва родился простейший компилятор PL/0, а из него постепенно вырос почти полнофункциональный компилятор Паскаля для MS-DOS. Однако его методы по-прежнему просты, изящны, а главное — приносят радость, ведь самостоятельно разобрать текст программы рекурсивным спуском и сгенерировать машинный код намного заманчивее, чем призывать на помощь яков, бизонов и всех их преемников. И пусть взгляды Вирта уже устарели и утратили всякую связь с реалиями ИТ, а компиляторы делают совсем не так, как учил Вирт.

Он прожил две жизни: первую — в моих руках, вторую — в руках польских ценителей компьютерных древностей.
Судьба моего компилятора оказалась не самой тривиальной.

XD Pascal

Мой свежеиспечённый компилятор получил название XD Pascal. Он поддерживал все операторы Паскаля, кроме goto и with. Первый показался мне трудным для реализации, поскольку разрушал идеально иерархичную структуру программы. Второй — создавал путаницу с областями видимости имён.

За рамками остались только беззнаковые целые числа, множества, перечисления и вариантные записи — однако всё это явно не предметы первой необходимости. Поддерживались и все основные типы данных. Тем не менее, я не мог отказать себе в удовольствии от чисел с плавающей точкой и их арифметики на сопроцессоре 8087 — тут сказалась профессиональная склонность к инженерным расчётам.

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

Машинный код генерировался напрямую, без помощи внешнего ассемблера или компоновщика. Генератор кода создавал самые простые исполняемые файлы COM для реального режима MS-DOS. Для данных я использовал 32-битные регистры архитектуры 80386, а адресация осталась 16-битной, в виде пары сегмент-смещение.

Модель памяти примерно соответствовала «малой» (если кто-то ещё помнит эту терминологию 16-битной эпохи): для кода, глобальных данных и стека выделялось по одному сегменту размером 64 кб.

image
Использование памяти

Конечно, мне встречались самокомпилируемые компиляторы, код которых целиком умещался в одном сегменте (например, Context). Генерация файлов EXE и переключение сегментов на лету казались чересчур сложным делом, и тесные рамки «малой» модели заставили меня распрощаться с идеей самокомпиляции. Я же хотел сделать свой компилятор хоть немного пригодным для численных расчётов и вывода графики. Однако они редко умели делать хоть что-то полезное кроме этой самокомпиляции. Поэтому среди примеров программ появились фракталы, решение линейных уравнений по Гауссу, быстрое преобразование Фурье и даже оценивание фильтром Калмана ошибок инерциальной навигационной системы.

image
Фрагмент множества Мандельброта

image
Быстрое преобразование Фурье

image
Оценивание погрешностей инерциальной навигационной системы

0 (ещё без ООП) и любительский BeRo Tiny Pascal. То, что у меня получилось в итоге, больше всего напоминало древний как мир Turbo Pascal 3. Из более современных особенностей в моём XD Pascal появились позаимствованные из Delphi однострочные комментарии (//) и автопеременная Result. Автор последнего совладал с самокомпиляцией под Windows, однако пожертвовал арифметикой с плавающей точкой и многими тонкостями грамматики, которые мне хотелось соблюсти.

Паскаль уже необратимо выходил из моды, а MS-DOS давно стал архаикой. Впрочем, ещё с самого своего рождения мой компилятор был отмечен печатью смерти. В тот день, когда я перешёл с 32-битной Windows XP на 64-битную Windows 7 без виртуальной машины DOS, я мысленно похоронил свой проект.

Возрождение

Затем произошло странное. После трёх лет полного забвения некая группа польских энтузиастов ретрокомпьютинга и любителей Atari отыскала мой компилятор. Судя по всему, абстрактные проблемы самокомпилируемости и строгости реализации грамматики их волновали мало. Им просто нужен был удобный инструмент программирования их любимой машины. Из моего проекта они сделали собственный компилятор Mad Pascal для архитектуры 6502. Грамматика языка разрослась, появилась поддержка модулей с секциями интерфейса и реализации, оператора goto, беззнаковых целых чисел, множеств и перечислений, ассемблерных вставок. Вместо машинного кода теперь генерировался ассемблерный код. Его финальная трансляция делалась ассемблером собственной разработки.

Внутри компилятор выглядит несколько устрашающе, зарезервированные слова перемешаны с именами стандартных процедур, однако это авторов нисколько не смущает. Внешне язык стал заметно ближе к фактическому стандарту Паскаля. Возникает ощущение, что в Польше вообще очень сильны традиции почитания Atari. Как бы оно ни выглядело, но дело оказалось на удивление живучим: вот уже три года Mad Pascal регулярно обновляется, на нём написано немало игр, авторы ежегодно выступают на ретроконференции Silly Venture (ссылка требует VPN).

Весной 2018 года произошло событие, весьма примечательное для польской тусовки поклонников Atari: вышла книга «Robbo. Solucja» («Роббо. Прохождение») в жанре экспериментальной литературы. Здесь надо сказать, что сама игра Robbo для Atari, изданная 30 лет назад, до сих пор волнует сердца поляков старшего поколения и наполняет их патриотическим восторгом. В общем, неудивительно, что появилась посвящённая игре книжка. Забавно лишь то, что она, по словам авторов, на 60 % состоит из инструкций по прохождению игры, сгенерированных самим компьютером Atari. Программа генерации написана на том самом Mad Pascal.

image
graczpospolita.pl

И кажется, некоторые восприняли книгу как достойный образец современного искусства:

Нам приходится иметь дело с редким случаем столкновения культуры видеоигр с литературой (в данном случае электронной), когда отправной точкой является «игра», а не «литература». Было бы неверно относиться к книге только как к предмету коллекционирования для поклонников Robbo или, в более общем смысле, для поклонников Atari. Для других подобное скрещивание несёт совершенно новые возможности и опыт. Для некоторых это бессмысленное искусство ради искусства. Книга хорошо согласуется с моим взглядом на игры как на искусство. Ничто не мешает вам создать версию Robbo, которую вы можете закончить с помощью «прохождения» из книги. Содержание книги можно адаптировать для перформанса с игроком, проходящим Robbo, используя элементы «пошаговых инструкций» из книги. Искусство, в котором игрок может быть как воспринимающим, так и творящим — если во время «игры» присутствует «аудитория», наблюдающая за игроком, создающим свою собственную историю «игры». Solucja» состоялся 11 мая 2018 года в галерее современного искусства «Бункер» в Кракове, во время презентации книги в рамках выставки «Неисчерпаемость». Чтобы не оставаться голословным: перформанс по мотивам «Robbo.

Перформанс в Кракове. Ради этого стоило написать компилятор.


Оставить комментарий

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

*

x

Ещё Hi-Tech Интересное!

Древности: невероятная видеокассета

Сейчас, в 2019 году видеокассета потеряла всякую актуальность. Когда год назад я решил оцифровать свои старые записи, и не без труда вывел картинку с видеомагнитофона на современную метровую ЖК-панель, это был опыт, сравнимый с прослушиванием грамофонных пластинок на 78 оборотов. ...

Я прочитал 80 резюме, у меня есть вопросы

У нас не очень простое собеседование. Нужно пройти 3 шага: Прислать резюме, программист его посмотрит, лайкнет если всё хорошо. Рекрутер позвонит, задаст несколько вопросов Встретиться или созвониться с нами. Узнаем, какой вы специалист. Прийти на тестовый день. Познакомиться с командой ...