Estou debatendo a criação de uma linguagem específica de domínio para simplificar um modelo de programação obscuro. Parte do debate é se deve ser construído (como um script) sobre uma linguagem / tempo de execução existente (por exemplo, Java) ou para torná-lo independente (compilador próprio, etc.).
Aqueles de vocês com experiência em design de DSL, têm prós / contras e / ou uma resposta infalível à abordagem apropriada?
language-design
scripting
dsl
runtime
Jé Queue
fonte
fonte
Respostas:
Eu recomendaria criar sua DSL sobre um idioma existente (DSL interno). Já fiz isso algumas vezes com o Python, criando sistemas em que o consumidor do DSL grava um arquivo python usado como arquivo de configuração do sistema. O arquivo de configuração usa construções (classes, funções) que eu defini. Essas construções formam o DSL.
O IMO, uma linguagem como Python (IronPython ou Jython, se o sistema host é .NET ou Java) ou Ruby (IronRuby, JRuby) é melhor para basear sua DSL do que Java ou C #.
No meu caso, os sistemas host também foram (C) Python, portanto, escolher o Python para o DSL tem sido a coisa natural.
Alguns profissionais:
fonte
Veja o Xtext (http://www.eclipse.org/Xtext/) e o Xbase (http://blog.efftinge.de/2010/09/xbase-new-programming-language.html). Se os usuários não são programadores, acho que você não deve basear sua DSL em uma linguagem de programação existente. Será muito complicado para eles. Uma DSL "limpa" pode ser muito eficiente se feita corretamente.
fonte
Em vez de recomendar uma abordagem específica, permita-me recomendar os idiomas específicos de domínio de Martin Fowler como um excelente recurso para tomar a decisão. Ele tem um exame abrangente e instigante dos méritos relativos das DSLs internas e externas.
fonte
Existe uma terceira opção - construir uma DSL como um compilador no topo de uma linguagem de uso geral. Qualquer linguagem com algum grau razoável de recursos de metaprogramação fará o trabalho, incluindo até coisas de baixo nível como C ++. Eu prefiro o Lisp e linguagens semelhantes para esse tipo de coisa, mas o Template Haskell ou Nemerle também poderiam fornecer o mesmo nível de flexibilidade.
fonte
Em seu livro "Domain-Specific Languages", Martin Folwer descreve DSLs internas e externas .
Internal DSL
= é um subconjunto da linguagem de programação existente, por exemplo, Ruby / Java etc.External DSL
= você define uma sintaxe e um vocabulário.Uma DSL externa pode ser muito mais expressiva, mas pode exigir uma análise externa e geração de código.
Embora uma DSL interna não exija um processamento adicional, às vezes é difícil de entender para especialistas em domínio que não são de programação (por exemplo, analistas de negócios, testadores).
Ao escolher seu tipo de DSL, é importante analisar quem são seus usuários. Se na maior parte são pessoas não técnicas, uma DSL externa pode ser uma escolha melhor. Para uma pequena equipe de programadores experientes, uma DSL interna pode ser escolhida, se a linguagem de programação usada for expressiva o suficiente.
fonte