Персональные инструменты
 

Language Oriented Programming (LOP) в действии (Максим Мазин, ADD-2011)

Материал из CustisWiki

Перейти к: навигация, поиск

Аннотация

Докладчик
Максим Мазин

Если бы у нас, разработчиков, была такая возможность, мы бы применяли предметно-ориентированные языки (Domain Specific Languages — DSL) значительно чаще. Ведь формулировать свои программистские идеи в терминах предметной области намного удобнее и эффективнее, чем в терминах универсальных языков. Код, написанный на универсальном языке, содержит много лишней информации, необходимой компилятору, а не программисту. Поддержка такого кода — занятие чересчур трудное и невеселое, особенно, если код написан кем-то другим.

Для разрешения этой проблемы предлагается применять подход языко-ориентированного программирования (Language Oriented Programming — LOP), когда при разработке программы предметная область сначала формализуется в виде предметно-ориентированного языка, а затем программа пишется уже на этом языке. Исходный код получается максимально точным, компактным и понятным. Если в ходе разработки уточняются или изменяются наши знания о предметной области, мы можем изменить операционную семантику языка. Если изменяются требования к функциональности программы, мы вносим соответствующие изменения в код на предметно-ориентированном языке.

Несмотря на преимущества, которыми обладает описываемый подход, он до сих пор не пользуется популярностью. Это происходит потому, что, во-первых, создание компилятора для нового языка — задача трудоемкая и требующая высокой квалификации разработчиков, а во-вторых, процесс современной разработки программного обеспечения предполагает использование современных интегрированных сред разработки (Integrated Development Environment — IDE), повышающих продуктивность программистов.

