В последнее время в промышленной разработке особую популярность обретают предметно-ориентированные языки программирования (Domain-Specific Lanugages, DSL). Они драматически упрощают разработку и дают возможность “программировать” не только инжеренерам, но и пользователям прикладных программ. В своем докладе я расскажу об опыте использования DSL применительно к С++, причем упор будет сделан на производительность кода DSL, и его мгновенную “встраиваемость” в запущенную программу путем компиляции DSL-кода в нативный код с помощью инструментария LLVM.
2. О себе
Архитектор в LogicNow
Специализация: высоконагруженные
отказоустойчивые системы на C++
Бэкап-решение
3. Что такое DSL?
Domain-specific language - это язык программирования с
ограниченными возможностями, ориентированный на конкретную
предметную область.
4. Достоинства и недостатки DSL
Достоинства:
• управление сложностью
• скорость разработки
• комуникация с экспертами
• альтернативные парадигмы
• динамическое выполнение
Недостатки:
• порог вхождения
• эволюция в язык общего назначения
• разработка и поддержка
20. Что такое LLVM IR?
Особенности:
• обобщенная система команд
• функции
• типы данных
• простые типы
• указатели
• массивы
• статическая типизация
• SSA(static single assignment) нотация
29. Итоги
Плюсы:
• простота
• скорость разработки
• Производительность
Минусы:
• размер бинарного файла (~ 15 Mb)
• реализация местами сложна
• нативный код
ограниченные возможности - простота
ограниченный язык полезен только если ориентирован на конкретную предметную область, иначе смысла нет
неполнота по тьюрингу
примеры: regexp, sql, cmake, make
области применения: тесты, конфигурация, администрирование, финансы
сложность - основная проблема разработки ПО(новые языки, фреймворки, ide)
плюсы
управление сложностью - инкапсуляция, проблема + реализация
скорость разработки - проще понять, меньше ошибок, легче поддерживать
комуникация с экспертами - не писать, так читать
изменение в процессе выполнения - динамически меняющиеся области(финансы)
альтернативные парадигмы - императивные, декларативные, функциональные без необходимости использования по всему проекту, интерприт
минусы
внутренний - специфический способ использования языка общего назначения(подмножество возможностей, определенный стиль, работа с небольшим аспектом системы)
отличае от API связь методов(метод имеет смысл в контексте другого)
совместимость - сгенерить код на С и заюзать в контроллере(на этапе компиляции)
компилируемые - генерация, доп шаг при компиляции, совместимость
первый шаг - синтаксический анализ
второй шаг - генерация(опционален)
синтаксис - описывает корректные выражения, которые могут встерчаться в программе
семантика - это смысл программы
строго говоря семантическая модель не обязательна, но очень желательна
семантическая модель отделяет синтаксически анализ от результирующей семантики
менять синтаксис независимо от логики, синтаксический сахар, заменить внутренний dsl на внешний
dsl - тонкий слой над семантической моделью
роль dsl это инициализация семантической модели
с семантической моделью можно работать и без dsl
семантическая модель не обязательно AST
коллекция иерархическая 150К это максимум
2 части: аггрегирующая функция и выражение
выражение применяется к каждому объекту
LLVM IR AST - оптимимизация
flex&bison
граматика LARL
проверена временем 80-ые, но до сих пор развивается
работает быстро, парсера маленький по размеру
сложно дебажить, не всегда понятные ошибки
код который генерится не идеален(сырые указатели, union)
antlr
граматика LL
antlrworks среда для разработки(дебаг, автрозрешение конфликтов, аст)
ограниченная поддержка C++(4-ая версия не поддерживает, 3-яя поддерживает но ограниченно(безполезно))
парсер более требователен к ресурсам(больше памяти)
spirit
прикольная идея, построен на с++ шаблонах
header-only либа, не требует доп шагов при компиляции
адские ошибки
для реальных грамматик огромное время компилляции
yзлы - операторы
листья - операнды
отстутствуют узлы и ребра тех синтаксических правил, которые не влияют на семантику программы(например скобки, группировка операндов задается струтурой дерева)
синтаксис описывает корректные выражения
семантика - смысл
yзлы - операторы
листья - операнды
отстутствуют узлы и ребра тех синтаксических правил, которые не влияют на семантику программы(например скобки, группировка операндов задается струтурой дерева)
синтаксис описывает корректные выражения
семантика - смысл
yзлы - операторы
листья - операнды
отстутствуют узлы и ребра тех синтаксических правил, которые не влияют на семантику программы(например скобки, группировка операндов задается струтурой дерева)
синтаксис описывает корректные выражения
семантика - смысл
разные языки, разные модели памяти, разные архитекруры, разные наборы инструкций
ssa - функциональный стиль описания данных, императивный стиль описания операций
нет переменных
LLVM IR AST - оптимимизация
нативный код - возможны крэши, мэмори ликик, ограниченные платформы и тп