39
Как и зачем сделать DSL Реализация DSL на Python Доклад для #pynsk

Как и зачем можно создать DSL на Python

  • Upload
    pynsk

  • View
    68

  • Download
    2

Embed Size (px)

Citation preview

Page 1: Как и зачем можно создать DSL на Python

Как и зачем сделать DSL

Реализация DSL на Python

Доклад для #pynsk

Page 2: Как и зачем можно создать DSL на Python

Кто докладчик?

Михаил Воротынцев backend-разработчик.

Давно и много пишу на python и не только.Стараюсь поддерживать IT-движуху.

Page 3: Как и зачем можно создать DSL на Python

Domain-specific language

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

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

Page 4: Как и зачем можно создать DSL на Python

Domain-specific language

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

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

Почему это узкая область?

Page 5: Как и зачем можно создать DSL на Python

Например:

SQL, QML, YAML, JSON, ini-file, GraphQL

и многие другие...

Page 6: Как и зачем можно создать DSL на Python

Какая задача может появиться?

Предположим:

Нам нужно сделать язык описания рабочего процесса.

Page 7: Как и зачем можно создать DSL на Python

В нем должно быть:

● Описание задач и их последовательности.● Описание действий.● Описание сущностей участвующих в процессе.

Page 8: Как и зачем можно создать DSL на Python

И на все это свой синтаксис?

Надо подумать как он может выглядеть.

Page 9: Как и зачем можно создать DSL на Python

Во-первых,в рабочем процессе будет:

Действия

Задачи

Описание

Page 10: Как и зачем можно создать DSL на Python

Действия можно описать так:

<ключевое слово> <название> «<описание>»

Page 11: Как и зачем можно создать DSL на Python

Задачи тоже можно описать так:

Задачи будут выстраиваться в последовательность с помощью:

next <список следующих задач>

Page 12: Как и зачем можно создать DSL на Python

Задачи в последовательности образуют граф:

В простых случаях ациклический направленный граф.

Page 13: Как и зачем можно создать DSL на Python

Уже неплохо.

Но что-то забыли!

Page 14: Как и зачем можно создать DSL на Python

Сущности в рабочем процессе тоже нужны.

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

Типы полей тоже выглядят привычно.

Page 15: Как и зачем можно создать DSL на Python

Сущности могут быть связаны:

Одни сущности могут быть полями в любых других.

Page 16: Как и зачем можно создать DSL на Python

Разнообразие сущностей.

Грядет много сущностей.

А как же в исполняемом коде определять какие у них есть возможности?

Page 17: Как и зачем можно создать DSL на Python

Нужно что-то вроде наследование.

Какие-то системные сущности будут наделять поведением пользовательские сущности.

Сделаем конструкцию import

Page 18: Как и зачем можно создать DSL на Python

Дополним описание действий сущностями.

Определены основные синтаксические конструкции нашего DSL.

Пора как-то разбирать этот код.

Как же это делать?

Page 19: Как и зачем можно создать DSL на Python

Намечается такой путь решения.

● Нужно создать синтаксический анализатор.

● Подходит исходящий синтаксический анализатор.

● Нужно получит решение реализующие метод рекурсивного спуска чтобы сконструировать наш язык через контекстно свободную грамматику.

Page 20: Как и зачем можно создать DSL на Python

Успешное решение близко.● Нужно создать какую-то свою грамматику разбирающую выражения.

● Эта РВ-грамматика должна получится похожа на регулярные выражения и на контекстно-свободные грамматики.

● Можем использовать расширенную форму Бэкуса-Наура или сделать что-то похожее.

Page 21: Как и зачем можно создать DSL на Python

Хороший план.

Page 22: Как и зачем можно создать DSL на Python

Оу..

Много сложных штук надо написать.Много времени уйдет.Еще и тестировать.

Page 23: Как и зачем можно создать DSL на Python

Конечно, взять готовое!

Есть готовое решение с документацией и лицензией MIT.

Примеры и обучающие материалы http://igordejanovic.net/textX/

Обязательно ознакомьтесь с проектом.

Page 24: Как и зачем можно создать DSL на Python

Теперь мы можем описать грамматику и код.

В переменной code строка кода с тем самым примером блока кода для конструкции import

Page 25: Как и зачем можно создать DSL на Python

Описание грамматики для import.

Строка с описанием грамматики.

Page 26: Как и зачем можно создать DSL на Python

Ой, точно!

Забыли комментарии. Добавим в грамматику:

Верно, нам нужны комментарии.

Page 27: Как и зачем можно создать DSL на Python

В коде пользоваться очень просто.

Мета-модель грамматики позволяет создать модель объектов кода по любому валидному тексту кода (в нашем случае он в переменной code)

Page 28: Как и зачем можно создать DSL на Python

Все нужные объекты будут созданы.

Грамматика

Код

Page 29: Как и зачем можно создать DSL на Python

Сделать остальные конструкциине на много сложнее.

Типы данных и сущности с их

свойствами можно легко описать.

Page 30: Как и зачем можно создать DSL на Python

Для этого кода подойдет такая грамматика:

Page 31: Как и зачем можно создать DSL на Python

Можно сделать грамматику для существующих языков.Например: вот так можно описать грамматику JSON

Page 32: Как и зачем можно создать DSL на Python

Новые возможности.

● Можно добавить в JSON грамматику возможность комментирования.

● Можно добавить формат даты и времени.

Но это уже не JSON, это уже just for fun.

Page 33: Как и зачем можно создать DSL на Python

Для чего еще можно использовать?

Можно разбирать формулу.

Пользователи нашего приложения что-то у себя считают по разным формулам и написали такую, например: (34 + a * -F) + (b ^ 10) * (10.1 + 1/(d - 1))

На этот раз code это некая формула (выражение)

Page 34: Как и зачем можно создать DSL на Python

Грамматика для разбора простых математических выражений:

Page 35: Как и зачем можно создать DSL на Python

И простая функция для разбора модели:

Page 36: Как и зачем можно создать DSL на Python

С конкретными значениями переменных вычисляем значение функции:

Получится такой вывод:

formula: (34.0 + 10 * -0.3) + (0.1 ** 10.0) * (10.1 + 1.0 / (2 - 1.0))result: 31.00000000111

В реальных условиях не используйте eval!

Page 37: Как и зачем можно создать DSL на Python

А что с задачей про DSL для рабочего процесса?

Она была решена!

Решение позволило создать двигатель рабочего процесса на основе своей нотации его описания.

● Celery - основа.● Умеют одновременно бежать много рабочих

процессов с возможностью дожидаться задач друг друга.

● Уже есть базовый набор сущностей.● Задумано для микросервисной архитектуры.

Page 38: Как и зачем можно создать DSL на Python

Для чего можно создавать DSL?

● Для инфраструктурных проектов.

● Для научных проектов.

● Еще один язык запросов-ответов.

● Для аналитиков, которые управляют бизнес-объектами в предметной области.

Page 39: Как и зачем можно создать DSL на Python

Время задать вопросы.

Если вопросы появятся, пишите в

@siberian_unax

Благодарю за внимание!