Компания JetBrains изначально специализировалась на создании интегрированных сред разработки для популярных универсальных языков программирования (IntelliJ IDEA для Java, ReSharper для C# и VB, PhpStorm для PHP). Когда мы стали заниматься разработкой новых продуктов, мы поняли, что для новых предметных областей нам бы очень пригодились предметно-ориентированные языки программирования. Наш опыт помог нам создать среду языко-ориентированного программирования JetBrains MPS, которая не только значительно упрощает процесс создания языков, но и автоматически предоставляет для них среду разработки, поддерживающую подсветку кода, автодополнение, анализатор кода, подсветку ошибок, отладчик, интеграцию c системами контроля версий и многое другое.

При помощи среды MPS мы уже разработали багтрекер YouTrack, который является самостоятельным коммерческим продуктом, и продолжаем разработку еще нескольких проектов. Мы довели среду MPS до состояния, когда ее могут использовать сторонние разработчики, и теперь распространяем ее бесплатно вместе с исходными кодами. Мы бы хотели, чтобы и другие программисты начали применять LOP в реальной практике, ведь создавать собственные языки — это так круто!

Видео

Скачать
http://ftp.linux.kiev.ua/pub/conference/peers/addconf/2011/1a1-language-oriented-programming-mazin.avs.avi


Стенограмма

Иллюстрированную статью-стенограмму по видеозаписи составил Стас Фомин.

Language Oriented Programming (LOP) в действии (Максим Мазин, ADD-2011).pdf

Сегодня у меня первый доклад, рассказывать я будут про языковый тему (???) в программировании.

Меня зовут Максим Мазин, я работаю в компании JetBrains инженером в проекте YouTrack. YouTrack — это багтрекер, и самое увлекательное в YouTrack то, что он написан с помощью Language Record программирования. Что это такое? Это такая концепция, которая полагает, что при написании программ, первым делом вы создаете специальный предметно-ориентированный язык, а затем, на этом предметно-ориентированном языке, вы начинаете уже писать собственно код программы.


Language Oriented Programming (LOP) в действии (Максим Мазин, ADD-2011).pdf

Для чего это? Какой от этого прок, и что мешает делать так всем — об этом я и буду сегодня рассказывать.

Language Oriented Programming (LOP) в действии (Максим Мазин, ADD-2011).pdf

Смотрите — вот существуют универсальные языки программирования. При программировании при помощи языка Java, PHP или C# возникает проблема — у вас при программировании возникает огромное количество bullet plate (??? 01:15) -кода, т.е. такого кода, который будет повторяться из раза в раз, но не потому, что он делает какую-то содержательную работу, а просто для того, чтобы компилятор мог этот код скомпилировать. Писать скобочки круглые, точки, … ну и так далее.

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

Language Oriented Programming (LOP) в действии (Максим Мазин, ADD-2011).pdf

В языке Java существует конструкция synchronized, которая не является какой-то конструкцией общего назначения, является специальной, предметно-ориентированной конструкцией, предназначенной для параллельного программирования.

Language Oriented Programming (LOP) в действии (Максим Мазин, ADD-2011).pdf

Точно так же, в языке C++, существует перегрузка операторов. Вот, сравните. В нормальной ситуации, если бы у вас не было конструкции synchronized вам бы пришлось написать вот столько вот кода. Блок «finally» и блок получения блокировки, это все вот bullet-plate код, который не интересно писать постоянно. Вместо этого существует DSL-ная конструкция «synchronized», которая позволяет захватить блокировку и не беспокоится о том, что ее надо отпустить.

Language Oriented Programming (LOP) в действии (Максим Мазин, ADD-2011).pdf

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


Language Oriented Programming (LOP) в действии (Максим Мазин, ADD-2011).pdf

Это все очень хорошо, но как вы знаете, что в языке Java, начиная с пятой версии, появились read-write локи, и это означает для нас, что нам снова нужно писать код вот такого стиля, как показано слева:

Language Oriented Programming (LOP) в действии (Максим Мазин, ADD-2011).pdf

Т.е. надо блокировки захватывать, блокировки отпускать, … это все полностью нивелирует удобства.

Если бы можно было писать… самостоятельно расширять языки, нам бы удалось решить разные проблемы. Например, те конструкции, языковые расширения, которые есть, в языке Java, они позволяют вам решать определенный набор задач. Но мы в жизни сталкиваемся и с другими задачами. Например, если мы пишем веб-аппликейшн, то нам нужно работать с базами данных, писать веб-уровень, и так далее. Для этого DSLей нет, есть только фреймворк.

Language Oriented Programming (LOP) в действии (Максим Мазин, ADD-2011).pdf

Точно также, если мы используем какую-нибудь концепцию вроде dependency injection, то нам тоже нужно для этого использовать фреймворки, и хуже того — использовать смеси языков, писать одновременно на Java, на XMLе, и все это не очень весело. И главное — нам ничего с этим не поделать, потому что создание языкового расширения грозит нам разными рисками.

Language Oriented Programming (LOP) в действии (Максим Мазин, ADD-2011).pdf

Какие проблемы возникают при создании DSL и почему бы при возникновении какой-нибудь потребности не бросаться сразу создавать DSL?

Language Oriented Programming (LOP) в действии (Максим Мазин, ADD-2011).pdf

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

Language Oriented Programming (LOP) в действии (Максим Мазин, ADD-2011).pdf

Вот например. Если у вас есть некоторые библиотеки и фреймворки, в нашем случае для Java, например Hibernate, Spring или Joda Time, то все они между собой совместимы, принципиально, на уровне компиляции. Т.е. вы можете одновременно использовать в вашем проекте компоненты и Hibernate и Spring, и ничего вам не может помешать. Но если у вас есть языковые надстройки, в виде каких-то макросов, или еще каких-нибудь техник, которые добавляют вам предметно-ориентированные конструкции в язык Java, то и эти надстройки созданы независимым образом, то все время существует риск, что эти надстройки будут с друг другом конфликтовать.

Language Oriented Programming (LOP) в действии (Максим Мазин, ADD-2011).pdf
Language Oriented Programming (LOP) в действии (Максим Мазин, ADD-2011).pdf

Вот например, такой очень простой пример. Допустим у нас откуда-то появилось расширение, которое делает что-то полезное, и в частности поддерживает интерполяцию выражений в строках. Можно написать такую конструкцию, и вместо «resultCount» будет подставлено значение этого выражения.

В тоже самое время, в друг к нам приходит другое языковое расширение, которое позволяет делать что-то полезное и в частности тоже делает интерполяцию строк. В Java же нет интерполяции строк, поэтому достаточно ожидаемо, что разные люди будут ее релизовывать в разных языковых расширениях. И допустим, синтаксис слегка отличается. Тогда при совместном использовании языковых расширений A и B, у вас мгновенно возникает неустранимая неоднозначность, как следует интерпретировать вот этот вот buzz.

Данный пример он очень простой, но по факту, все, кто создает DSL на основе текстовой информации, так или иначе сталкиваются с проблемой, у них возможно нет уверенности в том, что расширения не будут противоречивы.

Language Oriented Programming (LOP) в действии (Максим Мазин, ADD-2011).pdf

Другая проблема, которая мешает нам создавать DSLи. Допустим тем не менее, вопреки сложностями и проблемам с совместимостью разных расширений вы принимаете решение написать DSL. Пишите какой-нибудь препроцессор, натравливаете этот препроцессор на вашу программу вашими DSLными конструкциями, она компилирует и выдает какой-то код, байт-код например, или какой-то исполняемый код. Это все очень хорошо, но в наше время никто не пишет код, не используя IDE. Так не делают просто, потому что без использования IDE продуктивность разработчика драматически снижается. Поэтому в большинстве случаев, когда вы создадите такой DSL, будут ситуации, когда ваши разработчики, ваши коллеги, предпочтут использовать просто язык Java в Idea, просто язык C# вместе с ReSharperом, нежели брать ваше поделие, и что-то с помощью вашего поделия писать, потому что нет поддержки IDE.

Language Oriented Programming (LOP) в действии (Максим Мазин, ADD-2011).pdf

Под поддержкой IDE понимается все возможности, которые современные IDE оказывают разработчику. Т.е. это подсветка синтаксиса естественно, подсветка ошибок до компиляции, рефакторинг, интеграция с Version Control-ами, все остальное.

И да, можно отметить, что само по себе создание языка это решенная математическая задача. Если у вас есть пример для представления синтаксиса, вы сможете создать компилятор. Но она, тем не менее, трудоемкая, даже если вы используете компилятор компиляторов.

Language Oriented Programming (LOP) в действии (Максим Мазин, ADD-2011).pdf

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

Language Oriented Programming (LOP) в действии (Максим Мазин, ADD-2011).pdf

Существуют очень много разных попыток сделать это, поддержать DSL в том или ином виде, тема очень горячая, тут наверное еще можно добавить Nemerle, и может быть еще OCaml, сейчас есть очень много разных средств, чтобы создавать DSLи. В рамках Eclipsa существует XText-фреймворк, который позволяет написать грамматику и получить что-то вроде DSLя c поддержкой IDE.

Language Oriented Programming (LOP) в действии (Максим Мазин, ADD-2011).pdf

У всех у них есть проблемы. Главная проблема вытекает из того, что они ориентированы на текстовые грамматики. А раз они ориентированы на текстовые грамматики, то у них нет никаких шансов избежать проблемы совместимости конструкций.

Language Oriented Programming (LOP) в действии (Максим Мазин, ADD-2011).pdf

Но к счастью, в нашей компании JetBrains, была создана среда MPS.

Language Oriented Programming (LOP) в действии (Максим Мазин, ADD-2011).pdf

MPS означает meta-programming system, в основном предназначена для создания и расширения языков, причем такого расширения, что сразу после его создания появлялась поддержка IDE.

Language Oriented Programming (LOP) в действии (Максим Мазин, ADD-2011).pdf

Я уже много раз сказал, что текстовые грамматики неизбежно приводят к проблемам. Поэтому естественным решением является работа напрямую с AST → абстрактным синтаксическим деревом, и заставлять программиста прямо, напрямую создавать абстрактное синтаксическое дерево.

Language Oriented Programming (LOP) в действии (Максим Мазин, ADD-2011).pdf

Попытки такие ранее предпринимались, и как правило такие попытки сводятся к редактированию диаграмм. Рисуется диаграмма, в некотором смысле… у меня ребенок программирует на свойствах в большей степени, вы рисуете диаграммы, у вас получаются картинки, далее эти картинки собираются, получается код.

Есть проблема — рисовать эти картинки неудобно — мышкой хватать, таскать, неудобно. У нас, у программистов, есть привычка писать код вручную.

Поэтому в MPSе реализована концепция проекционных редакторов.

Language Oriented Programming (LOP) в действии (Максим Мазин, ADD-2011).pdf

О чем речь? Вот у вас есть абстрактное синтаксическое дерево. Т.е. это то представление программы, которое получается, в любом случае получается, когда парсер распарсил программу. В то же время, у вас есть его проекция, во что-то вроде текста.

Language Oriented Programming (LOP) в действии (Максим Мазин, ADD-2011).pdf

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

При этом воздействие на эти ячейки, когда вы пишете в эти ячейки, или каким-то образом на них воздействуете, то сразу же, мгновенно влияет на эту деревяшку. При этом наша цель, как разработчиков MPS, сделать так, чтобы вы вообще не чувствовали, что вы работаете не с текстом, а с напрямую с деревяшкой. Здесь конечно проблема, но те из вас, кто пользуются IDEA, должны понимать, что когда вы редактируете текст в IDEA, Eclipse или еще где-то, вы тоже не редактируете текст — вы тайпаете что-то, что поглощается IDEA, и она это во что-то превращает. В случае Eclipse это в большей степени редактирование текста, в случае IDEA — это еще меньше редактирования текста.

Language Oriented Programming (LOP) в действии (Максим Мазин, ADD-2011).pdf

У такого проекционного редактора есть положительные стороны, и есть отрицательные стороны. Положительные стороны понятны. У нас нет никаких текстовых грамматик, никакого текста, никаких проблем текстовых грамматик, никаких конфликтов, все совместимо, все очень хорошо.

Отрицательная сторона, состоит в том, что все-таки есть некоторое отличие от редактирования текста. В тоже самое время, (???) проблема. Дело в том, что привыкание… по нашему опыту, люди, которые начинают работать с MPSом, они привыкают к стилю программирования внутри MPSа, примерно в течении двух недель. Т.е. в течении этих двух недель они могут выдавать какую-то положительную обратную связь, о том, что им неудобно, непривычно, чем-то отличается от программирования в текстовом редакторе. Через две недели они привыкают и начинают работать с той же скоростью, как они работали ранее. Я надеюсь, что если вы попробуете скачать, и начнете пользоваться, то мы получим больший feedback, и мы сможем сделать проекционный редактор еще более похожим на текстовый редактор.

Language Oriented Programming (LOP) в действии (Максим Мазин, ADD-2011).pdf

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

Language Oriented Programming (LOP) в действии (Максим Мазин, ADD-2011).pdf

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

Вместе с MPSом, внутри него, поставляются разные языковые расширения, для работы с замыканиями, с коллекциями… и так далее. И некоторое количество языков для работы с XML, тупо для работы. Т.е. вы можете вводить XML, и что самое главное — генерировать XML из своего кода.

Language Oriented Programming (LOP) в действии (Максим Мазин, ADD-2011).pdf

Ну и еще есть некоторое количество языков, которые предназначены для создания языков. MPS в плане создания языков вполне честно (??? 16:20)

Вместо демонстрации — выглядит как-то так ↑.

Я показывают не со своего компьютера, поэтому все, кого интересует демонстрация, приглашаю на стенд в коридоре. Тут посмотрите, как просто взять и заDSLлить поддержку языковой конструкции.

Language Oriented Programming (LOP) в действии (Максим Мазин, ADD-2011).pdf

Фактически, это все, что я хотел рассказать, осталось несколько важных вещей.

Language Oriented Programming (LOP) в действии (Максим Мазин, ADD-2011).pdf

MSP подходит не только для создания языковых расширений, т.е. не только в Java можно добавить конструкций, которых в них не хватает, но также вы можете создавать какие-то собственные DSLи.

Вот например, Мартин Фаулер создал язык для описания своей финансовой отчетности.

Language Oriented Programming (LOP) в действии (Максим Мазин, ADD-2011).pdf

Кроме того, с помощью MPSа мы написали YouTrack, такой большой багтрекер — большой, в смысле с большим количеством кода (сгеренированного). Но мой предыдущий опыт разработки подсказывает мне, что код содержательный, который мы пишем и редактируем, этого кода достаточно мало. Опять таки интересующимся, мы на выходе можем показать, как выглядит код в редакторе, сколько там таблиц. Кода достаточно мало, из-за того, что уровень абстракции поднят достаточно высоко. Для разработки YouTrack был создан набор языков, часть этих языков открыта, а часть — закрыта. Мы их пока не отдаем, потому что они не достигли пока продажного качества.

Language Oriented Programming (LOP) в действии (Максим Мазин, ADD-2011).pdf

Вот, приложение настоящее, живое.

Language Oriented Programming (LOP) в действии (Максим Мазин, ADD-2011).pdf

У MPSа есть положительное свойство. Он «Apache 2.0»-лицензированный, абсолюно бесплатный, даже для коммерческого использования.

Language Oriented Programming (LOP) в действии (Максим Мазин, ADD-2011).pdf

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

(18:46)

Презентация

Примечания и отзывы

Максим Мазин рассказал о JetBrains MPS. Круто. Выше моего нынешнего уровня :). ©

