Esse é o primeiro artigo de uma série sobre DSL–Domain 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.

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
Opa, obrigado! Correcões devidamente aplicadas. Qualquer coisa, dá um toque.
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
Espero que eles esclareçam alguma coisa. Vai sair um por dia.
Excelente iniciativa. É um assunto que me interessa bastante também!
Tudo bom? Obrigado pela força, espero que o pessoal possa se beneficiar dos artigos.
[...] preferida também? Ótimo. Mas como o Ronaldo Ferraz começou a escrever uma série 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!
Obrigado pelas palavras. Espero que o resto do material tenha sido igualmente esclarecedor.
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!!!