.NET Natural Language программирования / псевдонимы / (предметно-ориентированный язык) Framework - PullRequest
2 голосов
/ 04 февраля 2011

В настоящее время мы используем ILOG BRMS для .NET, чтобы позволить бизнес-пользователям создавать логику в нашей системе, не зная, как программировать. Это правило создается бизнес-пользователем (т. Е. Оно является частью системы, а не частью спецификации):

definitions
  set 'the letter event' to the scheduled DelinquentLetterEvent on the invoice;
  set 'final notice possibility1' to the bill date of the invoice + 36 days;
  set 'final notice possibility2' to the time of 'the letter event' + 7 days;
  set 'final notice result' to the most future date from these values {
    'final notice possibility1', 'final notice possibility2' };
then
  in the event that 'final notice result' is not a mailing date,
    change it to the next available mailing date;
  add a new FinalNoticeEvent scheduled for 'final notice result' to the invoice;

Система выполняет эквивалент в .Net (здесь показан psuedo C #):

//variable declarations
ScheduledEvent theLetterEvent = theInvoice.GetScheduledEvent(
  KnownEventType.DelinquentLetterEvent);
DateTime noticePossibility1 = theInvoice.BillDate.AddDays(36);
DateTime noticePossibility2 = theLetterEvent.Time.AddDays(7);
DateTime[] possibilities = new DateTime[]() 
    { noticePossibility1, noticePossibility2 };
DateTime noticeResult = CustomClass.Max(possibilities);
  //actions
CustomClass2.MakeNextMailingDate(ref noticeResult);
theInvoice.AddScheduledEvent(KnownEventType.FinalNoticeEvent, noticeResult);

Программисты указывают во время разработки, какой текст используется для каждого класса / метода / свойства. Например, текст для этого последнего метода:

add a new {0} scheduled for {1} to {this}

Я медленно осознаю, что мне вообще не нужна BRMS. Концепция соответствия правил утвержденным экземплярам столь же чужда бизнес-пользователям, как и программистам. Наши бизнес-пользователи в некоторой степени знакомы со сценариями SQL (а некоторые немного знают VBA), поэтому им удобно последовательное выполнение.

Что мне действительно нужно, так это способ указать текст во время разработки (DSL), который отображается на классы / методы / свойства для программирования на естественном языке, предпочтительно за пределами BRMS.

Существует ли такая вещь? Как правильно называть эту концепцию?


Ответы:

Мы рассмотрели языки сценариев для широкого удовлетворения этой потребности. В частности, они не предлагают замену / отображение текста в код .NET, который я ищу. Я хочу написать метод c #, а затем объявить несколько разумных фраз, с помощью которых можно вызывать его.

ANTLR - спасибо за подсказку. Это универсальный парсер. Без сомнения, мне понадобится парсер, если я захочу реализовать это сам.

Любой искусственный язык, который вы придумываете, используя ненормативную лексику, сфокусированную на проблемной области, по определению является «языком, специфичным для домена».

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

Если вам нужны полностью общие вычисления, в итоге вы получите типичный компьютерный язык. Если вы можете сильно сузить сферу, вы можете закончить чем-то полезным.

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

DSL будет развиваться независимо от того, будем ли мы продолжать использовать ILOG или что-то еще в качестве вспомогательной инфраструктуры для языка.

Ответы [ 2 ]

3 голосов
/ 05 февраля 2011

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

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

Реальные аргументы в том, какой диапазон деятельности должен охватывать ваш язык? Насколько образованы ваши «бизнес-пользователи» (если они умеют кодировать, мне интересно, как их можно назвать «бизнес-пользователями»)? Согласны ли они с тем, что они готовы сказать (не спорю). Если вам нужны полностью общие вычисления, вы в конечном итоге получите типичный компьютерный язык (на самом деле хуже, потому что вы в конечном итоге будете подпрыгивать на функциях программирования, производя по-настоящему уродливого ребенка). Если вы можете сильно сузить сферу, вы можете закончить чем-то полезным.

Вопрос в том, можете ли вы разработать такой язык, который лучше, чем BRML, который вы намереваетесь заменить, для того, что пользователи ожидают сделать? [У меня нет мнения о том, насколько хорош BRML ILOG, но вы должны предположить, что они пытались решить эту проблему некоторое время, и, поскольку они все еще существуют, у них не должно быть глупого решения].

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

Хороший языковой дизайн, будь то процедурный или DSL, является сложным .

Что обычно случается с работоспособными DSL, так это то, что им удается решить интересную часть первоначальной проблемы, а остальным - «как-то». Один из способов справиться с этим - развить DSL: новый синтаксис, новая семантика и т. Д .; это случается с успешными DSL. Ожидайте, что ваш тоже будет развиваться. Другой типичный способ - предоставить несколько стандартных механизмов выхода (например, какой-то вызов процедуры, произвольные выражения, ...), а затем кто-нибудь добавляет дополнительные подпрограммы по требованию.

Даже если вы правильно понимаете DSL, он не может быть принят обществом. [Ada был действительно хорошим языком, и его заменили C и C ++, потому что программисты просто не хотели его изучать].

2 голосов
/ 04 февраля 2011

У вас есть много вариантов, как это сделать. Давайте назовем несколько:

  • Интеграция скриптового языка. Вы можете, например, используйте VBScript или Lua. Вы создаете оболочки для своих собственных объектов и делаете их доступными для языка сценариев. Преимущество этого состоит в том, что парсер и исполняемый движок уже реализованы для вас;

  • Используйте XAML. XAML - это способ определения структур объектов в XML. Вы можете использовать расширения разметки для формул, чтобы назначить дату, например, с помощью BillDate="{DateFormula +1 days}";

  • Используйте ANTLR для определения синтаксического анализатора для вашего собственного DSL. С ANTLR довольно легко написать парсер. Вы можете создавать объекты в вашей грамматике из соответствующих конструкций.

...