Создание DSL: написано на языке общего назначения или автономно?


10

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

Те из вас, у кого есть опыт проектирования DSL, у вас есть плюсы / минусы или верный ответ на соответствующий подход?


кто является потребителем этого DSL? и каковы потенциальные хосты (вы упомянули Java, рассматриваете ли вы другие возможности)?
Маурисио Шеффер

Я рассматриваю любую возможность для хозяев. Потребителями будут те, кто пишет асинхронные программы (сообщения с адресатами).
Jé Queue

Ответы:


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é Queue

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

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

@ Это именно то, что разочаровало меня, когда я попытался сделать 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 и подобные языки для такого рода вещей, но Template 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.