Top Banner
Language Oriented Programming (LOP) в действии, как мы это делаем в JetBrains Максим Мазин JetBrains Старший инженер-программист [email protected]
35

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

Jan 14, 2015

Download

Business

 
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Language oriented programming_(lop)_в_действии_(максим_мазин,_add-2011)

Language Oriented Programming (LOP)в действии,

как мы это делаем в JetBrains

Максим МазинJetBrains

Старший инженер-программист[email protected]

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

План

● Зачем расширять языки?● Проблемы создания DSL

○ Совместимость○ Поддержка со стороны IDE

● Подход среды MPS○ Основная идея○ Демонстрация

● MPS и предметно-ориентированные языки

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

Зачем расширять языки?

● Универсальные языки○ Ограниченный набор конструкций общего

назначения○ Избыточность в описании предметной области○ Низкая сопровождаемость кода

● Предметно-ориентированные языки○ Более высокий уровень абстракции○ Лучшая сопровождаемость кода

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

Неявные языковые расширения

Предметно-ориентированные конструкции в универсальных языках

● Блок synchronized в языке Java● Перегрузка операторов в языке C++

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

Блок synchronized в Java

Вместо

lock.lock();try { // полезный код } finally { lock.unlock();}

Можно написать

synchronized (lock) { // полезный код}

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

Перегрузка операторов в C++

Вместо

Complex c = new Complex(1,2);Complex d = c.add(a);

Можно написать

complex c(1,2);complex d = c + a;

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

Языковые расширения

● Существующие расширения○ Удовлетворяют нужды конкретных предметных

областей○ Встроены в универсальные языки

● Новые расширения○ Трудно встраивать○ Риск несовместимости

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

План

● Зачем расширять языки?● Проблемы создания DSL

○ Совместимость○ Поддержка со стороны IDE

● Подход среды MPS○ Основная идея○ Демонстрация

● MPS и предметно-ориентированные языки

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

Совместимость

Компоненты совместимы, когда могут быть использованы совместно даже, если были созданы независимо.

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

СовместимостьКонечная цель

Java-библиотеки● Hibernate● Spring● Joda Time

Расширения Java● DB Language● DI Language● Dates Language

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

СовместимостьБиблиотеки и расширения

● Библиотеки совместимы○ Java + Hibernate = OK○ Java + Spring = OK○ Java + Hibernate + Spring = OK

● Языковые расширения — нет○ Java + extension A = OK○ Java + extension B = OK○ Java + extensions A, B = возможна неоднозначность

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

СовместимостьГрамматическая неоднозначность

● Расширение 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}";

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

Разработка языкаТребования

● Общая инфраструктура○ Синтаксис○ Система типов○ Операционная семантика○ и т.д.

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

Разработка языкаТребования

● Общая инфраструктура○ Синтаксис○ Система типов○ Операционная семантика○ и т.д.

● Поддержка со стороны IDE○ Редактор○ Подсветка ошибок○ Рафакторинги○ Контроль версий○ Отладчик○ и т.п.

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

Разработка языкаПроблемы

● Ресурсоемкая задача○ Сложные алгоритмы обработки кода ○ Разнообразие поддерживаемых технологий○ Необходимость высокой квалификации разработчиков

● Совместимость инфраструктуры○ Совместимость систем типов различных расширений○ Поддержка возможных расширений рефакторингами○ и т.д.

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

Существующие решения

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

LISP Да Нет

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

XText framework Нет Да

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

Общие проблемы

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

● Но не одновременно

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

План

● Зачем расширять языки?● Проблемы создания DSL

○ Совместимость○ Поддержка со стороны IDE

● Подход среды MPS○ Основная идея○ Демонстрация

● MPS и предметно-ориентированные языки

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

JetBrains MPS● MetaProgramming System

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

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

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

Основная идея

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

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

MPS работает с абстрактным синтаксическим деревом (АСД) напрямую

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

Основная идеяРедактирование АСД

● Предыдущие попытки○ Редактирование диаграмм○ Ограниченный набор применений

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

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

Основная идеяПроекционный редактор

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

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

Основная идеяПроекционный редактор

● Каждый узел «живет» в своей ячейке● Узел отображается в виде

текстового/символьного представления● Редактирование проекции мгновенно отражается

на синтаксическом дереве

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

Основная идеяОбычный текст и проекции

● У текстоподобного проекционного редатора есть преимущества и недостатки

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

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

Создание языков

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

● Средства IDE○ Автозавершение кода○ Поиск использований○ Переименование○ Отладка○ и т.д.

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

● Реализация Java™ в среде MPS + расширения

○ Функциональные коллекции (collections language)○ Даты (dates language)○ Замыкания (closures language)○ Регулярные выражения (regexp language)○ и т.д.

● Языки для определения языков○ Реализованы с помощью самих себя (bootstrapping)

● Разнообразные языки (XML и т.п.)

Готовые MPS-языки

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

Java

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

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

ReadWriteLock l = …read (l) { // полезный код}

ДемонстрацияДобавление конструкции read lock

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

План

● Зачем расширять языки?● Проблемы создания DSL

○ Совместимость○ Поддержка со стороны IDE

● Подход среды MPS○ Основная идея○ Демонстрация

● MPS и предметно-ориентированные языки

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

Domain-Specific Languages

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

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

● Можно внедрять конструкции универсальных языков программирования (например, Java) внутрь своих DSL

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

Domain-Specific LanguagesПример

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

Существующие приложения

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

● Языки для web-разработки○ DNQ (Data Navigation and Queries)○ Webr○ Spring language○ и т.д.

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

Существующие приложения

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

Лицензия

● Оpen-sourced● Apache 2.0 License

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

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

Ссылки

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

Блог про MPShttp://blogs.jetbrains.com/mps

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

Вопросы?