Domain Specific Languages: Introdução

January 7th, 2008 § 10 comments

Esse é o primeiro artigo de uma série sobre DSLDomain Specific Languages ou Linguagens Específicas de Domínio–que deve se estender por três ou quatro artigos.

O objetivo é explicar um pouco sobre o que é uma DSL e como você pode usá-las para facilitar o seu trabalho de programação, reduzindo e melhorando o seu código de maneira significativa. O conteúdo é baseado em palestras que eu dei anteriormente mas com algumas outras considerações que o tempo não permitiu durante as mesmas.

Linguagens

Um dos meus referenciais em relação ao aprendizado de programação é tentar seguir o que Alan Perlis disse sobre o assunto:

Se uma linguagem não é capaz de afetar o modo como você pensa sobre programação, não vale a pena aprendê-la.

Eu não sei se Perlis estava pensando em como linguagens podem afetar o modo como você programa, mas isso é algo que sempre me vêm à mente quando eu penso no que Perlis disse. Há uma cadeia lógica quando se pensa em linguagens, paradigmas e sintaxe. Paradigmas afetam a sintaxe da linguagem e a sintaxe afeta como você programa. Disso se segue que o desenho da linguagem necessariamente afeta como você programa. Isso parece óbvio mas o fato é que mesmo variações entre linguagens imperativas–o paradigma de maior sucesso na história da programação–podem ter um impacto significativo em com um programador é capaz de descrever os problemas em um dado domínio.

A extensão natural dessa progressão lógica é pensar o que poderia ser feito caso fosse possível implementar a sua própria linguagem. Um paradigma diferente ou uma sintaxe diferente poderiam modificar a maneira com um problema é tratado e simplificar enormemente sua resolução.

O que uma DSL se propõe a fazer é exatamente isso: tratar um problema específico, dentro de um domínio qualquer, através da criação de uma linguagem própria para o mesmo. E embora isso seja possível em maior ou menor grau em virtualmente qualquer linguagem de programação, existem certas características que facilitam esse tipo de programação. Um forte protocolo para objetos, uma sintaxe flexível e a capacidade de interceptar características da linguagem são essenciais para o aproveitamento máximo de uma DSL.

Nessa série de artigos usaremos Ruby para isso, embora os mesmos princípios possam ser aplicados em qualquer outra linguagem.

O que realmente é uma DSL?

O que hoje está se tornando conhecido como DSL atualmente já teve vários nomes dependendo da comunidade em que as mesmas eram usadas. Alguns desses nomes são:

  • Pequenas linguagens: comunidade Unix
  • Macros: usuários de Lisp e Scheme
  • Linguagens de aplicação: BI e analistas
  • Linguagens orientadas ao problema: designers de linguagens de programação

Não importa qual o nome, todos esses rótulos se referem ao mesmo conceito: linguagens (isto é, formas de expressar algum conceito) específicas (ou seja, com um propósito bem definido) de domínio (pertencentes a uma classe particular de problemas). Uma DSL é circunscrita por três definições:

  • Ela resolve um problema específico. Em outras palavras, uma DSL não tenta abarcar todos os problemas possíveis de uma aplicação, mas se fixas em um único deles. Pode existir cooperação entre várias linguagens para resolver um problema maior, mas uma DSL resolve um único problema.
  • Ela estreita o foco do domínio. Uma DSL permite que um domínio específico tenha o seu escopo reduzido através da abstração que a mesma providencia. Podem ser necessárias várias linguagens para esconder todo um problema, mas cada uma dela resolve uma parte e esconde a mesma atrás de uma abstração mais simples.
  • Ela esconde a complexidade do código. A DSL não pode ser mais complicada do que o código que pretende substituir. A abstração deve ser inequívoca mas com uma interface significativamente reduzida.

Com base em todos esses conceitos é fácil perceber que usamos várias dessas linguagens:

  • Um Makefile, por exemplo, usa uma DSL que permite especificar como determinados arquivos devem ser compilados/montados para formar uma aplicação.
  • Comandos para o shell de um sistema operacional são uma DSL para manipular os fluxos de entrada e saída de programas sendo executados. Um script é uma mera aplicação dessa linguagem.
  • SQL é uma linguagem específica para a definição e recuperação de dados descritos em um formato relacional. Por mais sofisticado que seja, ele se resume a quatro operações básicas: selecionar, inserir, atualizar e excluir.
  • Todo arquivo XML ou SGML é uma DSL em si própria. Assim, o HTML e o XHTML são aplicações específicas que também forma uma DSL por sua vez.

