Какую технологию использовать при создании DSL для движка правил? - PullRequest
6 голосов
/ 13 февраля 2009

Какую технологию вы бы порекомендовали для создания DSL для блока бизнес-правил и приложений проверки для .NET ? А почему?

Архитектура каркаса установлена ​​и проверена производством. Я просто хочу создать процессор .NET для преобразования понятных человеку правил в скомпилированные реализации Правил.

Варианты, которые мне известны:

  • Использовать конвейер компилятора .NET Boo
  • Используйте компоновщики синтаксических анализаторов, которые поставляются с F # - FsLex и FsYacc

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

Есть идеи или подсказки?

Ответы [ 11 ]

8 голосов
/ 17 февраля 2009

Платформа разработки приложений следующего поколения от Microsoft под кодовым названием Oslo

Упрощает людям процесс записи вещей, которые имеют смысл для проблемной области, в которой они работают

Похоже, Осло состоит из инструмента визуального дизайна с именем "Quadrant", языка моделирования с именем "M" и репозитория "Oslo" (база данных SQL Server), в котором хранятся правила.

Так что, если я правильно читаю, вы можете определить язык моделирования в M, использовать Quadrant для определения и редактирования ваших правил проверки, используя свой собственный язык моделирования, и написать приложение, которое использует репозиторий Oslo, генерируя ваши бизнес-правила и блок приложения проверки для .NET.

7 голосов
/ 13 февраля 2009

Другая, возможно, интересная альтернатива - использовать цитаты F #.

Цитаты позволяют обрабатывать часть программы как данные, поэтому вы можете получить AST, проанализировать его и перевести на другой язык или выполнить его нестандартным способом. Вместе с гибкостью F # вы должны иметь возможность выражать многие вещи, поэтому вам придется разработать внутреннюю библиотеку F # DSL / combinator для описания правил и переводчик / интерпретатор для цитат F # для их запуска.

Не уверен, как может выглядеть правило бизнеса, но вы могли бы написать что-то вроде этого:

let rule = <@
  if (exists customer having validEmail) then success
  else require whatever 
@>

Я написал введение в эту тему в своем блоге. К сожалению, в F # CTP произошли некоторые большие изменения, и я еще не обновил исходный код, но он должен дать вам хорошее представление о возможностях и ограничениях этого подхода.

Хорошим примером DSL является framewrok модульного тестирования F #:

