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

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

Материал из CustisWiki

Версия от 17:27, 30 мая 2011; StasFomin (обсуждение | вклад) (Примечания и отзывы)

Это снимок страницы. Он включает старые, но не удалённые версии шаблонов и изображений.
Перейти к: навигация, поиск

Аннотация

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

Если бы у нас, разработчиков, была такая возможность, мы бы применяли предметно-ориентированные языки (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 в реальной практике, ведь создавать собственные языки — это так круто!

Видео

Видео в HD-качестве, смотрите в полноэкранном режиме.

HTML-код включения <iframe src="http://player.vimeo.com/video/23762931?byline=0&portrait=0" width="720" height="405" frameborder="0"></iframe>

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


Для этого доклада нужен подкаст (аудиозапись)?

  •  Да, многое понятно и без видео части, есть смысл его прослушать.
  •  Нет, аудиозапись бесполезна (не понять без видео или вообще мало смысла в докладе).

Презентация

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

Максим Мазин рассказал о 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-ом.


Призыв к зрителям!

Мы призываем всех зрителей видеозаписей докладов давать хоть какой-нибудь, желательно конструктивный feedback.

Где? — неважно. В блогах, в форумах, в комментах — пофиг, лишь бы можно было найти, например, поиском по блогам, по ключевому слову «ADD-2011» (ну и/или по названию доклада).

Что-то побольше твиттер-вскрика, хотя бы пару абзацев. Да, иногда краткая характеристика бывает достаточной («маркетинговый булшит», «унылый самопиар» — обычно в адрес «спонсорских докладов»), но это очень, очень редко, а так хочется прочитать что-то большее, чем «сижу на XXX, говорят о YYY».

Что писать? Что хорошо, что плохо («плохо» неудачное слово, скажем, «неправильно на ваш взгляд»), как вы поняли то, что рассказано, как это спроецировалось конкретно на вас — все это фантастически важно и полезно:

  • Другим потенциальным зрителям (смотреть/не смотреть, «правильно ли я понял»).
  • И докладчикам:
    • «Правильно ли меня поняли»,
    • «Что я делал правильно, а что улучшить»
    • Даже критический отзыв лучше, чем никакого!
    • Плюс — это мотивация, это награда за немалый труд многие готовятся долго, раскрывают свой опыт, старательно делают слайды, репетируют выступление — и ради чего? двадцать минут театра перед парой десятков зритетелей и все?
  • Организаторам конференций (этой и других) — они внимательно следят за отзывами, и пытаются понять, кого имеет смысл звать («рубит фишку и жжет!»), а к кому отнестись скептически, и если брать, то, например, «прокачать в части выступлений» — мы, например, старались это делать, итеративно рецензировали слайды, рассылали подборку литературы о правильных слайдах и искусстве выступлений.
  • Безотносительно лично докладчиков — важно понять, исчерпала себя тема или для народа еще остаются откровениями то, что для более пресыщенных инфопотоками людей (а организаторы обычно такие) уже выглядит как «аццкий боян». Ну и вообще — что еще интересно, и что было бы интересно услышать-увидеть-пообщаться на тему о…
  • Ну и кстати, мне тоже важно — вообще имел ли смысл весь этот сыр-бор с сьемкой, видеомонтажем и обработкой и публикацией (это, вообще-то дорогая работа, расценки профессионалов в этой области весьма недетские, при том, что до этого уровня монтажа им, как правило очень далеко), или кроме участников конференции эти темы никому не интересны. Может есть какие-то косяки в видео? или предложения как сделать лучше? — связывайтесь со мной, возможно это можно будет исправить (или хотя бы вырезать). Это кстати относится и к докладчикам — если есть какие-то позорные неудачные моменты, или что-то не нравится — это можно убрать.


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


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