Как и зачем можно создать DSL на Python
-
Upload
pynsk -
Category
Technology
-
view
68 -
download
2
Transcript of Как и зачем можно создать DSL на Python
![Page 1: Как и зачем можно создать DSL на Python](https://reader030.fdocument.pub/reader030/viewer/2022013113/58f0554f1a28abd2628b4593/html5/thumbnails/1.jpg)
Как и зачем сделать DSL
Реализация DSL на Python
Доклад для #pynsk
![Page 2: Как и зачем можно создать DSL на Python](https://reader030.fdocument.pub/reader030/viewer/2022013113/58f0554f1a28abd2628b4593/html5/thumbnails/2.jpg)
Кто докладчик?
Михаил Воротынцев backend-разработчик.
Давно и много пишу на python и не только.Стараюсь поддерживать IT-движуху.
![Page 3: Как и зачем можно создать DSL на Python](https://reader030.fdocument.pub/reader030/viewer/2022013113/58f0554f1a28abd2628b4593/html5/thumbnails/3.jpg)
Domain-specific language
● Предметно-ориентированный язык
это специализированный для конкретной области применения язык, имеющий выраженный (отличительный от других) синтаксис и имеющий довольно узкую область применения.
![Page 4: Как и зачем можно создать DSL на Python](https://reader030.fdocument.pub/reader030/viewer/2022013113/58f0554f1a28abd2628b4593/html5/thumbnails/4.jpg)
Domain-specific language
● Предметно-ориентированный язык
это специализированный для конкретной области применения язык, имеющий выраженный (отличительный от других) синтаксис и имеющий довольно узкую область применения.
Почему это узкая область?
![Page 5: Как и зачем можно создать DSL на Python](https://reader030.fdocument.pub/reader030/viewer/2022013113/58f0554f1a28abd2628b4593/html5/thumbnails/5.jpg)
Например:
SQL, QML, YAML, JSON, ini-file, GraphQL
и многие другие...
![Page 6: Как и зачем можно создать DSL на Python](https://reader030.fdocument.pub/reader030/viewer/2022013113/58f0554f1a28abd2628b4593/html5/thumbnails/6.jpg)
Какая задача может появиться?
Предположим:
Нам нужно сделать язык описания рабочего процесса.
![Page 7: Как и зачем можно создать DSL на Python](https://reader030.fdocument.pub/reader030/viewer/2022013113/58f0554f1a28abd2628b4593/html5/thumbnails/7.jpg)
В нем должно быть:
● Описание задач и их последовательности.● Описание действий.● Описание сущностей участвующих в процессе.
![Page 8: Как и зачем можно создать DSL на Python](https://reader030.fdocument.pub/reader030/viewer/2022013113/58f0554f1a28abd2628b4593/html5/thumbnails/8.jpg)
И на все это свой синтаксис?
Надо подумать как он может выглядеть.
![Page 9: Как и зачем можно создать DSL на Python](https://reader030.fdocument.pub/reader030/viewer/2022013113/58f0554f1a28abd2628b4593/html5/thumbnails/9.jpg)
Во-первых,в рабочем процессе будет:
Действия
Задачи
Описание
![Page 10: Как и зачем можно создать DSL на Python](https://reader030.fdocument.pub/reader030/viewer/2022013113/58f0554f1a28abd2628b4593/html5/thumbnails/10.jpg)
Действия можно описать так:
<ключевое слово> <название> «<описание>»
![Page 11: Как и зачем можно создать DSL на Python](https://reader030.fdocument.pub/reader030/viewer/2022013113/58f0554f1a28abd2628b4593/html5/thumbnails/11.jpg)
Задачи тоже можно описать так:
Задачи будут выстраиваться в последовательность с помощью:
next <список следующих задач>
![Page 12: Как и зачем можно создать DSL на Python](https://reader030.fdocument.pub/reader030/viewer/2022013113/58f0554f1a28abd2628b4593/html5/thumbnails/12.jpg)
Задачи в последовательности образуют граф:
В простых случаях ациклический направленный граф.
![Page 13: Как и зачем можно создать DSL на Python](https://reader030.fdocument.pub/reader030/viewer/2022013113/58f0554f1a28abd2628b4593/html5/thumbnails/13.jpg)
Уже неплохо.
Но что-то забыли!
![Page 14: Как и зачем можно создать DSL на Python](https://reader030.fdocument.pub/reader030/viewer/2022013113/58f0554f1a28abd2628b4593/html5/thumbnails/14.jpg)
Сущности в рабочем процессе тоже нужны.
Сделаем описание похожим на что-то привычное: классы, структуры в знакомых нам языках.
Типы полей тоже выглядят привычно.
![Page 15: Как и зачем можно создать DSL на Python](https://reader030.fdocument.pub/reader030/viewer/2022013113/58f0554f1a28abd2628b4593/html5/thumbnails/15.jpg)
Сущности могут быть связаны:
Одни сущности могут быть полями в любых других.
![Page 16: Как и зачем можно создать DSL на Python](https://reader030.fdocument.pub/reader030/viewer/2022013113/58f0554f1a28abd2628b4593/html5/thumbnails/16.jpg)
Разнообразие сущностей.
Грядет много сущностей.
А как же в исполняемом коде определять какие у них есть возможности?
![Page 17: Как и зачем можно создать DSL на Python](https://reader030.fdocument.pub/reader030/viewer/2022013113/58f0554f1a28abd2628b4593/html5/thumbnails/17.jpg)
Нужно что-то вроде наследование.
Какие-то системные сущности будут наделять поведением пользовательские сущности.
Сделаем конструкцию import
![Page 18: Как и зачем можно создать DSL на Python](https://reader030.fdocument.pub/reader030/viewer/2022013113/58f0554f1a28abd2628b4593/html5/thumbnails/18.jpg)
Дополним описание действий сущностями.
Определены основные синтаксические конструкции нашего DSL.
Пора как-то разбирать этот код.
Как же это делать?
![Page 19: Как и зачем можно создать DSL на Python](https://reader030.fdocument.pub/reader030/viewer/2022013113/58f0554f1a28abd2628b4593/html5/thumbnails/19.jpg)
Намечается такой путь решения.
● Нужно создать синтаксический анализатор.
● Подходит исходящий синтаксический анализатор.
● Нужно получит решение реализующие метод рекурсивного спуска чтобы сконструировать наш язык через контекстно свободную грамматику.
![Page 20: Как и зачем можно создать DSL на Python](https://reader030.fdocument.pub/reader030/viewer/2022013113/58f0554f1a28abd2628b4593/html5/thumbnails/20.jpg)
Успешное решение близко.● Нужно создать какую-то свою грамматику разбирающую выражения.
● Эта РВ-грамматика должна получится похожа на регулярные выражения и на контекстно-свободные грамматики.
● Можем использовать расширенную форму Бэкуса-Наура или сделать что-то похожее.
![Page 21: Как и зачем можно создать DSL на Python](https://reader030.fdocument.pub/reader030/viewer/2022013113/58f0554f1a28abd2628b4593/html5/thumbnails/21.jpg)
Хороший план.
![Page 22: Как и зачем можно создать DSL на Python](https://reader030.fdocument.pub/reader030/viewer/2022013113/58f0554f1a28abd2628b4593/html5/thumbnails/22.jpg)
Оу..
Много сложных штук надо написать.Много времени уйдет.Еще и тестировать.
![Page 23: Как и зачем можно создать DSL на Python](https://reader030.fdocument.pub/reader030/viewer/2022013113/58f0554f1a28abd2628b4593/html5/thumbnails/23.jpg)
Конечно, взять готовое!
Есть готовое решение с документацией и лицензией MIT.
Примеры и обучающие материалы http://igordejanovic.net/textX/
Обязательно ознакомьтесь с проектом.
![Page 24: Как и зачем можно создать DSL на Python](https://reader030.fdocument.pub/reader030/viewer/2022013113/58f0554f1a28abd2628b4593/html5/thumbnails/24.jpg)
Теперь мы можем описать грамматику и код.
В переменной code строка кода с тем самым примером блока кода для конструкции import
![Page 25: Как и зачем можно создать DSL на Python](https://reader030.fdocument.pub/reader030/viewer/2022013113/58f0554f1a28abd2628b4593/html5/thumbnails/25.jpg)
Описание грамматики для import.
Строка с описанием грамматики.
![Page 26: Как и зачем можно создать DSL на Python](https://reader030.fdocument.pub/reader030/viewer/2022013113/58f0554f1a28abd2628b4593/html5/thumbnails/26.jpg)
Ой, точно!
Забыли комментарии. Добавим в грамматику:
Верно, нам нужны комментарии.
![Page 27: Как и зачем можно создать DSL на Python](https://reader030.fdocument.pub/reader030/viewer/2022013113/58f0554f1a28abd2628b4593/html5/thumbnails/27.jpg)
В коде пользоваться очень просто.
Мета-модель грамматики позволяет создать модель объектов кода по любому валидному тексту кода (в нашем случае он в переменной code)
![Page 28: Как и зачем можно создать DSL на Python](https://reader030.fdocument.pub/reader030/viewer/2022013113/58f0554f1a28abd2628b4593/html5/thumbnails/28.jpg)
Все нужные объекты будут созданы.
Грамматика
Код
![Page 29: Как и зачем можно создать DSL на Python](https://reader030.fdocument.pub/reader030/viewer/2022013113/58f0554f1a28abd2628b4593/html5/thumbnails/29.jpg)
Сделать остальные конструкциине на много сложнее.
Типы данных и сущности с их
свойствами можно легко описать.
![Page 30: Как и зачем можно создать DSL на Python](https://reader030.fdocument.pub/reader030/viewer/2022013113/58f0554f1a28abd2628b4593/html5/thumbnails/30.jpg)
Для этого кода подойдет такая грамматика:
![Page 31: Как и зачем можно создать DSL на Python](https://reader030.fdocument.pub/reader030/viewer/2022013113/58f0554f1a28abd2628b4593/html5/thumbnails/31.jpg)
Можно сделать грамматику для существующих языков.Например: вот так можно описать грамматику JSON
![Page 32: Как и зачем можно создать DSL на Python](https://reader030.fdocument.pub/reader030/viewer/2022013113/58f0554f1a28abd2628b4593/html5/thumbnails/32.jpg)
Новые возможности.
● Можно добавить в JSON грамматику возможность комментирования.
● Можно добавить формат даты и времени.
Но это уже не JSON, это уже just for fun.
![Page 33: Как и зачем можно создать DSL на Python](https://reader030.fdocument.pub/reader030/viewer/2022013113/58f0554f1a28abd2628b4593/html5/thumbnails/33.jpg)
Для чего еще можно использовать?
Можно разбирать формулу.
Пользователи нашего приложения что-то у себя считают по разным формулам и написали такую, например: (34 + a * -F) + (b ^ 10) * (10.1 + 1/(d - 1))
На этот раз code это некая формула (выражение)
![Page 34: Как и зачем можно создать DSL на Python](https://reader030.fdocument.pub/reader030/viewer/2022013113/58f0554f1a28abd2628b4593/html5/thumbnails/34.jpg)
Грамматика для разбора простых математических выражений:
![Page 35: Как и зачем можно создать DSL на Python](https://reader030.fdocument.pub/reader030/viewer/2022013113/58f0554f1a28abd2628b4593/html5/thumbnails/35.jpg)
И простая функция для разбора модели:
![Page 36: Как и зачем можно создать DSL на Python](https://reader030.fdocument.pub/reader030/viewer/2022013113/58f0554f1a28abd2628b4593/html5/thumbnails/36.jpg)
С конкретными значениями переменных вычисляем значение функции:
Получится такой вывод:
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](https://reader030.fdocument.pub/reader030/viewer/2022013113/58f0554f1a28abd2628b4593/html5/thumbnails/37.jpg)
А что с задачей про DSL для рабочего процесса?
Она была решена!
Решение позволило создать двигатель рабочего процесса на основе своей нотации его описания.
● Celery - основа.● Умеют одновременно бежать много рабочих
процессов с возможностью дожидаться задач друг друга.
● Уже есть базовый набор сущностей.● Задумано для микросервисной архитектуры.
![Page 38: Как и зачем можно создать DSL на Python](https://reader030.fdocument.pub/reader030/viewer/2022013113/58f0554f1a28abd2628b4593/html5/thumbnails/38.jpg)
Для чего можно создавать DSL?
● Для инфраструктурных проектов.
● Для научных проектов.
● Еще один язык запросов-ответов.
● Для аналитиков, которые управляют бизнес-объектами в предметной области.
![Page 39: Как и зачем можно создать DSL на Python](https://reader030.fdocument.pub/reader030/viewer/2022013113/58f0554f1a28abd2628b4593/html5/thumbnails/39.jpg)
Время задать вопросы.
Если вопросы появятся, пишите в
@siberian_unax
Благодарю за внимание!