Uma linguagem de programação deve seguir algumas premissas importantes: ajudar o desenvolvedor à resolver problemas de forma simples e tornar o desenvolvimento o mais agradável e produtivo possível. A escolha de uma linguagem de programação apropriada pode reduzir drasticamente o custo da construção de novas aplicações, como também na sua manutenção. Uma linguagem de programação eficiente pode aumentar incrivelmente a produtividade de um programador, permitindo que ele escreva código mais escalonável, genérico, legível e de fácil manutenção.
Linguagens não são somente ferramentas para comunicação. Mais que isso, são ferramentas para pensar, que influenciam na forma que as pessoas pensam. As linguagens de programação, assim como as outras linguagens naturais, tem o propósito de estabelecer uma comunicação – neste caso, entre o programador e o computador.
Uma DSL (Domain specific language) é uma linguagem dedicada à resolver uma problema específico, ou melhor, um problema referente à um domínio (seja ele uma área de negócio ou uma necessidade não funcional). Por ter esta característica de se aproximar mais do problema, uma DSL tende a trazer mais benefícios que em uma GPL (General Purpose Language), deixando o programador à vontade para se preocupar somente (ou o máximo possível) em resolver problemas ligados ao negócio – e não em atender necessidades do compilador.
“Programming focuses on what to compute as opposed to how to compute.”
Mais que isso, novas DSL’s podem ser usadas para melhorar aspectos da engenharia de software: domain-specific analysis, testes, manutenção, modelagem e rápida prototipação. O próprio desenvolvimento de uma DSL já é uma tarefa significante de engenharia de software, necessitando de considerável investimento de tempo e recursos, pois exige do desenvolvedor tanto conhecimento do domínio, quanto expertise para o desenvolvimento de uma linguagem. Poucos possuem ambos.
DSL’s vem sendo usadas em várias áreas como: computação gráfica, sistemas financeiros, protocolos, sistemas operacionais, robot languages, etc. Estas aplicações tem mostrado claramente vantagens das DSL’s sobre as GPL’s no que diz respeito à produtividade, confiabilidade e flexibilidade no domíno em questão. Alguns exemplos de DSL’s conhecidas são: SQL (database queries), HTML (hypertext web pages), Make (software building), Excel (spreadsheets), VHDL (hardware design).
Para praticamente qualquer implementação de um problema lógico existe um design pattern no qual ele se encaixa. A criação de uma DSL não é exceção: existem basicamente oito design patterns que abordam a implementação de uma DSL:
Estes oito design patterns podem ser redistribuídos em três grupos maiores:
A definição de DSL em si, já se encaixa em um GOF Design Pattern: Interpreter. As DSL’s também podem ser chamadas de litle languages, micro languages ou mesmo application languages.
Talvez você esteja se perguntando agora: “mas o que diferencia uma API de uma DSL?”. Para mim esta linha não está totalmente clara, porque você não poderia dizer : “se sua API contém menos que N aspectos que não são escíficos do domínio, então ela é uma DSL”.
DSL’s são abstrações. Você pode criar DSL’s melhores em linguagens(embedded DSL’s nesse caso) que provêm melhores maneiras de abstração. Algumas linguagens como Python, Ruby, Smalltalk e Lisp possuem um histórico bem sucedido na criação de DSL’s devido à sua simplicidade.
Como puderam ver, as DSL’s oferecem duas principais vantagens: granho de produtividade para o programador oferecendo facilitadores para a resolução dos problemas e provendo uma forma de aproximação entre o time de desenvolvimento e os conhecedores do domínio.
Programming should be fun. Humans, should take care of human business and machines should take care of their side. – Yukihiro “Matz” Matsumoto
Leia mais em:
Popularity: 5% [?]