[EDIT] Просто чтобы уточнить, почему я думаю, что это может быть хорошим подходом:

  • Если вы используете Visual Studio для редактирования DSL (и вы можете использовать версию Shell с F #, установленной бесплатно), вы получите очень хороший опыт редактирования бесплатно. Не только подсветка синтаксиса, но и IntelliSense, который предложит возможные конструкции, а также фоновая проверка типов, которая служит средством проверки грамматики для вашего DSL.
  • По сравнению с другими подходами этот, пожалуй, один из самых простых в реализации.
  • Единственное ограничение в том, что вы ограничены синтаксисом F #. Однако создать свой собственный язык действительно сложно, так что это может быть не так уж и плохо. Особенно учитывая гибкость F #.

[/ EDIT]

Надеюсь, это поможет!

7 голосов
/ 13 февраля 2009

Графический язык для бизнес-правил не очень хорошая идея. Я бы избежал этого. В бизнес-правилах много проверок и циклов, которые плохо визуализируются.

Вам гораздо лучше использовать текстовый язык для описания бизнес-правил.

Чтобы получить феноменальный пользовательский опыт для редактирования кода, вам нужно:

  1. Парсер с хорошим исправлением ошибок
  2. Возможность делать пошаговую перекомпиляцию

Хорошее восстановление после ошибок позволяет эффективно определять намерение программиста по синтетически неполным конструкциям. Это важно для реализации интеллигенции.

Возможность инкрементной перекомпиляции дает вам возможность выполнять эффективную фоновую компиляцию в ответ на изменения пользователя.

Самый простой способ получить хорошее исправление ошибок - написать свой парсер вручную. Таким образом, вы можете использовать любое количество перспективных или алгоритмических правил, чтобы выяснить, что делать при наличии синтаксических ошибок.

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

Внедрение эффективной повторной компиляции требует от вас возможности: 1) Правильно разбить семантический анализ на фазы (для чего-то вроде C # это будет: сначала создать пространство имен и символы типа, затем разрешить с помощью операторов, затем разрешить базовые классы и т. Д.). 2) Способность построить график зависимости от фазы 3) Алгоритмы обработки графа зависимостей и его аннулирования в ответ на пользовательские изменения

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

Итак, я бы начал с парсера, а затем построил на нем интеллект.

Если бы вы могли избежать интеграции VS, я бы. Интеграция в VS требует много сантехники, и взаимодействие может вызвать головную боль. Есть несколько компаний, которые продают средства управления редактором форм Windows, к которым вы подключаете свой парсер. Это гораздо проще интегрировать, чем VS.

3 голосов
/ 16 февраля 2009

Стандартный инструмент для создания швов DSL: ANTLR - это мощный генератор лексеров / анализаторов с множеством целевых языков для вывода компилятором. Он имеет бэкенды для C #, Java, C / C ++, Python и т. Д. (См. Список целей генерации кода ) и позволяет легко вставлять пользовательский код в компилятор на целевом языке.

Существует также очень мощная среда разработки (ANTLRWorks) и множество документации. (Ознакомьтесь с Обязательной справкой ANTLR от Терренса Парра, автора ANTLR). Ссылки на тех, кто еще его использует, см. На странице Testimonlals .

Вам все еще нужно выполнить большую часть сантехники для IDE самостоятельно, но это должно быть намного проще, учитывая надежную структуру компилятора, которую вы получите от ANTLR. Это должно иметь место для большинства решений, размещенных здесь ...

В настоящее время я использую компилятор, написанный на ANTLR, для предварительной обработки нашего собственного вывода DSL на C / C ++, и я очень доволен этим. Достаточно рекламы, вы должны попробовать это для себя :) Удачи!

3 голосов
/ 13 февраля 2009

Я бы использовал Boo, я думаю, что в настоящее время это один из самых гибких инструментов для создания DSL. Есть очень хорошая книга на эту тему. Блоги Айенде и Родриго также являются хорошим источником вдохновения.

Об IDE вы можете расширить SharpDevelop , взгляните на this .

2 голосов
/ 16 февраля 2009

JetBrains Система метапрограммирования

Вы можете определить редакторы пользовательских языков и другие ограничения для любого нового языка, чтобы работа с этими DSL стала действительно простой. Специалисты по предметной области, которые не знакомы с традиционным программированием, могут легко работать в MPS со своими предметно-ориентированными языками с использованием предметно-ориентированной терминологии.

1 голос
/ 14 декабря 2011

Мой проект meta # пытается решить эту проблему.

1 голос
/ 18 мая 2011

Boo + OMeta = Boo.OMeta.Parser

В настоящее время анализатор находится в стадии разработки, но его уже можно использовать для создания сложных внешних DSL. OMeta - это мощный инструмент, который позволяет программистам легко внедрять лексические анализаторы и парсеры. Расширяемая конвейерная архитектура компилятора Boo позволяет заменить стандартный Boo.Parser на Boo.OMeta.Parser. Он может использоваться для расширения синтаксиса Boo практически любым синтаксисом. Пример можно найти здесь .

1 голос
/ 16 февраля 2009

Я новичок в этом, но OMeta кажется идеальным инструментом для разработки DSL. Кажется, вокруг этого нет IDE, но хорошая новость заключается в том, что «правила», которые можно написать в OMeta, очень удобочитаемы. (И это касается левой рекурсии, что очень круто.)

В настоящее время есть реализации OMeta, по крайней мере, в Javascript (очень интересно для меня) и Python, возможно, в других. Что касается C #, Джефф Мозер работает над ним, о котором вы можете прочитать на его блоге и посмотреть на CodePlex . Удачи.

0 голосов
/ 22 февраля 2009

Ruby - отличный язык для создания DSL. Например, Rake - это сценарий сборки DSL, написанный на Ruby.

С предстоящим IronRuby можно писать сценарии, которые напрямую вызывают ваш код C #.

Вот некоторые статьи о написании DSL в Ruby.

...