Я обсуждаю разработку предметно-ориентированного языка, чтобы упростить данную неясную модель программирования. Частью дискуссии является вопрос о том, следует ли создавать его (в виде скрипта) поверх существующего языка / среды выполнения (например, Java) или сделать его автономным (собственный компилятор и т. Д.).
Те из вас, у кого есть опыт проектирования DSL, у вас есть плюсы / минусы или верный ответ на соответствующий подход?
language-design
scripting
dsl
runtime
Jé Queue
источник
источник
Ответы:
Я бы порекомендовал создать свой DSL поверх существующего языка (внутреннего DSL). Я делал это несколько раз с Python, создавая системы, в которых потребитель DSL записывает файл python, который используется в качестве файла конфигурации системы. Файл конфигурации использует определенные мной конструкции (классы, функции). Эти конструкции образуют DSL.
IMO, такой язык, как Python (IronPython или Jython, если хост-система - .NET или Java) или Ruby (IronRuby, JRuby), лучше использовать в качестве основы DSL, чем Java или C #.
В моем случае хост-системы также были (C) Python, поэтому выбор Python для DSL был естественным.
Некоторые плюсы:
источник
Посмотрите на Xtext (http://www.eclipse.org/Xtext/) и Xbase (http://blog.efftinge.de/2010/09/xbase-new-programming-language.html). Если пользователи не программисты, я не думаю, что вы должны основывать свой DSL на существующем языке программирования. Это будет слишком сложно для них. «Чистый» DSL может быть очень эффективным, если сделан правильно.
источник
Вместо того, чтобы рекомендовать конкретный подход, позвольте мне рекомендовать доменные языки Мартина Фаулера как отличный ресурс для принятия решения. Он имеет обширный, заставляющий задуматься анализ относительных достоинств внутренних и внешних DSL.
источник
Есть третий вариант - создать DSL как компилятор поверх языка общего назначения. Любой язык с некоторой разумной степенью возможностей метапрограммирования сделает свою работу, включая даже такую низкоуровневую вещь, как C ++. Я предпочитаю Lisp и подобные языки для такого рода вещей, но Template Haskell или Nemerle также могут обеспечить такой же уровень гибкости.
источник
В своей книге «Специфичные для домена языки» Мартин Фолвер описывает внутренние и внешние DSL.
Internal DSL
= является подмножеством существующего языка программирования, например, Ruby / Java и т. д.External DSL
= вы определяете синтаксис и словарь.Внешний DSL может быть гораздо более выразительным, но может потребовать внешнего анализа и генерации кода.
Хотя внутренний DSL не требует дополнительной обработки, его иногда трудно понять специалистам, не занимающимся программированием (например, бизнес-аналитикам, тестировщикам).
При выборе типа DSL важно проанализировать, кто его пользователи. Если они в основном нетехнические люди, то лучше выбрать внешний DSL. Для небольшой команды опытных программистов может быть выбран внутренний DSL, если язык программирования, который они используют, достаточно выразителен.
источник