Доклад для меня интересен, так как сама концепция DSL мне интересна. Понравилась уверенность, с которой выступал Максим, видно, что человек отлично знает свой предмет. Жаль, что MPS ориентирована в основном на Java. Как появится поддержка .NET ознакомлюсь подробнее. Пока же беру на заметку, вернусь к этой теме позже, когда буду плотнее заниматься Java. По поводу недостатков, пожалуй, только скучновато немного, можно поживее.

©
Первым был для меня доклад Максима Мазина про JetBrains'овский тул для DSL-центристской разработки. Тема не свежа и явно носит рекламный характер. К тому же доклад был изрядно скомкан и как-то оборван на полуслове. DSL — дело тонкое и холиварное, а подход JetBrains предлагает довольно радикальный (полагаться в разработке только на уникальный инструментарий мне кажется несколько неосмотрительным), и простого уменьшения SLOC явно недостаточно. Остальные аргументы были слабо озвучены. ©

После доклада про MPS я немного помучила Максима чтобы поближе рассмотреть MPS в действии на примере кусков кода для YouTrack. Впечатляет. Пока Sun Оракл раз за разом откладывает выпуск 1.7 со всякими ништяками в синтаксисе, в MPS можно написать все что нужно самостоятельно и с удовольствием использовать. Обязательно попробую что-нибудь сделать интересное с MPS.

