Linguagens específicos de domínio

O que são linguagens específicas de domínio (DSLs)?

Uma linguagem específica de domínio é uma linguagem de programação com um nível mais alto de abstração otimizado para uma classe específica de problemas. Uma DSL usa os conceitos e regras do campo ou domínio.

Como as linguagens específicas de domínio diferem das linguagens de programação "reais"?

Uma linguagem específica de domínio é geralmente menos complexa do que uma linguagem de uso geral, como Java, C ou Ruby. Geralmente, as DSLs são desenvolvidas em estreita coordenação com os especialistas na área para a qual a DSL está sendo projetada. Em muitos casos, as DSLs devem ser usadas não pelo pessoal de software, mas sim por não programadores que são fluentes no domínio que a DSL aborda.

Quais são os benefícios das linguagens específicas de domínio? Por que eu deveria me importar?

O uso de DSLs pode colher uma infinidade de benefícios. O benefício mais óbvio do uso de DSLs é que, uma vez que você tenha uma linguagem e um mecanismo de transformação, seu trabalho no aspecto específico do desenvolvimento de software coberto pela DSL se torna muito mais eficiente, simplesmente porque você não precisa fazer o trabalho pesado manualmente. Se você estiver gerando código-fonte do seu programa de DSL (em vez de interpretá-lo), poderá usar abstrações agradáveis e específicas de domínio sem pagar nenhuma sobrecarga de tempo de execução, porque o gerador, como um compilador, pode remover as abstrações e gerar código eficiente.

Se você tem uma maneira de expressar preocupações com o domínio em um idioma estreitamente alinhado com o domínio, seu pensamento se torna mais claro porque o código que você escreve não fica confuso pelos detalhes da implementação. Em outras palavras, o uso de DSLs permite separar a complexidade essencial da incidental.

As DSLs, cujo domínio, abstrações e notações estão intimamente alinhados à maneira como os especialistas em domínio (ou seja, não programadores) se expressam, permitem uma excelente integração entre os técnicos e o pessoal do domínio.

O uso de DSLs e um mecanismo de execução torna a lógica do aplicativo expressa no código DSL independente da plataforma de destino. O uso de DSLs pode aumentar a qualidade do produto criado: menos erros, melhor conformidade arquitetural, maior capacidade de manutenção. Esse é o resultado da remoção de graus de liberdade (desnecessários), a prevenção de duplicação de código e a automação do trabalho repetitivo.

Como as linguagens específicas de domínio e o código regular se encaixam?

Existem duas maneiras fundamentalmente diferentes de como o código tradicional e o código DSL podem ser integrados. O primeiro mantém o código DSL e o código regular em arquivos separados. O código DSL é então transformado em código de linguagem de programação por um gerador de código automatizado ou, alternativamente, o programa carrega o código específico do domínio e o executa. Essa primeira abordagem, com código de linguagem de propósito geral (GPL) e DSL separados, é denominada DSLs externas. Pense no SQL como um exemplo de uma DSL externa.

Uma abordagem alternativa combina código DSL e código de uso geral no mesmo arquivo de programa, levando a uma integração muito mais estreita entre eles. A DSL reutiliza a gramática e o analisador da GPL e explora as opções de extensão disponíveis do idioma do host. O termo DSLs internos é usado para descrever esses cenários.

Vale ressaltar que algumas GPLs são mais adequadas para extensão do que outras.

Ambas as abordagens podem fazer sentido, dependendo das circunstâncias, e o MPS é compatível com ambas.

A estrutura e a sintaxe de uma DSL foram definidas escrevendo código na linguagem na qual o código DSL deveria ser incorporado. Geralmente, os IDEs não sabiam sobre o DSL e, portanto, não forneciam suporte (conclusão de código, verificação de erro personalizada, etc.). Com o MPS, no entanto, você usa a estrutura MPS com suas DSLs especializadas para desenvolvimento de linguagem para definir extensões de linguagem. O IDE, portanto, sabe sobre eles, então o sistema pode fornecer suporte completo ao IDE para as linguagens incorporadas específicas de domínio.

O que é a Programação orientada a linguagem?

O termo programação orientada a linguagens foi cunhado por Sergey Dmitriev, o fundador e primeiro CEO da JetBrains e "pai" do MPS em seu artigo de 2004, Language-Oriented Programming: The Next Programming Paradigm ("Programação Orientada a Linguagens: O Próximo Paradigma de Programação"). Outras pessoas criaram abordagens relacionadas, geralmente com nomes diferentes. Um exemplo clássico foi Charles Simonyi, com sua abordagem de programação intencional. Martin Fowler também descreveu a abordagem no seu artigo de 2005, Language Workbenches: The Killer-App for Domain-Specific Languages? ("Bancadas de Trabalho de Linguagens: A Aplicação Matadora para Linguagens Específicas de Domínios?").

A ideia principal é que não utilizemos apenas uma linguagem no desenvolvimento de software, mas sim os idiomas que melhor se adequam a cada uma das tarefas. Ao contrário da programação poliglota, que na superfície defende uma abordagem semelhante, a programação orientada à linguagem incentiva explicitamente os desenvolvedores a criar seus próprios DSLs ou a estender as linguagens existentes com conceitos específicos de domínio como parte da abordagem. Para tornar isso possível, workbenches de linguagens como o MPS são um ingrediente importante da abordagem orientada a linguagens.

Com o MPS, você pode definir um editor personalizado para qualquer nova linguagem a fim de simplificar o uso de DSLs. Até mesmo especialistas em domínio, que não estão familiarizados com a programação tradicional, podem trabalhar facilmente no MPS, com linguagens específicas de domínio projetadas com sua própria terminologia específica de domínio.

No vídeo a seguir, você pode ver um exemplo de como uma resposta de voz interativa (IVR) foi feita com o MPS. Essa DSL é direcionada a pessoas não técnicas, para que a experiência do usuário seja adaptada a elas.