SlideShare a Scribd company logo
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

PDF
Повышаем и следим за качеством PHP кода
PPTX
Как писать на PHP и не стать быдло-кодером
PDF
Как и зачем можно создать DSL на Python
PDF
Rust - GDG DevFest Siberia 2016
ODP
игровая логика, проблемы и решения
PDF
Владислав Грязнов "Многозадачность в PHP"
PDF
Профессиональная разработка в суровом Enterprise
PPTX
Куда катится PHP, а также про Yii и другие фреймворки / Александр Макаров (St...
Повышаем и следим за качеством PHP кода
Как писать на PHP и не стать быдло-кодером
Как и зачем можно создать DSL на Python
Rust - GDG DevFest Siberia 2016
игровая логика, проблемы и решения
Владислав Грязнов "Многозадачность в PHP"
Профессиональная разработка в суровом Enterprise
Куда катится PHP, а также про Yii и другие фреймворки / Александр Макаров (St...

What's hot (20)

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

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

PPT
CodeFest 2012. Сидельников А. — Опыт создания DSL на Ruby. Где применить, как...
PPTX
PDF
Терминология как основной способ поиска разработчиков или как не опозорится п...
PDF
терминология vol.2
PDF
Инструментальные системы извлечения информации
PDF
Инструментальные системы извлечения информации
PDF
Компьютерная графика. Введение в Processing
PDF
Предметно-ориентированные языки программирования (DSL)
PDF
Инструментальная поддержка встроенных языков в IDE.
PPT
Никита Вельмаскин - Интерпретатор или думаем над скриптовым движком для Ваше...
ODP
Java: вчера, сегодня, завтра
PDF
ОПК № 1 – Вводная
PPT
2IDE~1.PPT
PDF
Иван Крутов - Автоматизация сборки Java-проекта
PPTX
"Война типов: сильные против слабых" Виктор Полищук
PDF
Архитектура в Agile: слабая связность
PDF
Сергей Крыжановский - Языки программирования
PDF
Павел Павлов - Scala для профессионалов - Joker 2013
PPT
43828
PPTX
409bb948 9463-4d6b-b885-63955ea67f1e-210512195958
CodeFest 2012. Сидельников А. — Опыт создания DSL на Ruby. Где применить, как...
Терминология как основной способ поиска разработчиков или как не опозорится п...
терминология vol.2
Инструментальные системы извлечения информации
Инструментальные системы извлечения информации
Компьютерная графика. Введение в Processing
Предметно-ориентированные языки программирования (DSL)
Инструментальная поддержка встроенных языков в IDE.
Никита Вельмаскин - Интерпретатор или думаем над скриптовым движком для Ваше...
Java: вчера, сегодня, завтра
ОПК № 1 – Вводная
2IDE~1.PPT
Иван Крутов - Автоматизация сборки Java-проекта
"Война типов: сильные против слабых" Виктор Полищук
Архитектура в Agile: слабая связность
Сергей Крыжановский - Языки программирования
Павел Павлов - Scala для профессионалов - Joker 2013
43828
409bb948 9463-4d6b-b885-63955ea67f1e-210512195958
Ad

More from Sergey Polazhenko (20)

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