©
доклад Максима Мазина о LOP - Language Oriented Programming и MPS (Meta Programming System) - продукте JetBrains, позволяющим, гм, визуально, конструировать DSL языки (и надстройки над существующими полноценными языками). Если мне не изменяет память, это был тот же самый доклад, который Максим рассказывал на JavaOne в Москве за две недели до этого, но, поскольку на JavaOne я его пропустил - в этот раз сходил на него и не пожалел.

Для меня это был один из самых интересных докладов, т.к. мы тоже занимаемся DSL (точнее, начинаем заниматься) в своем проекте, и тут любые знания и любой опыт кстати. Сам доклад был живой и интересный, но конечно, за отведенные 40 минут рассказать все было нереально. Именно потому после этого доклада большая толпа народа клубилась возле стойки с расшаренными мониторами в коридоре, выпытывая у Максима детали, наблюдая, как он вживую, при нас, реализует простейшую DSL-надстройку над Java (добавляет поддержку RW-lock на уровне синтаксиса), потом допиливает ее, добавляет туда поддержку Java-вских типов и прочее. Это общение о DSL-ах вообще и MPS в частности оставило очень хорошие воспоминания. Всегда приятно пообщаться со знатоками.

До этого я слышал про MPS, но разве что краем уха. Мне понравилась сама идея JetBrains - создать платформу / инструмент для облегчения разработки DSL-ей, и понравились те возможности, которые она дает. Стало даже немного обидно, что мы используем Eclipse и сильно на него завязаны :) Ну да ладно, JetBrains в любом случае молодцы, что смело вкладываются в продуктизацию таких черномагических (для многих) вещей, как метапрограммирование и DSL. Удачи вам в деле проталкивания этого на большой рынок!

