Створення DSL: Сценарій на версії мови загального призначення або автономної?


10

Я обговорюю питання про розробку мови для домену, щоб спростити задану, незрозумілу модель програмування. Частина дебатів полягає в тому, чи будувати його (як скрипт) під існуючою мовою / режимом виконання (наприклад, Java), або робити його самостійним (власний компілятор та c).

Ти з вас, хто має досвід дизайну DSL, чи є у вас плюси та мінуси та чи впевнений відповідь на відповідний підхід?


хто споживач цієї DSL? і які потенційні хости (ви згадали Java, чи розглядаєте ви інші можливості)?
Маурісіо Шеффер

Я розглядаю будь-яку можливість для господарів. Споживачами будуть ті, хто пише асинхронні програми (повідомлення з адресатами).
Черга Jé

Відповіді:


9

Я рекомендую створити свій DSL поверх існуючої мови (внутрішньої DSL). Я кілька разів робив це з Python, створюючи системи, де споживач DSL записує файл python, який використовується як файл конфігурації для системи. У файлі конфігурації використовуються конструкти (класи, функції), які я визначив. Ці конструкції утворюють DSL.

IMO, мова на зразок Python (IronPython або Jython, якщо хост-системою є .NET або Java) або Ruby (IronRuby, JRuby), є кращою для базування вашого DSL, ніж Java або C #.

У моєму випадку хост-системи також були (C) Python, тому вибір Python для DSL - це закономірно.

Деякі плюси:

  • Нижня вартість будівництва. Вам набагато менше для реалізації. Ви можете зосередити увагу на проблемі, аніж витрачати час на реалізацію аналізатора / компілятора / інтерпретатора.
  • Доступ до мови хосту: Ваша мова матиме доступ до всієї потужності існуючої мови / платформи.

Я досить агностик мови, але чому ви вважаєте, що втілення Python краще підходять?
Черга Jé

1
Краще підходить, ніж що? Я думаю, що у Ruby та Python є багато однакових переваг, Ruby, можливо, навіть краще підходить для внутрішнього DSL через більш гнучкий синтаксис. Що стосується Java та C #, я бачив багато тонких інтерфейсів на цих мовах (і є нові конструкції, які спрощують внутрішнє створення / використання DSL, як синтаксис об'єкта ініціалізатора об'єктів), - але IMO - "низька церемонія" мов: трохи краще підходить, ніж мови "високої церемонії".
кодап

1
Я вибрав C #, щоб реалізувати внутрішній DSL саме для використання "вільної" перевірки статичного часу компіляції. Динамічні DSL мови не дають занадто багато переваг перед зовнішніми DSL.
День

@Den саме це мене розчарувало, коли я намагався робити iDSL в Python. У Java ваш iDSL відчуває, що отримує миттєву підтримку IDE. Не знайшли IDE, який би зробив це для Python.
candied_orange

2

Подивіться на Xtext (http://www.eclipse.org/Xtext/) та Xbase (http://blog.efftinge.de/2010/09/xbase-new-programming-language.html). Якщо користувачі не програмісти, я не думаю, що ви повинні базувати DSL на існуючій мові програмування. Це буде для них занадто складним. "Чистий" DSL може бути дуже ефективним, якщо його зробити правильно.


2

Замість того, щоб рекомендувати певний підхід, дозвольте мені рекомендувати домен Мартіна Фаулера як відмінний ресурс для прийняття рішення. Вона має широку, обдумуючу думку, відносну перевагу внутрішніх і зовнішніх DSL.


1

Є й третій варіант - побудувати DSL як компілятор на вершині мови загального призначення. Будь-яка мова з певним ступенем можливостей метапрограмування зробить цю роботу, включаючи навіть таку річ низького рівня, як C ++. Я віддаю перевагу Lisp та подібні мови для подібних речей, але Шаблон Haskell або Nemerle також міг би забезпечити той самий рівень гнучкості.


1

У своїй книзі "Мови, що визначаються доменом", Мартін Фолвер описує внутрішні та зовнішні DSL.
Internal DSL= - це підмножина існуючої мови програмування, наприклад, Ruby / Java тощо.
External DSLВи визначаєте синтаксис та словниковий запас.
Зовнішній DSL може бути набагато виразнішим, але може вимагати зовнішнього розбору та генерації коду.
Хоча внутрішній DSL не потребує додаткової обробки, але його часом важко зрозуміти для експертів, що не програмують (наприклад, бізнес-аналітики, тестери).

Вибираючи свій тип DSL, важливо проаналізувати, хто його користувачі. Якщо вони здебільшого нетехнічні люди, то кращий вибір може бути зовнішнім DSL. Для невеликої команди досвідчених програмістів може бути обраний внутрішній DSL, якщо мова програмування, яку вони використовують, є достатньо виразною.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.