Skip to main content

Meta Programming System

Posted in

В преддверии выхода беты Realaxy я немного покопался в истоках, чтобы выяснить, что такое Meta Programming System и Language-oriented programming.

Впечатлился вдохновляющей статьей Language Oriented Programming Сергея Дмитриева, co-founder and CEO of JetBrains Inc. И посмотрел тутор, как используется MPS на практике.

Что ж, все это очень интересно. Это действительно совершенно новая парадигма в программировании. Хотя как сказать, новая. Большинство идей были озвучены лет 20 назад, но только сейчас есть тул, реализующий их на практике, и годный к применению в реальной работе (это не мои слова, это из статьи Сергея Дмитриева).

Некоторые моменты меня насторожили.

Во-первых, больше нет исходных кодов в виде человекочитаемых текстовых файлов. И больше нет текстового редактора, чтобы их редактировать. Проект хранится в бинарном Abstract syntax tree. Отсутствие текстового представления и необходимости парсить его на лету существенно облегчает создание новых языков и упрощает их синтаксис. Надо полагать, это же существенно ускоряет такие вещи, как автокомплит, рефакторинг и т.д. (что далеко не всегда работает с приемлемой скоростью в большинстве традиционных IDE).

Но как быть с системами контроля версий? Известно, что они хорошо работают с текстовыми файлами, и плохо работают с бинарными. Как наладить командную работу? Как синхронизировать изменения?. Но Потапенко и Дембицкий в этом треде, посвященном Realaxy меня успокоили, что, дескать, с этим все будет ок. Ну поверим им на слово.

Между тем, в жуйке мне подсказали, что проект там все-таки не бинарный, в виде xml-файлов. Они не человекочитаемые, но надо полагать, что системе контроля версий они будут под силу.

Во-вторых, меня беспокоит, что удлиняется путь от исходного кода до скомпилированной и работающей программы. Сперва из DSL нужно сгенерировать целевой язык (AS или Java или что-то еще), потом целевой язык скомпилировать. AS и так-то не быстро компилируется, а тут еще лишний этап. А отлаживать как? Но и тут Потапенко обещает, что все будет клево и быстро. Приходится верить, хотя тут уж я вообще не представляю, как это будет.

Ну ок, будет бета, будем смотреть.

Мета-программирование

А пока можно подумать о мета-программировании. Мы ведь уже пользуемся мета-программированием и DSL. Язык MXML -- это как раз DSL и есть. Хотя он сложнее и ниже уровнем, чем то, что подразумевает MPS, но он уже давно дает нам некоторые удобства, которыми мы, флексеры, с удовольствием пользуемся.

А помимо MXML? Ну кое-что еще я делал. Например, в наших проектах используется довольно нетривиальный подход к локализации. Все языковые ресурсы находятся на сервере (FMS) и подгружаются в приложение в рантайме. Это сделано для того, чтобы пользователь продукта (админ) мог добавлять свои языки и модифицировать существующие под свои нужды. Для этого предусмотрено флэш-приложение -- админка. Ну и не только для этого, а для управления многими настройками.

Ок, значит локали хранятся на сервере в виде server side shared objects. Но как с ними работать в процессе разработки? Проще всего работать с традиционными properties-файлами, которые нативно поддерживаются в IDEA. Причем поддерживаются очень хорошо -- с навигацией, автокомплитами и рефакторингами. Вот поэтому мы именно так с локалями и работаем -- делаем properties-файлы.

Вот только они не компилируются в проект, а вместо этого специальный консольный скрипт из properties-файлов генерирует ServerSide ActionScript код и добавляет его в серверную часть проекта. При запуске серверного приложения этот код синхронизирует изменения в локалях с существующими Shared Object файлами, или генерирует с нуля Shared Objects, если их нет.

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

Вот такой прагматичный подход, без высоких теорий -- мы применяем мета-программирование для решения узко-специфичной задачи.

DSL

В статье Сергея Дмитриева мне очень понравился один момент, позволю себе процитировать:


The good news is that you won't have to dive head-first into the unknown; you can dip your toe in and see if the water is nice first. You can try just a little bit of LOP on your project to see if it provides a practical advantage, and then try a bit more if you like if.

В общем, есть плагин к моей любимой Intellij IDEA, позволяющий применять MPS в обычном проекте, и какую-то часть кода генерировать с его помощью. Конечно, это сделано для Java. Генерацию AS кода нужно будет реализовывать самому (вот этим и занимается Потапенко).

Вот тут я и задумался, а где и какой DSL можно было бы применить в моих текущих проектах? И сразу придумал -- для вышеупомянутой админки. У нас для всех флэш-приложений есть довольно типовая флэш-админка. С ее помощью пользователь-админ может менять многие настройки, хранящиеся на FSM-сервере в ServerSide SharedObjects. Конечно, в разных проектах эти настройки разные, но админки довольно одинаковые. И делать их скучно и не интересно.

Было бы не сложно придумать DSL для описания такой админки, и генерировать из этого DSL код AS и MXML. Ну и компилировать его потом. Для этого никакая MPS не нужна.

Но вот беда с такими DSL это то, что для них нет поддержки IDE. И писать их код приходится просто в текстовом редакторе, даже без подсветки синтаксиса, не говоря уж про автокомплиты и рефакторинги. (Хотя если DSL на основе XML, то какая-то подсветка синтаксиса будет).

А вот MPS, как раз и дает поддержку IDE для любого выдуманного DSL. И это очень интересно.

А еще я подумал, что выбрал правильную IDE :)

No votes yet