©

Специальный инструмент от JetBrains для DSL.

Программы пишутся в PlainText, но редактор на лету конвертирует это в дерево выражений, исходники хранятся как дерево в XML. У нас в компании есть поборники DSL, так что на MPS посмотреть стоит. В самом докладе сильных технических подробностей не было, так что его можно и не смотреть.

Очень хороший и интересный доклад. Про концепцию не только реализации собственных DSL для классов задач, но, что интереснее, про реализацию расширений к языкам общего назначения, обеспечивающих те или иные типовые конструкции, применяемые при разработке в виде шаблонов. Смысл расширений — они позволяют скрыть громоздкие языковые конструкции, например, оформление определенных фрагментов кода в с блоками finaly и перехватом исключений. С помощью расширений можно комфортно использовать фреймфворки, которые требуют не только кода на Java, но, например, конфигураций в xml — описывая все на языке.

У JetBrains есть инструмент для реализации DSL и расширений — MPS. Получается компилятор и IntelliSense в редакторе. Пока поддерживается Java и интернет-стек — jscript, css, xml, а также можно делать автономные языки. Проект YouTrack делается на основе MPS, там ограниченная версия MPS используется, чтобы пользователь создавал расширения. Что важно, MPS обеспечивает контроль по синтаксису и по системе типов, а также проверяет совместимость различных расширений, если их хочется использовать совместно. Лицензия apache 2.0 — бесплатно для коммерческого использования.

