Construindo uma DSL: com script em uma linguagem de uso geral ou autônomo?

10

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?

Jé Queue
fonte
quem é o consumidor desse DSL? e quais são os hosts em potencial (você mencionou Java, está considerando outras possibilidades)?
Mauricio Scheffer
Considero qualquer possibilidade para os anfitriões. Consumidor serão aqueles que escrevem programas assíncronos (mensagens com destinos).
Jé Queue

Respostas:

9

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:

  • Menor custo de construção. Há muito menos para você implementar. Você pode se concentrar no problema em questão, em vez de gastar tempo para implementar um analisador / compilador / intérprete.
  • Acesso ao idioma do host: seu idioma terá acesso a todo o poder do idioma / plataforma existente.
codeape
fonte
Sou bastante independente da linguagem, mas por que você acha que as encarnações do Python são mais adequadas?
Jé Queue
11
Mais adequado do que o que? Eu acho que Ruby e Python têm muitos dos mesmos benefícios, talvez seja ainda mais adequado para DSL interno por causa de sua sintaxe mais flexível. Quanto a Java e C #, eu já vi muitas interfaces fluentes nessas linguagens (e há construções em versões mais recentes que facilitam a criação / uso interno de DSL, como a sintaxe do inicializador de objetos) - mas na linguagem IMO, as linguagens de "baixa cerimônia" são ligeiramente mais adequado que os idiomas de "alta cerimônia".
Codeape
11
Eu escolhi o C # para implementar uma DSL interna precisamente para aproveitar a verificação de tipo estático em tempo de compilação "livre". DSLs de linguagem dinâmica não oferecem muitas vantagens sobre DSLs externas.
Den
@ Den é exatamente isso que me decepcionou quando tentei fazer iDSLs em Python. Em Java, seu iDSL parece obter suporte instantâneo do IDE. Não encontrei um IDE que faça isso para Python.
Candied_orange 16/02/19
2

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.

Henrik
fonte
2

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.

eggsyntax
fonte
1

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.

SK-logic
fonte
1

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.

Olha Pavliuk
fonte