SlideShare a Scribd company logo
1 of 35
Download to read offline
Language Oriented Programming (LOP)
            в действии,
     как мы это делаем в JetBrains

           Максим Мазин
                 JetBrains
        Старший инженер-программист
          Maxim.Mazin@jetbrains.com
План

● Зачем расширять языки?
● Проблемы создания DSL
  ○ Совместимость
  ○ Поддержка со стороны IDE
● Подход среды MPS
  ○ Основная идея
  ○ Демонстрация
● MPS и предметно-ориентированные языки
Зачем расширять языки?

● Универсальные языки
  ○ Ограниченный набор конструкций общего
    назначения
  ○ Избыточность в описании предметной области
  ○ Низкая сопровождаемость кода
● Предметно-ориентированные языки
  ○ Более высокий уровень абстракции
  ○ Лучшая сопровождаемость кода
Неявные языковые расширения
Предметно-ориентированные конструкции в
универсальных языках
 ● Блок synchronized в языке Java
 ● Перегрузка операторов в языке C++
Блок synchronized в Java

Вместо                    Можно написать

lock.lock();               synchronized (lock) {
try {                        // полезный код
    // полезный код        }
} finally {
    lock.unlock();
}
Перегрузка операторов в C++

Вместо                          Можно написать

Complex c = new Complex(1,2);   complex c(1,2);
Complex d = c.add(a);           complex d = c + a;
Языковые расширения
● Существующие расширения
  ○ Удовлетворяют нужды конкретных предметных
    областей
  ○ Встроены в универсальные языки
● Новые расширения
  ○ Трудно встраивать
  ○ Риск несовместимости
План

● Зачем расширять языки?
● Проблемы создания DSL
  ○ Совместимость
  ○ Поддержка со стороны IDE
● Подход среды MPS
  ○ Основная идея
  ○ Демонстрация
● MPS и предметно-ориентированные языки
Совместимость



Компоненты совместимы, когда могут
быть использованы совместно даже,
если были созданы независимо.
Совместимость
              Конечная цель
Java-библиотеки          Расширения Java
 ● Hibernate              ● DB Language
 ● Spring                 ● DI Language
 ● Joda Time              ● Dates Language
Совместимость
           Библиотеки и расширения
● Библиотеки совместимы
  ○ Java + Hibernate = OK
  ○ Java + Spring = OK
  ○ Java + Hibernate + Spring = OK
● Языковые расширения — нет
  ○ Java + extension A = OK
  ○ Java + extension B = OK
  ○ Java + extensions A, B = возможна неоднозначность
Совместимость
         Грамматическая неоднозначность
● Расширение A
int resultsCount = <some_code>;
string s = "We found ${resultCount} results";


● Расширение B
int resultCount = <some_code>;
string t = "We found {resultCount} results";


● A + B программа становится неоднозначной
string s = "Account balance is ${balance}";
Разработка языка
                  Требования
● Общая инфраструктура
  ○ Синтаксис
  ○ Система типов
  ○ Операционная семантика
  ○ и т.д.
Разработка языка
                  Требования
● Общая инфраструктура
  ○ Синтаксис
  ○ Система типов
  ○ Операционная семантика
  ○ и т.д.
● Поддержка со стороны IDE
  ○ Редактор
  ○ Подсветка ошибок
  ○ Рафакторинги
  ○ Контроль версий
  ○ Отладчик
  ○ и т.п.
Разработка языка
                   Проблемы
● Ресурсоемкая задача
  ○ Сложные алгоритмы обработки кода
  ○ Разнообразие поддерживаемых технологий
  ○ Необходимость высокой квалификации разработчиков
● Совместимость инфраструктуры
  ○ Совместимость систем типов различных расширений
  ○ Поддержка возможных расширений рефакторингами
  ○ и т.д.
Существующие решения


                                     Языковая
                   Совместимость
                                   инфраструктура

LISP                    Да              Нет

Внутренние языки
                        Да              Нет
в Ruby / Groovy

XText framework         Нет             Да
Общие проблемы

● Существующие решения обеспечивают
  ○ Либо совместимость языковых расширений
  ○ Либо языковую инфраструктуру


● Но не одновременно
План

● Зачем расширять языки?
● Проблемы создания DSL
  ○ Совместимость
  ○ Поддержка со стороны IDE
● Подход среды MPS
  ○ Основная идея
  ○ Демонстрация
● MPS и предметно-ориентированные языки
JetBrains MPS
● MetaProgramming System

● Среда для создания и расширения языков

● IDE для созданных языков и расширений
Основная идея

   Текстовые грамматики приводят к
          неоднозначности

       Необходим иной подход


      MPS работает с абстрактным
синтаксическим деревом (АСД) напрямую
Основная идея
            Редактирование АСД
● Предыдущие попытки
  ○ Редактирование диаграмм
  ○ Ограниченный набор применений



● Решение MPS
  ○ Сохраняет привычную для пользователя среду
  ○ Поддерживает текстоподобное редактирование
Основная идея
          Проекционный редактор




● У каждого узла синтаксического дерева
  есть проекция в редакторе MPS
Основная идея
          Проекционный редактор




● Каждый узел «живет» в своей ячейке
● Узел отображается в виде
  текстового/символьного представления
● Редактирование проекции мгновенно отражается
  на синтаксическом дереве
Основная идея
       Обычный текст и проекции
● У текстоподобного проекционного
  редатора есть преимущества и
  недостатки

● Привыкание — около двух недель
Создание языков

● Инфраструктура создания языков
  ○ Метамодель языка (абстрактный синтаксис)
  ○ Система типов
  ○ Редакторы (конкретный синтаксис)
  ○ Компилятор (операционная семантка)
  ○ и т.д.

● Средства IDE
  ○ Автозавершение кода
  ○ Поиск использований
  ○ Переименование
  ○ Отладка
  ○ и т.д.
Готовые MPS-языки
● Реализация Java™ в среде MPS +
  расширения
  ○ Функциональные коллекции (collections language)
  ○ Даты (dates language)
  ○ Замыкания (closures language)
  ○ Регулярные выражения (regexp language)
  ○ и т.д.
● Языки для определения языков
  ○ Реализованы с помощью самих себя (bootstrapping)
● Разнообразные языки (XML и т.п.)
Демонстрация
           Добавление конструкции read lock

Java                             Java + Расширение

ReadWriteLock l = …              ReadWriteLock l = …
l.readLock().lock();             read (l) {
try {                              // полезный код
    // полезный код              }
} finally {
    l.readLock().unlock();
}
План

● Зачем расширять языки?
● Проблемы создания DSL
  ○ Совместимость
  ○ Поддержка со стороны IDE
● Подход среды MPS
  ○ Основная идея
  ○ Демонстрация
● MPS и предметно-ориентированные языки
Domain-Specific Languages

● Среда MPS прекрасно подходит для
  создания DSL

● Общие языковые части могут быть
  переиспользованы (например, выражения)

● Можно внедрять конструкции универсальных
  языков программирования (например, Java)
  внутрь своих DSL
Domain-Specific Languages
         Пример
Существующие приложения

● YouTrack – bug & issue tracker
  ○ Целиком разработана в MPS


● Языки для web-разработки
  ○ DNQ (Data Navigation and Queries)
  ○ Webr
  ○ Spring language
  ○ и т.д.
Существующие приложения
Лицензия

● Оpen-sourced
● Apache 2.0 License



   MPS — совсем
    бесплатный
Ссылки

Скачать MPS
http://www.jetbrains.com/mps

Блог про MPS
http://blogs.jetbrains.com/mps
Вопросы?

More Related Content

What's hot

CodeFest 2012. Гладкий Д. — Практика применения MPS на примере проекта «Mobil...
CodeFest 2012. Гладкий Д. — Практика применения MPS на примере проекта «Mobil...CodeFest 2012. Гладкий Д. — Практика применения MPS на примере проекта «Mobil...
CodeFest 2012. Гладкий Д. — Практика применения MPS на примере проекта «Mobil...
CodeFest
 
Platypus platform ivbit
Platypus platform ivbitPlatypus platform ivbit
Platypus platform ivbit
jskonst
 
03 т сервис
03 т сервис03 т сервис
03 т сервис
Goudron1979
 
Встраивание Python в мобильные приложения – нюансы interoperation, новые подх...
Встраивание Python в мобильные приложения – нюансы interoperation, новые подх...Встраивание Python в мобильные приложения – нюансы interoperation, новые подх...
Встраивание Python в мобильные приложения – нюансы interoperation, новые подх...
Anthony Marchenko
 
Алексей Воинов — Языки программирования
Алексей Воинов — Языки программированияАлексей Воинов — Языки программирования
Алексей Воинов — Языки программирования
Yandex
 
Multilanguage Drupal
Multilanguage DrupalMultilanguage Drupal
Multilanguage Drupal
Inna Tuyeva
 
Tech Talks @NSU: Back to the Future: Функциональное программирование вчера и ...
Tech Talks @NSU: Back to the Future: Функциональное программирование вчера и ...Tech Talks @NSU: Back to the Future: Функциональное программирование вчера и ...
Tech Talks @NSU: Back to the Future: Функциональное программирование вчера и ...
Tech Talks @NSU
 
использование .Net framework
использование .Net frameworkиспользование .Net framework
использование .Net framework
jskonst
 

What's hot (20)

CodeFest 2012. Гладкий Д. — Практика применения MPS на примере проекта «Mobil...
CodeFest 2012. Гладкий Д. — Практика применения MPS на примере проекта «Mobil...CodeFest 2012. Гладкий Д. — Практика применения MPS на примере проекта «Mobil...
CodeFest 2012. Гладкий Д. — Практика применения MPS на примере проекта «Mobil...
 
OOP и WordPress. Подумаем о будущем проекта.
OOP и WordPress. Подумаем о будущем проекта.OOP и WordPress. Подумаем о будущем проекта.
OOP и WordPress. Подумаем о будущем проекта.
 
Platypus platform ivbit
Platypus platform ivbitPlatypus platform ivbit
Platypus platform ivbit
 
Завершающая лекция - часть 1 - информатика и зомби
Завершающая лекция - часть 1 - информатика и зомбиЗавершающая лекция - часть 1 - информатика и зомби
Завершающая лекция - часть 1 - информатика и зомби
 
Php and frameworks
Php and frameworksPhp and frameworks
Php and frameworks
 
03 т сервис
03 т сервис03 т сервис
03 т сервис
 
Встраивание Python в мобильные приложения – нюансы interoperation, новые подх...
Встраивание Python в мобильные приложения – нюансы interoperation, новые подх...Встраивание Python в мобильные приложения – нюансы interoperation, новые подх...
Встраивание Python в мобильные приложения – нюансы interoperation, новые подх...
 
Смолина Пользовательские интерфейсы систем лингвистической разметки текстов
Смолина Пользовательские интерфейсы систем лингвистической разметки текстовСмолина Пользовательские интерфейсы систем лингвистической разметки текстов
Смолина Пользовательские интерфейсы систем лингвистической разметки текстов
 
Kranonit s16 (python). sergey burma
Kranonit s16 (python). sergey burmaKranonit s16 (python). sergey burma
Kranonit s16 (python). sergey burma
 
DLR Hosting
DLR HostingDLR Hosting
DLR Hosting
 
Алексей Воинов — Языки программирования
Алексей Воинов — Языки программированияАлексей Воинов — Языки программирования
Алексей Воинов — Языки программирования
 
Памятка о php-шниках
Памятка о php-шникахПамятка о php-шниках
Памятка о php-шниках
 
Multilanguage Drupal
Multilanguage DrupalMultilanguage Drupal
Multilanguage Drupal
 
Tech Talks @NSU: Back to the Future: Функциональное программирование вчера и ...
Tech Talks @NSU: Back to the Future: Функциональное программирование вчера и ...Tech Talks @NSU: Back to the Future: Функциональное программирование вчера и ...
Tech Talks @NSU: Back to the Future: Функциональное программирование вчера и ...
 
C++ STL & Qt. Занятие 09.
C++ STL & Qt. Занятие 09.C++ STL & Qt. Занятие 09.
C++ STL & Qt. Занятие 09.
 
OO Design with C++: 0. Intro
OO Design with C++: 0. IntroOO Design with C++: 0. Intro
OO Design with C++: 0. Intro
 
ньюансы разработки видео для мобильных устройств
ньюансы разработки видео для мобильных устройствньюансы разработки видео для мобильных устройств
ньюансы разработки видео для мобильных устройств
 
неприятная правда про язык go
неприятная правда про язык goнеприятная правда про язык go
неприятная правда про язык go
 
использование .Net framework
использование .Net frameworkиспользование .Net framework
использование .Net framework
 
Operden1
Operden1Operden1
Operden1
 

Similar to Language oriented programming_(lop)_в_действии_(максим_мазин,_add-2011)

Терминология как основной способ поиска разработчиков или как не опозорится п...
Терминология как основной способ поиска разработчиков или как не опозорится п...Терминология как основной способ поиска разработчиков или как не опозорится п...
Терминология как основной способ поиска разработчиков или как не опозорится п...
SBTech
 
CodeFest 2013. Лузин А. — Бэкенд-винегрет: как подружить разные ЯП на ваших с...
CodeFest 2013. Лузин А. — Бэкенд-винегрет: как подружить разные ЯП на ваших с...CodeFest 2013. Лузин А. — Бэкенд-винегрет: как подружить разные ЯП на ваших с...
CodeFest 2013. Лузин А. — Бэкенд-винегрет: как подружить разные ЯП на ваших с...
CodeFest
 
Orxan9r2 klassifikasiya programmnoqo_obespeceniya
Orxan9r2 klassifikasiya programmnoqo_obespeceniyaOrxan9r2 klassifikasiya programmnoqo_obespeceniya
Orxan9r2 klassifikasiya programmnoqo_obespeceniya
orxan9r2
 
Back to the Future: Функциональное программирование вчера и сегодня
Back to the Future: Функциональное программирование вчера и сегодняBack to the Future: Функциональное программирование вчера и сегодня
Back to the Future: Функциональное программирование вчера и сегодня
Tech Talks @NSU
 
CodeFest 2012. Сидельников А. — Опыт создания DSL на Ruby. Где применить, как...
CodeFest 2012. Сидельников А. — Опыт создания DSL на Ruby. Где применить, как...CodeFest 2012. Сидельников А. — Опыт создания DSL на Ruby. Где применить, как...
CodeFest 2012. Сидельников А. — Опыт создания DSL на Ruby. Где применить, как...
CodeFest
 

Similar to Language oriented programming_(lop)_в_действии_(максим_мазин,_add-2011) (20)

Терминология как основной способ поиска разработчиков или как не опозорится п...
Терминология как основной способ поиска разработчиков или как не опозорится п...Терминология как основной способ поиска разработчиков или как не опозорится п...
Терминология как основной способ поиска разработчиков или как не опозорится п...
 
Progopedia - OSDN
Progopedia - OSDNProgopedia - OSDN
Progopedia - OSDN
 
MПК3 - SDL - Опыт внедрения решений SDL Trados в российских переводческих ком...
MПК3 - SDL - Опыт внедрения решений SDL Trados в российских переводческих ком...MПК3 - SDL - Опыт внедрения решений SDL Trados в российских переводческих ком...
MПК3 - SDL - Опыт внедрения решений SDL Trados в российских переводческих ком...
 
Компьютерная графика. Введение в Processing
Компьютерная графика. Введение в ProcessingКомпьютерная графика. Введение в Processing
Компьютерная графика. Введение в Processing
 
Algorithms and programming lecture in ru
Algorithms and programming lecture in ruAlgorithms and programming lecture in ru
Algorithms and programming lecture in ru
 
Алгоритмизация и программирование С/С++
Алгоритмизация и  программирование С/С++Алгоритмизация и  программирование С/С++
Алгоритмизация и программирование С/С++
 
терминология vol.2
терминология vol.2терминология vol.2
терминология vol.2
 
TypeScript
TypeScriptTypeScript
TypeScript
 
CodeFest 2013. Лузин А. — Бэкенд-винегрет: как подружить разные ЯП на ваших с...
CodeFest 2013. Лузин А. — Бэкенд-винегрет: как подружить разные ЯП на ваших с...CodeFest 2013. Лузин А. — Бэкенд-винегрет: как подружить разные ЯП на ваших с...
CodeFest 2013. Лузин А. — Бэкенд-винегрет: как подружить разные ЯП на ваших с...
 
Фронтенд в Яндексе
Фронтенд в ЯндексеФронтенд в Яндексе
Фронтенд в Яндексе
 
378 васильев куницын
378 васильев куницын378 васильев куницын
378 васильев куницын
 
Никита Вельмаскин - Интерпретатор или думаем над скриптовым движком для Ваше...
Никита Вельмаскин -  Интерпретатор или думаем над скриптовым движком для Ваше...Никита Вельмаскин -  Интерпретатор или думаем над скриптовым движком для Ваше...
Никита Вельмаскин - Интерпретатор или думаем над скриптовым движком для Ваше...
 
Orxan9r2 klassifikasiya programmnoqo_obespeceniya
Orxan9r2 klassifikasiya programmnoqo_obespeceniyaOrxan9r2 klassifikasiya programmnoqo_obespeceniya
Orxan9r2 klassifikasiya programmnoqo_obespeceniya
 
Михаил Корепанов "Инкрементальные обновления на клиенте. Ловкость рук и никак...
Михаил Корепанов "Инкрементальные обновления на клиенте. Ловкость рук и никак...Михаил Корепанов "Инкрементальные обновления на клиенте. Ловкость рук и никак...
Михаил Корепанов "Инкрементальные обновления на клиенте. Ловкость рук и никак...
 
Back to the Future: Функциональное программирование вчера и сегодня
Back to the Future: Функциональное программирование вчера и сегодняBack to the Future: Функциональное программирование вчера и сегодня
Back to the Future: Функциональное программирование вчера и сегодня
 
C++ Базовый. Занятие 01.
C++ Базовый. Занятие 01.C++ Базовый. Занятие 01.
C++ Базовый. Занятие 01.
 
Фронтенд в Яндексе
Фронтенд в ЯндексеФронтенд в Яндексе
Фронтенд в Яндексе
 
Фронтенд в Яндексе
Фронтенд в ЯндексеФронтенд в Яндексе
Фронтенд в Яндексе
 
CodeFest 2012. Сидельников А. — Опыт создания DSL на Ruby. Где применить, как...
CodeFest 2012. Сидельников А. — Опыт создания DSL на Ruby. Где применить, как...CodeFest 2012. Сидельников А. — Опыт создания DSL на Ruby. Где применить, как...
CodeFest 2012. Сидельников А. — Опыт создания DSL на Ruby. Где применить, как...
 
SECON'2016. Бартунов Олег, Карьера в Open Source
SECON'2016. Бартунов Олег, Карьера в Open SourceSECON'2016. Бартунов Олег, Карьера в Open Source
SECON'2016. Бартунов Олег, Карьера в Open Source
 

More from Sergey Polazhenko

Altoros - Cloud platform overview
Altoros - Cloud platform overviewAltoros - Cloud platform overview
Altoros - Cloud platform overview
Sergey Polazhenko
 
Helios - Тучин - Планирование первых шагов в ITSM
Helios - Тучин - Планирование первых шагов в ITSMHelios - Тучин - Планирование первых шагов в ITSM
Helios - Тучин - Планирование первых шагов в ITSM
Sergey Polazhenko
 
Солидекс ПИ - ЦОДы
Солидекс ПИ - ЦОДыСолидекс ПИ - ЦОДы
Солидекс ПИ - ЦОДы
Sergey Polazhenko
 
Андрей Купченко - Active.by Облачные технологии в Беларуси
Андрей Купченко - Active.by Облачные технологии в БеларусиАндрей Купченко - Active.by Облачные технологии в Беларуси
Андрей Купченко - Active.by Облачные технологии в Беларуси
Sergey Polazhenko
 
ISS Advanced - Finance Managment
ISS Advanced - Finance ManagmentISS Advanced - Finance Managment
ISS Advanced - Finance Managment
Sergey Polazhenko
 
It-tuning itsm_business_continuity
It-tuning itsm_business_continuityIt-tuning itsm_business_continuity
It-tuning itsm_business_continuity
Sergey Polazhenko
 
Алферов - Роль бизнес заказчика 2012
Алферов - Роль бизнес заказчика 2012Алферов - Роль бизнес заказчика 2012
Алферов - Роль бизнес заказчика 2012
Sergey Polazhenko
 
Белнетэксперт - СХД
Белнетэксперт - СХДБелнетэксперт - СХД
Белнетэксперт - СХД
Sergey Polazhenko
 
Новаком Групп - Service Desk через Ecm
Новаком Групп - Service Desk через EcmНоваком Групп - Service Desk через Ecm
Новаком Групп - Service Desk через Ecm
Sergey Polazhenko
 
Виктор Минин - Содит, концепция развития
Виктор Минин - Содит, концепция развитияВиктор Минин - Содит, концепция развития
Виктор Минин - Содит, концепция развития
Sergey Polazhenko
 
Владимир Бузмаков - ВОО "Сообщество ИТ-директоров Украины"
Владимир Бузмаков - ВОО "Сообщество ИТ-директоров Украины"Владимир Бузмаков - ВОО "Сообщество ИТ-директоров Украины"
Владимир Бузмаков - ВОО "Сообщество ИТ-директоров Украины"
Sergey Polazhenko
 
Ямов Сергей - itSMF Россия
Ямов Сергей - itSMF РоссияЯмов Сергей - itSMF Россия
Ямов Сергей - itSMF Россия
Sergey Polazhenko
 

More from Sergey Polazhenko (20)

Concert Venue "Brugge" in Minsk, Belarus
Concert Venue "Brugge" in Minsk, BelarusConcert Venue "Brugge" in Minsk, Belarus
Concert Venue "Brugge" in Minsk, Belarus
 
AheadWorks 5-cases
AheadWorks 5-casesAheadWorks 5-cases
AheadWorks 5-cases
 
секреты продаж It решений в снг
секреты продаж It решений в снгсекреты продаж It решений в снг
секреты продаж It решений в снг
 
Altoros clouds overview1
Altoros clouds overview1Altoros clouds overview1
Altoros clouds overview1
 
Altoros - Cloud platform overview
Altoros - Cloud platform overviewAltoros - Cloud platform overview
Altoros - Cloud platform overview
 
Helios - Тучин - Планирование первых шагов в ITSM
Helios - Тучин - Планирование первых шагов в ITSMHelios - Тучин - Планирование первых шагов в ITSM
Helios - Тучин - Планирование первых шагов в ITSM
 
Солидекс ПИ - ЦОДы
Солидекс ПИ - ЦОДыСолидекс ПИ - ЦОДы
Солидекс ПИ - ЦОДы
 
Андрей Купченко - Active.by Облачные технологии в Беларуси
Андрей Купченко - Active.by Облачные технологии в БеларусиАндрей Купченко - Active.by Облачные технологии в Беларуси
Андрей Купченко - Active.by Облачные технологии в Беларуси
 
ISS Advance - HR Managment
ISS Advance - HR ManagmentISS Advance - HR Managment
ISS Advance - HR Managment
 
ISS Advanced - Finance Managment
ISS Advanced - Finance ManagmentISS Advanced - Finance Managment
ISS Advanced - Finance Managment
 
It-tuning itsm_pm
It-tuning itsm_pmIt-tuning itsm_pm
It-tuning itsm_pm
 
It-tuning itsm_business_continuity
It-tuning itsm_business_continuityIt-tuning itsm_business_continuity
It-tuning itsm_business_continuity
 
Buzmakov
BuzmakovBuzmakov
Buzmakov
 
Алферов - Роль бизнес заказчика 2012
Алферов - Роль бизнес заказчика 2012Алферов - Роль бизнес заказчика 2012
Алферов - Роль бизнес заказчика 2012
 
Белнетэксперт - СХД
Белнетэксперт - СХДБелнетэксперт - СХД
Белнетэксперт - СХД
 
Новаком Групп - Service Desk через Ecm
Новаком Групп - Service Desk через EcmНоваком Групп - Service Desk через Ecm
Новаком Групп - Service Desk через Ecm
 
Виктор Минин - Содит, концепция развития
Виктор Минин - Содит, концепция развитияВиктор Минин - Содит, концепция развития
Виктор Минин - Содит, концепция развития
 
Владимир Бузмаков - ВОО "Сообщество ИТ-директоров Украины"
Владимир Бузмаков - ВОО "Сообщество ИТ-директоров Украины"Владимир Бузмаков - ВОО "Сообщество ИТ-директоров Украины"
Владимир Бузмаков - ВОО "Сообщество ИТ-директоров Украины"
 
Ямов Сергей - itSMF Россия
Ямов Сергей - itSMF РоссияЯмов Сергей - itSMF Россия
Ямов Сергей - itSMF Россия
 
Sqa Days 11 Kiev About
Sqa Days 11 Kiev AboutSqa Days 11 Kiev About
Sqa Days 11 Kiev About
 

Language oriented programming_(lop)_в_действии_(максим_мазин,_add-2011)

  • 1. Language Oriented Programming (LOP) в действии, как мы это делаем в JetBrains Максим Мазин JetBrains Старший инженер-программист Maxim.Mazin@jetbrains.com
  • 2. План ● Зачем расширять языки? ● Проблемы создания DSL ○ Совместимость ○ Поддержка со стороны IDE ● Подход среды MPS ○ Основная идея ○ Демонстрация ● MPS и предметно-ориентированные языки
  • 3. Зачем расширять языки? ● Универсальные языки ○ Ограниченный набор конструкций общего назначения ○ Избыточность в описании предметной области ○ Низкая сопровождаемость кода ● Предметно-ориентированные языки ○ Более высокий уровень абстракции ○ Лучшая сопровождаемость кода
  • 4. Неявные языковые расширения Предметно-ориентированные конструкции в универсальных языках ● Блок synchronized в языке Java ● Перегрузка операторов в языке C++
  • 5. Блок synchronized в Java Вместо Можно написать lock.lock(); synchronized (lock) { try { // полезный код // полезный код } } finally { lock.unlock(); }
  • 6. Перегрузка операторов в C++ Вместо Можно написать Complex c = new Complex(1,2); complex c(1,2); Complex d = c.add(a); complex d = c + a;
  • 7. Языковые расширения ● Существующие расширения ○ Удовлетворяют нужды конкретных предметных областей ○ Встроены в универсальные языки ● Новые расширения ○ Трудно встраивать ○ Риск несовместимости
  • 8. План ● Зачем расширять языки? ● Проблемы создания DSL ○ Совместимость ○ Поддержка со стороны IDE ● Подход среды MPS ○ Основная идея ○ Демонстрация ● MPS и предметно-ориентированные языки
  • 9. Совместимость Компоненты совместимы, когда могут быть использованы совместно даже, если были созданы независимо.
  • 10. Совместимость Конечная цель Java-библиотеки Расширения Java ● Hibernate ● DB Language ● Spring ● DI Language ● Joda Time ● Dates Language
  • 11. Совместимость Библиотеки и расширения ● Библиотеки совместимы ○ Java + Hibernate = OK ○ Java + Spring = OK ○ Java + Hibernate + Spring = OK ● Языковые расширения — нет ○ Java + extension A = OK ○ Java + extension B = OK ○ Java + extensions A, B = возможна неоднозначность
  • 12. Совместимость Грамматическая неоднозначность ● Расширение A int resultsCount = <some_code>; string s = "We found ${resultCount} results"; ● Расширение B int resultCount = <some_code>; string t = "We found {resultCount} results"; ● A + B программа становится неоднозначной string s = "Account balance is ${balance}";
  • 13. Разработка языка Требования ● Общая инфраструктура ○ Синтаксис ○ Система типов ○ Операционная семантика ○ и т.д.
  • 14. Разработка языка Требования ● Общая инфраструктура ○ Синтаксис ○ Система типов ○ Операционная семантика ○ и т.д. ● Поддержка со стороны IDE ○ Редактор ○ Подсветка ошибок ○ Рафакторинги ○ Контроль версий ○ Отладчик ○ и т.п.
  • 15. Разработка языка Проблемы ● Ресурсоемкая задача ○ Сложные алгоритмы обработки кода ○ Разнообразие поддерживаемых технологий ○ Необходимость высокой квалификации разработчиков ● Совместимость инфраструктуры ○ Совместимость систем типов различных расширений ○ Поддержка возможных расширений рефакторингами ○ и т.д.
  • 16. Существующие решения Языковая Совместимость инфраструктура LISP Да Нет Внутренние языки Да Нет в Ruby / Groovy XText framework Нет Да
  • 17. Общие проблемы ● Существующие решения обеспечивают ○ Либо совместимость языковых расширений ○ Либо языковую инфраструктуру ● Но не одновременно
  • 18. План ● Зачем расширять языки? ● Проблемы создания DSL ○ Совместимость ○ Поддержка со стороны IDE ● Подход среды MPS ○ Основная идея ○ Демонстрация ● MPS и предметно-ориентированные языки
  • 19. JetBrains MPS ● MetaProgramming System ● Среда для создания и расширения языков ● IDE для созданных языков и расширений
  • 20. Основная идея Текстовые грамматики приводят к неоднозначности Необходим иной подход MPS работает с абстрактным синтаксическим деревом (АСД) напрямую
  • 21. Основная идея Редактирование АСД ● Предыдущие попытки ○ Редактирование диаграмм ○ Ограниченный набор применений ● Решение MPS ○ Сохраняет привычную для пользователя среду ○ Поддерживает текстоподобное редактирование
  • 22. Основная идея Проекционный редактор ● У каждого узла синтаксического дерева есть проекция в редакторе MPS
  • 23. Основная идея Проекционный редактор ● Каждый узел «живет» в своей ячейке ● Узел отображается в виде текстового/символьного представления ● Редактирование проекции мгновенно отражается на синтаксическом дереве
  • 24. Основная идея Обычный текст и проекции ● У текстоподобного проекционного редатора есть преимущества и недостатки ● Привыкание — около двух недель
  • 25. Создание языков ● Инфраструктура создания языков ○ Метамодель языка (абстрактный синтаксис) ○ Система типов ○ Редакторы (конкретный синтаксис) ○ Компилятор (операционная семантка) ○ и т.д. ● Средства IDE ○ Автозавершение кода ○ Поиск использований ○ Переименование ○ Отладка ○ и т.д.
  • 26. Готовые MPS-языки ● Реализация Java™ в среде MPS + расширения ○ Функциональные коллекции (collections language) ○ Даты (dates language) ○ Замыкания (closures language) ○ Регулярные выражения (regexp language) ○ и т.д. ● Языки для определения языков ○ Реализованы с помощью самих себя (bootstrapping) ● Разнообразные языки (XML и т.п.)
  • 27. Демонстрация Добавление конструкции read lock Java Java + Расширение ReadWriteLock l = … ReadWriteLock l = … l.readLock().lock(); read (l) { try { // полезный код // полезный код } } finally { l.readLock().unlock(); }
  • 28. План ● Зачем расширять языки? ● Проблемы создания DSL ○ Совместимость ○ Поддержка со стороны IDE ● Подход среды MPS ○ Основная идея ○ Демонстрация ● MPS и предметно-ориентированные языки
  • 29. Domain-Specific Languages ● Среда MPS прекрасно подходит для создания DSL ● Общие языковые части могут быть переиспользованы (например, выражения) ● Можно внедрять конструкции универсальных языков программирования (например, Java) внутрь своих DSL
  • 31. Существующие приложения ● YouTrack – bug & issue tracker ○ Целиком разработана в MPS ● Языки для web-разработки ○ DNQ (Data Navigation and Queries) ○ Webr ○ Spring language ○ и т.д.
  • 33. Лицензия ● Оpen-sourced ● Apache 2.0 License MPS — совсем бесплатный