Что еще интересно — концепция диалога для работы с MPS — проекционный редактор. Они отказались от графического представления. Выводится иерархия, псевдотекстовое представление, в котором можно редактировать отдельные элементы. По опыту, привыкание 2 недели — и позитивная обратная связь кончается.

В перерывах между докладами обсуждал с Мазиным идеи интерфейса YouTrack. Весьма интересно. Он говорит, что воплотили идеи Раскина — графически представляем, но описываем, правим и вводим текстом. Например, имеем набор дел, выбрали конкретное и командами меняем, а не gui. Программисты пользуются. hr они тоже учат их, но те предпочитают gui.

Один из разработчиков Meta Programming System про нее и рассказывал.

Что было до этого для DSL:

  • предметно-ориентированные конструкции в стандартных языках (например, synchronized в Java)
  • языковые расширения (проблемы совместимости друг с другом и поддержки IDE)

В отличие от языковых расширений MPS работает на уровне абстрактного синтаксического дерева, а не текстовой грамматики, чем устраняет проблему совместимости. Редактор свой, проекционный (работает с АСТ, который проецируется в текст). Привыкание — 2 недели.

Докладчик из самой, вероятно, известной российской (условно) фирмы-производителя ПО рассказывал про среду разработки DSL, которая называется MPS (Meta Programming System).

Про DSL вообще

Я пришел не с начала, может быть поэтому мне показалось, что автор так и не смог объяснить, как же оно работает. Мое понимание основано скорее на чтении сайта JetBrains. Поэтому — только несколько отрывочных тезисов.

  • Написание програм на DSL — это очень эффективно
  • Разработка собственных DSL — очень дорого само по себе, кроме того порождает несколько проблем, которые только увеличивают затраты:
    • Отсутствие поддержки со стороны IDE
    • Разные расширения, основанные на макроподстановке, могут конфликтовать друг с другом

