Лирическое отступление о литературном метапрограммировании

первая часть

Оболочка IDE для Inform 7 включает, конечно, стандартный редактор с поддержкой подсветки синтаксиса, а также возможность схлопывания различных логических секций кода. Но главное, что в нее встроен интерпретатор Z-кода, и дерево игры визуально представлено в графическом виде. В результате разработчик может мгновенно переключаться между ветвями истории, многократно прогоняя тот или иной бранч с сохраненными предусловиями. К этим бранчам также можно прикреплять аннотации, из которых в дальнейшем можно автоматически сгенерировать текстовое описание прохождения игры. А с помощью подсветки правильных ответов удается особо быстро проводить тестирование игры.

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

По аналогии прозрачно напрашивается IDE для функционального программирования. Мы можем визуально посмотреть и протестировать на лету комбинации любых функций (цепочки вычислений), увидеть, где и как стыкуются/преобразовываются типы в таких цепочках, а сам фреймворк автоматически отслеживает такое функциональное конструирование, предлагая подходящие функции-кирпичики для дальнейшего комбинирования.

Но самое интересное в Inform 7, это конечно, язык. Он реализует так  назывемую концепцию литературного программирования (Literate Programming), когда программа описывается на языке, максимально приближенном к реальному. Тут можно вспомнить неплохо живущий и сегодня Кобол.

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

То есть мы фактически естественно пишем литературный «рассказ», который затем преобразуется в код целевого языка. Кнут тут отказался и от проектирования «сверху вниз» и от проектирования «снизу вверх», назвав такую программу «взаимозависимой сетью концепций».

Преимущества такого подхода очевидны, а недостаток, наверное, в довольно ограниченной сфере применения: в основном в качестве DSL для специализированных пакетов. Большая проблема тут в отсутствии инструментов и фреймворков. Литературное программирование применится в мэйнстриме в основном для создания отдельных модулей программы (на практике же используется прежде всего для автоматического документирования, но это совсем неправильно), а вот работу самой архитектуры в целом желательно реализовывать нативно. Впрочем, проблема тут скорее в отсутствии подходящих инструментов.

Однако, литературное программирование как реализация метапрограммирования на уровне programming-in-small смотрится одним из единичных сильнейших решений — если не самым сильным! Не исключено, что в литературном метапрограммировании подспудно скрываются как раз те серебряные пули, которые мы ищем в классическом метапрограммировании, поэтому далее изучим это направление более тщательно.

Пока же вернёмся к языку Inform 7. Он реализует декларативный подход, основанный на правилах (точнее, книгах правил), и великолепно адаптирован к английскому (поддерживает самую высокую арность, которую может иметь английский глагол).

А самое интересное — способен выводить типы и свойства объектов из контекста их применения! Удивительно конечно, что столь важные в программировании подходы на уровне реализации встречаются только в таких довольно узких экзотических сферах.

Например, строка кода » John wears a hat.».

Программа создает объект John (если его раньше не было); носить вещи могут лишь люди, поэтому этот объект получает тип «человек». Шляпа — это некая вещь, у которой должно быть свойство «можно носить»; и наконец эта шляпа «одевается» на  Джона.

Вдобавок между подобными связями объектов могут быть установлены отношения — как задаваемые вручную, так и поддерживаемые автоматически. В предыдущем примере программа связала шляпу и Джона, но можно дополнительно добавить например отношения любви и ненависти — например, Джон может не любить кепки.

Вот небольшой пример кода на I7:

The story headline is "An Interactive Example".

The Living Room is a room. «A comfortably furnished living room.»
The Kitchen is north of the Living Room.
The Front Door is south of the Living Room.
The Front Door is a door. The Front Door is closed and locked.

The insurance salesman is a man in the Living Room.
The description is
«An insurance salesman in a tacky polyester suit. He seems eager to speak to you.»
Understand «man» as the insurance salesman.

A briefcase is carried by the insurance salesman.
The description is «A slightly worn, black briefcase.»
Understand «case» as the briefcase.

The insurance paperwork is in the briefcase.
The description is «Page after page of small legalese.»
Understand «papers» or «documents» or «forms» as the paperwork.

Instead of listening to the insurance salesman:
say «The salesman bores you with a discussion of life  insurance policies.
From his briefcase he pulls some paperwork which he hands to you.»;
move the insurance paperwork to the player.

Игра начинается в комнате, по которой мы получим описание «A comfortably furnished living room.». После ее осмотра будут видны несколько дверей и детская. В комнате находится страховой агент, с которым можно пообщаться и который вручит герою страховой договор.

В языке I7 конечно поддерживаются события, объектное наследование и полиморфизм, кросс-компиляция, строгая типизация прям как в Паскале. При этом отличается он уникальной семантической лаконичностью. Например, простейшей работающей программой будет «X is room.».

Еще одна интересная фишка I7 — принципиальное отсутствие в языке некоей объединяющей теории. То есть не следует ожидать от I7 принципов «всё есть объект» или «всё есть список». Зато порог вхождения в I7 очень низок, и начинающие разработчики могут использовать ограниченный перечень возможностей при создании игр фактически произвольной сложности, совершенно не подозревая о других мощных механизмах языка.

Отмечу, что Inform 7 на сегодня — самый естественный (наиболее приближенный к натуральному) язык из всех известных языков программирования!

Поделиться статьей ...Share on Facebook0Share on Google+0Tweet about this on TwitterShare on LinkedIn0Share on VKPrint this page

Добавить комментарий

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