Confundindo DSLs

O Edgar Silva escreveu um post sobre DSLs há alguns dias. Deixei um comentário mas ao que parece ele não foi aprovado, logo resolvi postar algo para esclarecer uma confusão.

O Edgar anda mexendo com o antigo Drools, atual JBoss Rules, que é uma rule engine bem famosa. A confusão do post pode ser sumarizada em:

Sendo assim podemos criar uma Domain Specific Language (DSL), uma linguagem que especifica para usuários, onde eles possam entender o que está acontecendo nas regras de negócio do sistema. É mais ou menos isso que o projeto que estou ajudando tem que fazer, então vamos a um pequeno exemplo: PT_BR.dsl

Daí seguindo para um exemplo de programação em português:


JAVA:

1. Imprima "{msg}"=System.out.println("{msg}")
2. [when]A quantidade produto igual a {value}=p : Produto( estoque =={value})
3. [then]Chame o comando de continuação de Produto=p.

(quem já programou em VBA em português como eu deve ficar apavorado vendo isso)

A confusão está no fato de que DSLs são linguagens específicas do domínio, não do usuário. Ter uma linguagem de programação em português não faz dela uma DSL. ter uma linguagem declarativa não faz dela uma DSL. Uma DSL vai mapear conceitos do domínio 9venda, estoque, etc.) para dentro dos construtos da linguagem, logo o exemplo não representa uma DSL, apenas uma customização em cima de uma rule engine.

Eu tenho um exemplo que sempre uso em palestras e costuma ser bem claro: Muita gente programa de maneira razoavelmente OO em C e Pascal. O que estas pessoas fazem é definir estrutruas de dados e funções num mesmo módulo (um arquivo .h e um .c em C, por exemplo) e fazem com que todo acesso aos dados sejam encapsulados com funções. Uma pessoa que conheça a paradigma de OO pode criar só com estas técnicas simples programas muitos mais orientados a objetos do que os criados com Java atualmente, com os tais BOs e VOs/TOs que são tudo, menos objetos.

O que eles fazem é mapear um conceito do domínio para a linguagem (sim, isso parece com DDD), funciona que é uma beleza.

Mas existem linguagens que já trazem este conceito dentro de si. Em Java ou C# você não rpecisa desta gambiarra para utilizar objetos, basta você utilizar construtos da linguagem como a palavra reservada class. O domínio ‘Orientação a Objetos’ está mapeado dentro da linguagem.

SQL é outro bom exemplo. É uma linguagem específica para consultas e manipulação de bases de dados, você não constrói qualquer tipo de sofwtare com ela (a menos que utilize extensões bizarras do seu fornecedor de SGBD). Os conceitos de tabela, índice, chave, etc. estão dentro da linguagem.

Hoje ao modelar um sistema de gerência de estoque você não faz mais do que trazer aquele domínio para seu sistema através de um mapeamento de conceitos. O estoque do mundo real vira um bando de classes e atributos. Numa DSL o estoque do mundo real será representado por um construto ‘estoque’ na linguagem utilizada.

Update: O Edgard autorizou o comentário, eu bem sei como é esta coisa de ter que moderar WordPress :P, segue abaixo:

Phillip Calçado “Shoes”

Uma DSL na verdade é uma técnica utilizada para trazer os conceitos de um determinado domínio para o sistema. É como ao invés de implementar OO utilziando C você utilize Java, que possui construtos como classes, modificadores de acesso e interfaces que expressam os conceitos de uma modelagem OO na linguagem ao invés de simular estes em structs e funções.

Apesar de auxiliar na definição de uma ubiquitous language, o objetivo do uso de DSL é diminuir o gap entre implementação e conceito do mundo real, não necessariamente o uso de linguagem natural.

A listagem mostrada é um curto exemplo mas na verdade traz os conceitos de um domínio, apenas utiliza uma linguagem imperativa mais natural e em português para a definição de regras de negócio, o que não é uma DSL. Na verdade DSLs não dizem anda sobre a sintaxe, se é declarativa ou imperativa ou qualquer outra coisa, ela apenas define uma linguagem que é utilizada para modelar um domínio específico, como gerência de estoque.

Para ser uma DSL teríamos conceitos como produto e estoque implementados como construtos da linguagem utilizada, exemplos e um ótimo texto do Fowler em:

http://martinfowler.com/articles/languageWorkbench.html

BPM, ESB, SOA e toda a parafernalha correlata não implicam em DSLs, na verdade não existe nenhuma ligação exceto que implementações como o mencionado Jboss Rules/Drools trazem alguns recursos para implementar mini-linguagens. Infelizmente ainda estão bem longe do ideal, na verdade a Microsoft tem uma linha de produtos antagônicos ao MDA que se aproxima mais do que se esperaria de uma LanguageWorkbench:

http://msdn2.microsoft.com/en-us/teamsystem/aa718951.aspx

No lado Java existem empresas que estão construindo seus workbenches, entre elas a JetBrains:

http://www.jetbrains.com/mps/
http://www.metacase.com/

2 Responses to “Confundindo DSLs”

  1. Edgar Silva says:

    Olá Phillip,

    Obrigado pela leitura e referência ao texto do meu blog. Mil perdões pelo seu comentário não ter sido aprovado, infelizmente ainda não instalei um anti-spam no meu blog, por isso chegam trocentos comentários que vai pra uma pasta no meu e-mail que dificilmente tenho tempo de checar.
    Vamos aos pontos que você levantou:

    No caso especifico, usei uma DSL para que o usuário tivesse a liberdade de acessar os objetos de domínio e programar da forma que ele entenda que é o mais aplicável. Sendo assim, a linguagem continua sendo do Domínio, mas usada pelo o usuário de forma mais visual e “humana”.

    De fato, devo ter causado confusão, eu reeditei exatamente esta porção do meu texto para tentar ser mais claro, e aprovarei seu post, e adicionarei um trackback, ok?

    Agora no projeto, não criei um compilador para analisar semantica, ou geração de árvore ou qualquer coisa, e sim apenas Drools(agora JBoss Rules). O projeto está interessante e o cliente bastante satisfeito, porém mais importante que isso é que fique claro pras pessoas a aplicabilidade das tecnologias e disciplinas. Mais uma vez obrigado.

    Apenas para registrar:

    Domain Specific Language - Developers can write almost natural language semantics for rule authors.
    fonte: http://labs.jboss.com/portal/jbossrules/?prjlist=false
    Lá também, inclusive tem uma homenagem ao Português: “DSL in Potuguese in Action”.

  2. Para simplificar meu entendimento, eu sempre considerei que uma DSL é uma linguagem que contem tipos de dados abstratos específicos de determinado contexto.
    Como o citado SQL, table e index por exemplo são ADTs especificos no contexto de banco de dados e não interessa a linguagens de propósitos gerais.