Пример с интерполяцией (подстановкой) строк:

Расширения 1: int SomeCount = 1; var message = "Count is [SomeCount]";

Расширение 2: int SomeCount = 1; var message = "Count is %[SomeCount]"

  • Традиционный способ борьбы с этой проблемой — это работа через AST (Abstract Syntax Tree)
    • Ранее использовали графические языки
    • MPS — текстово-ориентированная среда для работы с AST

Про практическую работу в MPS

Как работают в MPS?

  • Определяют элементы языка (AST)
  • Определяют систему типов
  • Определяют конкретный синтаксис языка
  • (Опционально) Определяют трансляцию в другой язык (Java)

Основной целевой язык для MPS — конечно Java, хотя сейчас также поддерживаются CSS, XML, JavaScript. Флагманский продукт на MPS — приятный баг-трекер YouTrack

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

Из всех наших проектов единственным явным кандидатом на применение является GL-XML

Доклад читал человек из JetBrains — Максим Мазин, один из разработчиков YouTrack, активно участвующий в разработке предметно-ориентированных языков для нужд JetBrains.

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

В качестве решения, JetBrains предлагает свой продукт — среду языко-ориентированного программирования Meta Programming System(MPS). Эта среда предоставляет удобные механизмы для разработки собственного DSL и создания с его помощью программ в современном IDE. В частности, багтрекер YouTrack разработан именно с использованием MPS. В качестве иллюстрации своих слов, докладчик показал небольшое расширения для языка Java, добавляющее конструкцию для синхронизации доступа к разделяемым ресурсам — synchronized.

Работает это следующим образом:

  1. Исходный код приложения на разработанном языке (или с использованием расширения) обрабатывается препроцессором MPS, который осуществляет генерацию исходного кода, понятного компилятору языка общего назначения (в данном случае Java)
  2. Осуществляется компиляция сгенерированных исходников

Говоря о препроцессоре, докладчик отдельно упомянул, что, несмотря на текстовое представление внедряемых в язык узлов, они не является текстом (?!). Каждый узел «живёт» в своей ячейке, отображаемой с помощью текстового представления, а проекционный редактор MPS занимается изменением непосредственно абстрактного синтаксического дерева. В настоящий момент реализован ряд расширений языка Java с использованием MPS:

  1. Язык запросов к коллекциям
  2. Язык работы с датами
  3. Поддержка замыканий
  4. Язык описания регулярных выражений

MPS — опенсорсный бесплатный продукт, поэтому с его использованием можно разрабатывать свои DSL для любых задач. На вопрос одного из участников конференции о языковых расширениях для .NET/C# — сказали, что если в JetBrains будет разрабатываться проект на .NET, очень возможно, что они появятся, но пока нет ;(.

Уже после доклада, на стенде JetBrains разработчики продемонстрировали работу с MPS (в докладе этого не было, только слайды). Продукт выглядит интересно, наверное, имеет смысл посмотреть-изучить.

Кстати, хотелось бы отдельно отметить работу стенда JetBrains на конференции. Там присутствовали разработчики основных продуктов компании: Resharper, YouTrack, dotCover, Teamcity, можно было задать вопросы, получить ответы и скидку на лицензии Resharper и Teamcity. Разработчик Resharpera в ответ на мой вопрос о разрабатываемой в компании замене ставшего платным Reflector-а, по секрету ;) сообщил о том, что их бесплатный декомпилятор dotPeek почти готов и вот-вот (в течение одной-двух недель) появиться на сайте компании по программе Early Access. Показал его в работе (почти один в один Reflector) и пообещал тесную интеграцию с 6 м Resharper-ом.




Репликация: База Знаний «Заказных Информ Систем» → «Language Oriented Programming (LOP) в действии (Максим Мазин, ADD-2011)»

Любые правки этой статьи будут перезаписаны при следующем сеансе репликации. Если у вас есть серьезное замечание по тексту статьи, запишите его в раздел «discussion».