Um dos exemplos mais interessantes de uma DSL é a linguagem usada pelo Graphviz. Essa linguagem, chamada de DOT permite a criação de virtualmente qualquer tipo de grafo através de comandos simples e intuitivos. O código abaixo é um exemplo simples:

digraph finite_state_machine 
{
    rankdir = LR;
    size = "8,5"
    
    node [shape = doublecircle]; LR_0 LR_3 LR_4 LR_8;
    node [shape = circle];
    
    LR_0 -> LR_2 [ label = "SS(B)" ];
    LR_0 -> LR_1 [ label = "SS(S)" ];
    LR_1 -> LR_3 [ label = "S($end)" ];
    LR_2 -> LR_6 [ label = "SS(b)" ];
    LR_2 -> LR_5 [ label = "SS(a)" ];
    LR_2 -> LR_4 [ label = "S(A)" ];
    LR_5 -> LR_7 [ label = "S(b)" ];
    LR_5 -> LR_5 [ label = "S(a)" ];
    LR_6 -> LR_6 [ label = "S(b)" ];
    LR_6 -> LR_5 [ label = "S(a)" ];
    LR_7 -> LR_8 [ label = "S(b)" ];
    LR_7 -> LR_5 [ label = "S(a)" ];
    LR_8 -> LR_6 [ label = "S(b)" ];
    LR_8 -> LR_5 [ label = "S(a)" ];
}

O resultado é o seguinte:

É fácil observar pela galeria de exemplos desse pacote que o uso da DSL esconde uma complexidade enorme por trás das cenas mas é bem específica no problema que resolve.

Uma DSL é uma linguagem, mas ela não se propõe a ser completa. Ao contrário de linguagens de programação que possui construções específicas para lidar com problemas genéricos de condições, iterações e definições, uma DSL é um conjunto limitado de comandos que descrevem um intento específico sobre um problema específico.

Interna versus Externa

Uma DSL pode ser interna ou externa. Uma DSL externa geralmente pode ser utilizada pelos usuários finais da aplicação–e muitas vezes eles são o público real das mesmas–possuindo tratamento de erro mais específico para o domínio que resolvem. Em contrapartida, uma DSL internal normalmente é usada pelos próprios programadores da aplicação e não possui um tratamento de erros tão robusto porque assume que sua utilização será mais constrita.

O foco dos nossos artigos são as linguagens internas embora os princípios aqui discutidos também possam ser utilizados nas externas. O nosso objetivo é mostrar como a aplicação de linguagens internas pode reduzir o código necessário para uma aplicação e simplificar o processo de testes.

Em nosso próximo artigo veremos como um problema comum pode ser convertido de sua implementação normal para usar uma DSL que o torna mais compacto e inteligível.

§ 10 Responses to Domain Specific Languages: Introdução"

  • Muito bom o artigo!

    Estou aguardando o próximo!

    Duas pequenas correções de portugês:

    1) no parágrafo que começa com “Eu não sei se Perlis estava pensando em comum” acho que era para ser “Eu não sei se Perlis estava pensando em como”?
    2) No primeiro parágrafo do tópico “Interna versus Externa” está “As primeiros, por sua vez” quando deveria ser “Os primeiros, por sua vez”

    Abração

  • Ronaldo says:

    Opa, obrigado! Correcões devidamente aplicadas. Qualquer coisa, dá um toque.

  • Samir says:

    Muito bom Ronaldo,

    Confesso que tenho muita dificuldade sobre esse assunto e onde realmente eu deveria aplicar, vou aguardar os próximos artigos.

    abraços

  • Ronaldo says:

    Espero que eles esclareçam alguma coisa. Vai sair um por dia. :-)

  • Excelente iniciativa. É um assunto que me interessa bastante também!

  • Ronaldo says:

    Tudo bom? Obrigado pela força, espero que o pessoal possa se beneficiar dos artigos. :-)

  • […] preferida tambm? timo. Mas como o Ronaldo Ferraz comeou a escrever uma srie de artigos sobre DSL, achei que mostrando alguns exemplos de como funciona em REBOL poderia ser […]

  • resolvi ler com um pouco mais de carinho sobre DSLs e acabei chegando ao seu blog.

    parabéns pelos posts sobre DSLs! tem sido bastante esclarecedor para mim!

  • Ronaldo says:

    Obrigado pelas palavras. Espero que o resto do material tenha sido igualmente esclarecedor. :-)

  • carlos jean says:

    Muito bom o artigo!Foste muito claro na apresentação do assunto.Espero que continue!!!
    torço por isso !!!Espero que fale relacione com redes nos proximos também!!!

Leave a Reply

Your email address will not be published. Required fields are marked *

What's this?

You are currently reading Domain Specific Languages: Introdução at Superfície Reflexiva.

meta