Есть ли какие-нибудь книги / статьи по DSL Design? (не реализация DSL)

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

Работать с DSL должно быть легко; люди должны иметь возможность экспериментировать с этим и изучать это, играя. Мы хотим добиться чего-то похожего на макросы в Microsoft Excel - многие пользователи Excel могут создавать простые формулы, суммы или вычисления и никогда не работали с «настоящим» (универсальным) языком программирования.

Очевидно, что не каждый пользователь Excel понимает более сложные встроенные методы (например, When ()), но они могут использовать простые методы, такие как SUM () или AVG (). Я хочу добиться аналогичного эффекта с DSL - пользователи должны иметь возможность интуитивно работать с ним и определять простые правила или выполнять простые вычисления. В то же время DSL должен предлагать функции более высокого уровня для более технически подкованных - например, циклы, операторы if, возможно, методы или лямбда-выражения.

И это подводит меня к моему (-ым) вопросу (-ам): Какие языковые конструкции интуитивно понятны, просты в изучении и понимании?

В текущей экспериментальной версии DSL мы опробовали метод цепочки методов, например: list.where(item -> item.value > 5).select(item -> item.name + " " + item.value)). Думайте о where и select как о конструкциях foreach, где item - это переменная, представляющая текущий элемент в цикле.

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

Легче / читабельнее для пользователей, если нет фигурных скобок? (как в LINQ: from item in list where item.value > 5 select item.name + " " + item.value). Однако в этом случае нет «границ» - в предыдущем примере пользователь знает, что оператор заканчивается последней закрывающей фигурной скобкой - в этом случае, если он наберет больше кода после select части оператора, он не сделает этого. знать, принадлежит ли он оператору или нет (кроме того факта, что синтаксический анализатор тоже не знал бы, и должно было быть какое-то закрытие).

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

Я не ищу информации о том, как создать DSL, какие генераторы парсеров я мог бы использовать и т. д., а также я не могу использовать существующий язык общего назначения (Ruby, Python, ... ) вместо этого из-за способа использования DSL. (DSL при синтаксическом анализе работает напрямую с нашей объектной моделью - я не буду здесь вдаваться в подробности, поскольку этот вопрос и так уже достаточно длинный).

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


person enzi    schedule 10.11.2011    source источник
comment
Именно поэтому я сейчас ищу информацию, Барт. Я только хотел сказать, что не знаю, интуитивно ли понятен текущий подход, потому что, откровенно говоря, я не могу знать, так как я тот парень, который создает DSL, и я всегда буду знать, как с ним работать. Мы будем тесно сотрудничать с некоторыми нашими клиентами, чтобы сделать язык интуитивно понятным. Однако в этом случае наши клиенты мало помогут в первоначальном дизайне языка - если я спрошу их сейчас, например, подход с цепочкой методов хорош, они могут сказать «да», а когда это будет сделано, и им придется работать с этим, они могут сказать «нет».   -  person enzi    schedule 11.11.2011
comment
Энзи, извини, я удалил свой комментарий, потому что думал, что ты более или менее ответил на него, отредактировав исходный вопрос ... :)   -  person Bart Kiers    schedule 11.11.2011
comment
Я так и думал, но оставлю свой комментарий на тот случай, если кто-то еще может задаться вопросом, почему я тот, кто судит о том, является ли DSL интуитивно понятным - я не достаточно ясно понял это в вопросе.   -  person enzi    schedule 11.11.2011


Ответы (3)


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

Итак, об удобстве использования языков:

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

Сайт Natural Programming содержит множество интересных публикаций, наиболее полезными для меня были Проблемы удобства использования при разработке систем программирования для начинающих

Наконец, последнее активное исследование, связанное с моим вопросом, похоже, было Разработка для конечных пользователей. Поиск публикаций в этой области должен дать довольно много полезной информации.

person enzi    schedule 24.10.2012

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

Гильермо Аранго об анализе доменов

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

(Аранго был моим напарником в UCI Irvine еще в 1980-х, когда предметный анализ и инженерия были горячей темой).

Похоже, вам нужен человеческий фактор в языковом дизайне. Билл Кертис подготовил отчет, хотя и немного устаревший, может быть полезен. Он был (остается) психологом. Я бы поищу исследовательские работы, в которых есть ссылки на него (см. Цитаты в Google Scholar).

person Ira Baxter    schedule 10.11.2011

Я прочитал DSL в действии (http://www.manning.com/ghosh/), и он проделал фантастическую работу по объяснению различных вопросов, касающихся написания DSL, и в своих примерах использовал несколько языков, работающих на JVM.

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

person James Black    schedule 11.11.2011