Pergunta

Eu gostaria de alguma orientação prática sobre quando devo usar um Domínio Específico de Linguagem . Eu descobri recursos sobre vantagens e desvantagens, mas que tipo de projeto que garante o seu uso?

Parece que há um grande investimento em tempo para criar e manter um DSL, por isso, o espaço de aplicação que eu iria obter um retorno a produtividade no meu investimento de tempo?

Editar: Parece que o uso mais comum de DSL é para formatos de arquivo para persistir estado de dados, o que sobre usando uma conexão DSL para a lógica do programa e estrutura (talvez a geração de código)? Quando é isso possível?

Edit # 2 eu estou pedindo, principalmente, sobre quando é criar uma DSL específica vale a pena. É claro que deve usar DSLs existentes, tanto quanto possível para economizar tempo.

Foi útil?

Solução

Há muito poucas boas razões para a criação de mais uma DSL. O mundo é gordo, com línguas para fins especiais.

Pense juntamente com estas linhas.

  1. Resolver o problema com uma linguagem de propósito geral, como Python, Java, C ++ .. o que quer.

  2. Optimize que a solução para fatorar as características comuns e construir uma realmente elegante biblioteca muito bom, realmente extensível classe.

  3. Optimize que biblioteca de classe para enfatizar "ortogonalidade". Certifique-se de todos os recursos funcionam bem juntos, sem quaisquer problemas.

  4. Se precisar de simplificação da sintaxe somente, criar um wrapper de script em torno de sua biblioteca de classe agradável. Esta é a sua DSL. Para Python, isso é fácil - já é uma linguagem dinâmica. Para Java, existem coisas que você pode aproveitar. Para C ++ que pode ser um pouco de trabalho para construir este ambiente de script flexível.

  5. Se você ainda precisar de mais otimização, considere escrever um compilador para o seu DSL.

Outras dicas

O artigo Surveys ACM Computing Quando e Como desenvolver Domain-Specific Languages ?? fornece conselhos sobre apenas este tema, assim como o livro de Martin Fowler 2010 Domain-Specific Languages ??.

Em primeiro lugar, gostaria de uso a DSL quando o domínio do problema seu desenvolvimento contra é um domínio amplamente conhecida, e alguns especialistas em negócios desse domínio já passou por grande comprimentos para construir tal DSL para que você não teria de percorrer os comprimentos de si mesmo para resolver todos os problemas que eles já descobriram.

Se você está pensando de criar a DSL, eu consideraria fazê-lo se o seu negócio é feito em uma área muito particular, e você passar a maior parte do seu tempo com foco em um domínio de problema específico. Se você saltar em torno de fazer aplicações para domínios vários problemas, então eu não aconselharia a tomar essa abordagem.

Por exemplo, se o seu negócio é soley na construção de aplicações fiscais, pode ser uma boa idéia para construir uma DSL sistema fiscal. Isso permitiria que o idioma não só para ser utilizável por você em suas várias aplicações fiscais, mas também seria marketeable (utilizável) por outras empresas em sua indústria que querem fazer as coisas semelhantes que você está realizando.

É claro, você tem que pesar os custos / benefícios da construção de uma DSL vs uma estrutura no topo de uma linguagem já existente.

Uma situação que vem à mente é quando os requisitos requer um alto ou improvável nível de personalização / configuração . Então você iria fornecer uma espécie de modelo de script contra um DSL vez.

Toma um carro montagem "braço", por exemplo, fornecendo um modelo de configuração para suportar várias configurações de fábrica seria impossível. (Detectar isso, não detectam que, quando isso acontece fazer isso ... etc.)

Mas a compilação de uma nova aplicação com a lógica especializada para cada cliente provavelmente não é um bom caminho a percorrer. Portanto, neste caso, você cria um pouco de estrutura que se torna uma espécie de DSL, e, em seguida, para cada braço robótico que você vende, você escrever um pequeno aplicativo em sua DSL e guardá-lo junto com o software núcleo que faria compila e executa o seu DSL scripts em seu lugar. Ou melhor ainda, ferramentas para programar o DSL são incluídos junto com o braço robótico para que o seu cliente pode "programar" a si mesmos braço na DSL você criou.

Uma exemplos do mundo real que vem à mente é o Yahoo Pipes (você pode pensar nisso como uma DSL) ou a directiva robots.txt para web crawler automatizado por exemplo. Eles podem não ser uma DSL full-blown, mas eles demonstram onde o DSL pode ser útil.

Bem, alguém tem que dizer isso, então aqui vai:

Lisp é considerado por alguns como a linguagem específica de domínio para qualquer domínio. A DSL bem suportado e muito extensível para isso.

Em alguns casos, formando uma DSL de Lisp (ou uma linguagem similar, como Haskell) realmente pode fornecer uma grande quantidade de energia com o mínimo esforço, e, assim, seria bastante interessante. DSLs nem sempre precisam ser grandes encargos de manutenção.

A mais óbvia é que você deve definitivamente usá-los quando a linguagem já existe e é bem suportado. Os exemplos disso são UIL para o desenvolvimento GUI baseada em Motif e para fazer software constrói.

Se você tem que fazer o seu próprio, eu diria que olhar para domínios uma grande quantidade de esforço é em coisas simplesmente especificando corretamente, e onde o seu compilador não pode realmente encontrar a maioria dos erros, mas um compilador de domínio específico poderia . GUIs são um grande exemplo, como a maioria do trabalho é na criação do layout, e geralmente há muitas maneiras de fazer chamadas syntacticly válidos C ++ que não fazem sentido algum para o seu sistema GUI subjacente (por exemplo: tentar incorporar um diálogo inteira Widget dentro de um botão).

Eu acho UIL particularmente um ganho enorme para o desenvolvimento GUI porque um compilador UIL pode encontrar erros em uma especificação de interface gráfica que apenas olhar como o código compilable normal, bom para um compilter C ++. O fato de que ele é meio bem suportados que o código é fácil para a porta entre as plataformas, e até mesmo os construtores de GUI.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top