Idioma específico do domínio - Domain-specific language

Uma linguagem específica de domínio ( DSL ) é uma linguagem de computador especializada em um determinado domínio de aplicativo . Isso está em contraste com uma linguagem de propósito geral (GPL), que é amplamente aplicável em todos os domínios. Há uma grande variedade de DSLs, desde linguagens amplamente usadas para domínios comuns, como HTML para páginas da web, até linguagens usadas por apenas um ou alguns pedaços de software, como código de software MUSH . DSLs podem ser subdivididas pelo tipo de linguagem, e incluem específicas de domínio de marcação línguas , de domínio específico de modelagem línguas (mais geralmente, linguagens de especificação ), e de domínio específico de programação línguas . Linguagens de computador para fins especiais sempre existiram na era da computação, mas o termo "linguagem de domínio específico" tornou-se mais popular devido ao surgimento da modelagem de domínio específico . DSLs mais simples, particularmente aquelas usadas por um único aplicativo, às vezes são chamadas informalmente de minilinguagens .

A linha entre as linguagens de uso geral e as linguagens específicas de domínio nem sempre é nítida, já que uma linguagem pode ter recursos especializados para um domínio específico, mas ser aplicável de forma mais ampla, ou inversamente pode, em princípio, ser capaz de ampla aplicação, mas na prática usada principalmente para um domínio específico. Por exemplo, Perl foi originalmente desenvolvido como uma linguagem de processamento de texto e colagem, para o mesmo domínio que AWK e scripts de shell , mas foi usado principalmente como uma linguagem de programação de propósito geral mais tarde. Em contraste, PostScript é uma linguagem de Turing completa e, em princípio, pode ser usada para qualquer tarefa, mas na prática é estritamente usada como uma linguagem de descrição de página .

Usar

O projeto e o uso de DSLs apropriados é uma parte fundamental da engenharia de domínio , usando uma linguagem adequada ao domínio em questão - isso pode consistir no uso de uma DSL ou GPL existente ou no desenvolvimento de uma nova DSL. A programação orientada a linguagem considera a criação de linguagens de propósito especial para expressar problemas como parte padrão do processo de solução de problemas. A criação de uma linguagem específica de domínio (com software para apoiá-la), em vez de reutilizar uma linguagem existente, pode valer a pena se a linguagem permitir que um determinado tipo de problema ou solução seja expresso de forma mais clara do que uma linguagem existente permitiria e o tipo de problema em questão reaparece com frequência suficiente. Pragmaticamente, uma DSL pode ser especializada em um domínio de problema particular, uma técnica de representação de problema particular, uma técnica de solução particular ou outros aspectos de um domínio.

Visão geral

Uma linguagem específica de domínio é criada especificamente para resolver problemas em um domínio particular e não se destina a ser capaz de resolver problemas fora dele (embora isso possa ser tecnicamente possível). Em contraste, as linguagens de uso geral são criadas para resolver problemas em muitos domínios. O domínio também pode ser uma área de negócios. Alguns exemplos de áreas de negócios incluem:

  • apólices de seguro de vida (desenvolvidas internamente por uma grande empresa de seguros)
  • simulação de combate
  • cálculo de salário
  • cobrança

Uma linguagem de domínio específico está em algum lugar entre uma pequena linguagem de programação e uma linguagem de script e é freqüentemente usada de forma análoga a uma biblioteca de programação . As fronteiras entre esses conceitos são bastante confusas, como a fronteira entre as linguagens de script e as linguagens de uso geral.

Em design e implementação

Linguagens específicas de domínio são linguagens (ou freqüentemente, sintaxes ou gramáticas declaradas) com objetivos muito específicos em design e implementação. Uma linguagem específica de domínio pode ser uma linguagem de diagramação visual, como aquelas criadas pelo Generic Eclipse Modeling System , abstrações programáticas, como Eclipse Modeling Framework ou linguagens textuais. Por exemplo, o utilitário de linha de comando grep tem uma sintaxe de expressão regular que corresponde a padrões em linhas de texto. O utilitário sed define uma sintaxe para correspondência e substituição de expressões regulares. Freqüentemente, essas pequenas linguagens podem ser usadas juntas dentro de um shell para realizar tarefas de programação mais complexas.

A linha entre as linguagens específicas de domínio e as linguagens de script é um pouco confusa, mas as linguagens específicas de domínio geralmente carecem de funções de baixo nível para acesso ao sistema de arquivos, controle entre processos e outras funções que caracterizam linguagens de programação com recursos completos, scripts ou outros. Muitas linguagens de domínio específico não compilam para código de bytes ou código executável, mas para vários tipos de objetos de mídia: GraphViz exporta para PostScript , GIF , JPEG , etc., onde Csound compila para arquivos de áudio e um domínio de rastreamento de raio linguagem específica como POV compila para arquivos gráficos. Uma linguagem de computador como SQL apresenta um caso interessante: pode ser considerada uma linguagem específica de domínio porque é específica de um domínio específico (no caso de SQL, acessando e gerenciando bancos de dados relacionais), e muitas vezes é chamada de outro aplicativo, mas o SQL tem mais palavras-chave e funções do que muitas linguagens de script, e muitas vezes é considerada uma linguagem em seu próprio direito, talvez por causa da prevalência da manipulação de banco de dados na programação e a quantidade de domínio necessário para ser um especialista na linguagem.

Desfocando ainda mais essa linha, muitas linguagens de domínio específico expuseram APIs e podem ser acessadas de outras linguagens de programação sem interromper o fluxo de execução ou chamar um processo separado e, portanto, podem operar como bibliotecas de programação.

Ferramentas de programação

Algumas linguagens de domínio específico se expandem com o tempo para incluir ferramentas de programação com recursos completos, o que complica ainda mais a questão de saber se uma linguagem é específica de domínio ou não. Um bom exemplo é a linguagem funcional XSLT , projetada especificamente para transformar um gráfico XML em outro, que foi estendida desde seu início para permitir (principalmente em sua versão 2.0) várias formas de interação de sistema de arquivos, manipulação de strings e datas e digitação de dados .

Na engenharia orientada a modelos , muitos exemplos de linguagens específicas de domínio podem ser encontrados como OCL , uma linguagem para decorar modelos com asserções ou QVT , uma linguagem de transformação específica de domínio. No entanto, linguagens como UML são normalmente linguagens de modelagem de propósito geral.

Para resumir, uma analogia pode ser útil: a Very Little Language é como uma faca, que pode ser usada de milhares de maneiras diferentes, desde cortar comida até derrubar árvores. Uma linguagem de domínio específico é como uma furadeira elétrica: é uma ferramenta poderosa com uma ampla variedade de usos, mas um contexto específico, a saber, fazer buracos nas coisas. A General Purpose Language é um ambiente de trabalho completo, com uma variedade de ferramentas destinadas a realizar uma variedade de tarefas. Linguagens específicas de domínio devem ser usadas por programadores que, olhando para seu ambiente de trabalho atual, percebem que precisam de um treinamento melhor e descobrem que uma linguagem específica de domínio fornece exatamente isso.

Tópicos de idioma específicos de domínio

Linguagens específicas de domínio externo e incorporado

DSLs implementados por meio de um interpretador ou compilador independente são conhecidos como Linguagens Específicas de Domínio Externo . Exemplos bem conhecidos incluem LaTeX ou AWK. Uma categoria separada conhecida como Linguagens específicas de domínio incorporadas (ou internas) são geralmente implementadas em uma linguagem host como uma biblioteca e tendem a ser limitadas à sintaxe da linguagem host, embora isso dependa dos recursos da linguagem host.

Padrões de uso

Existem vários padrões de uso para idiomas específicos de domínio:

  • Processamento com ferramentas autônomas, invocadas por meio de operação direta do usuário, geralmente na linha de comando ou de um Makefile (por exemplo, grep para correspondência de expressão regular, sed, lex, yacc, o conjunto de ferramentas GraphViz , etc.)
  • Linguagens específicas de domínio que são implementadas usando sistemas de macro de linguagem de programação e que são convertidas ou expandidas em uma linguagem host de propósito geral em tempo de compilação ou tempo real
  • linguagem específica de domínio incorporada ( eDSL ), implementada como bibliotecas que exploram a sintaxe de sua linguagem de uso geral de host ou um subconjunto da mesma, enquanto adicionam elementos de linguagem específicos de domínio (tipos de dados, rotinas, métodos, macros etc.). (por exemplo , jQuery , React , Embedded SQL , LINQ )
  • Linguagens específicas de domínio que são chamadas (em tempo de execução) de programas escritos em linguagens de propósito geral como C ou Perl , para executar uma função específica, geralmente retornando os resultados da operação para a linguagem de programação "host" para processamento posterior; geralmente, um intérprete ou máquina virtual para a linguagem específica do domínio é incorporado ao aplicativo host (por exemplo , strings de formato , um mecanismo de expressão regular )
  • Linguagens específicas de domínio que são incorporadas em aplicativos de usuário (por exemplo, linguagens de macro em planilhas) e que são (1) usadas para executar código que é escrito por usuários do aplicativo, (2) gerado dinamicamente pelo aplicativo, ou (3) Ambas.

Muitos idiomas específicos de domínio podem ser usados ​​de mais de uma maneira. O código DSL embutido em uma linguagem host pode ter suporte de sintaxe especial, como regexes em sed, AWK, Perl ou JavaScript, ou pode ser passado como strings.

Metas de design

A adoção de uma abordagem de linguagem específica de domínio para a engenharia de software envolve riscos e oportunidades. A linguagem específica de domínio bem projetada consegue encontrar o equilíbrio adequado entre eles.

Linguagens de domínio específico têm objetivos de design importantes que contrastam com as de linguagens de uso geral:

  • Linguagens específicas de domínio são menos abrangentes.
  • Linguagens específicas de domínio são muito mais expressivas em seu domínio.
  • Linguagens específicas de domínio devem apresentar redundância mínima .

Expressões idiomáticas

Na programação, idiomas são métodos impostos por programadores para lidar com tarefas comuns de desenvolvimento, por exemplo:

  • Certifique-se de que os dados sejam salvos antes que a janela seja fechada.
  • Edite o código sempre que os parâmetros da linha de comando forem alterados porque afetam o comportamento do programa.

Linguagens de programação de propósito geral raramente suportam tais idiomas, mas linguagens de domínio específico podem descrevê-los, por exemplo:

  • Um script pode salvar dados automaticamente.
  • Uma linguagem específica do domínio pode parametrizar a entrada da linha de comando.

Exemplos

Exemplos de linguagens específicas de domínio incluem HTML , logotipo para desenho semelhante a lápis, linguagens de descrição de hardware Verilog e VHDL , MATLAB e GNU Octave para programação de matriz, Mathematica , Maple e Maxima para matemática simbólica , especificação e linguagem de descrição para sistemas reativos e distribuídos, fórmulas e macros de planilhas , SQL para consultas de banco de dados relacional , gramáticas YACC para criar analisadores , expressões regulares para especificar lexers , Sistema de Modelagem Eclipse Genérico para criar linguagens de diagramação, Csound para síntese de som e música e as linguagens de entrada de GraphViz e GrGen , software pacotes usados ​​para layout e reescrita de gráficos , linguagem de configuração Hashicorp usada para Terraform e outras ferramentas Hashicorp , Puppet também tem sua própria linguagem de configuração .

Linguagem do GameMaker

A linguagem de script GML usada pelo GameMaker Studio é uma linguagem específica de domínio destinada a programadores novatos para aprender facilmente a programar. Embora a linguagem sirva como uma mistura de várias linguagens, incluindo Delphi , C ++ e BASIC , faltam estruturas, tipos de dados e outros recursos de uma linguagem de programação completa. Muitas das funções integradas são colocadas em sandbox para facilitar o transporte. A linguagem serve principalmente para tornar mais fácil para qualquer pessoa aprender a linguagem e desenvolver um jogo.

ColdFusion Markup Language

A linguagem de script associada do ColdFusion é outro exemplo de linguagem específica de domínio para sites baseados em dados. Esta linguagem de script é usada para entrelaçar linguagens e serviços como Java, .NET, C ++, SMS, e-mail, servidores de e-mail, http, ftp, Exchange, serviços de diretório e sistemas de arquivos para uso em sites.

O ColdFusion Markup Language (CFML) inclui um conjunto de tags que podem ser usados ​​em páginas ColdFusion para interagir com fontes de dados, manipular dados e exibir a saída. A sintaxe da tag CFML é semelhante à sintaxe do elemento HTML.

Erlang OTP

A plataforma Erlang Open Telecom foi originalmente projetada para uso dentro da Ericsson como uma linguagem de domínio específico. A linguagem em si oferece uma plataforma de bibliotecas para criar máquinas de estado finito, servidores genéricos e gerenciadores de eventos que permitem rapidamente a um engenheiro implantar aplicativos ou bibliotecas de suporte que foram mostradas em benchmarks da indústria para superar outras linguagens destinadas a um conjunto misto de domínios , como C e C ++. O idioma agora é oficialmente de código aberto e pode ser baixado de seu site.

FilterMeister

FilterMeister é um ambiente de programação, com uma linguagem de programação baseada em C, com o propósito específico de criar plug-ins de filtro de processamento de imagem compatíveis com Photoshop ; O FilterMeister é executado como um plug-in do Photoshop e pode carregar e executar scripts ou compilá-los e exportá-los como plug-ins independentes. Embora a linguagem FilterMeister reproduza uma parte significativa da linguagem C e da biblioteca de funções, ela contém apenas os recursos que podem ser usados ​​no contexto dos plug-ins do Photoshop e adiciona uma série de recursos específicos úteis apenas neste domínio específico.

Modelos MediaWiki

O recurso de modelo do MediaWiki é uma linguagem específica de domínio incorporada cujo propósito fundamental é apoiar a criação de modelos de página e a transclusão (inclusão por referência) de páginas do MediaWiki em outras páginas do MediaWiki.

Usos de engenharia de software

Tem havido muito interesse em linguagens específicas de domínio para melhorar a produtividade e a qualidade da engenharia de software . A linguagem específica de domínio pode fornecer um conjunto robusto de ferramentas para uma engenharia de software eficiente. Essas ferramentas estão começando a entrar no desenvolvimento de sistemas de software críticos.

O Software Cost Reduction Toolkit é um exemplo disso. O kit de ferramentas é um conjunto de utilitários, incluindo um editor de especificações para criar uma especificação de requisitos , um navegador de gráfico de dependência para exibir dependências de variáveis, um verificador de consistência para capturar casos ausentes em fórmulas bem formadas na especificação, um verificador de modelo e um provador de teorema para verifique as propriedades do programa em relação à especificação e um gerador invariável que constrói invariantes automaticamente com base nos requisitos.

Um desenvolvimento mais recente é a programação orientada a linguagem , uma metodologia de engenharia de software integrada baseada principalmente na criação, otimização e uso de linguagens específicas de domínio.

Metacompiladores

Complementando a programação orientada à linguagem , bem como todas as outras formas de linguagens específicas de domínio, estão a classe de ferramentas de escrita de compiladores denominadas metacompiladores . Um metacompilador não é apenas útil para gerar analisadores e geradores de código para linguagens específicas de domínio, mas o próprio metacompilador compila uma metalinguagem específica de domínio projetada especificamente para o domínio de metaprogramação .

Além de analisar linguagens específicas de domínio, os metacompiladores são úteis para gerar uma ampla variedade de ferramentas de análise e engenharia de software. A metodologia de meta-compilador é freqüentemente encontrada em sistemas de transformação de programa .

Metacompiladores que desempenharam um papel significativo na ciência da computação e na indústria de computadores incluem Meta-II e seu descendente TreeMeta .

Unreal Engine antes da versão 4 e outros jogos

Unreal and Unreal Tournament revelou uma linguagem chamada UnrealScript . Isso permitiu um rápido desenvolvimento de modificações em comparação com o concorrente Quake (usando o motor Id Tech 2 ). O mecanismo Id Tech usava código C padrão, o que significa que C tinha que ser aprendido e aplicado corretamente, enquanto o UnrealScript foi otimizado para facilidade de uso e eficiência. Da mesma forma, o desenvolvimento de jogos mais recentes introduziu suas próprias linguagens específicas, mais um exemplo comum é Lua para scripts.

Mecanismos de regras para automação de políticas

Vários mecanismos de regras de negócios foram desenvolvidos para automatizar políticas e regras de negócios usadas no setor governamental e privado. ILOG , Oracle Policy Automation , DTRules , Drools e outros fornecem suporte para DSLs com o objetivo de oferecer suporte a vários domínios de problemas. O DTRules chega a definir uma interface para o uso de várias DSLs em um Conjunto de regras.

O objetivo dos Business Rules Engines é definir uma representação da lógica de negócios da maneira mais legível possível. Isso permite que especialistas no assunto e desenvolvedores trabalhem e entendam a mesma representação da lógica de negócios. A maioria dos Mecanismos de Regras fornecem uma abordagem para simplificar as estruturas de controle para lógica de negócios (por exemplo, usando Regras Declarativas ou Tabelas de Decisão ) juntamente com alternativas para programação de sintaxe em favor de DSLs.

Linguagens de modelagem estatística

Os modeladores estatísticos desenvolveram linguagens específicas de domínio, como R (uma implementação da linguagem S ), Bugs , Jags e Stan . Essas linguagens fornecem uma sintaxe para descrever um modelo bayesiano e geram um método para resolvê-lo por meio de simulação.

Gerar modelo e serviços para várias linguagens de programação

Gerar manipulação de objetos e serviços com base em uma linguagem de descrição de interface para uma linguagem específica de domínio, como JavaScript para aplicativos da web, HTML para documentação, C ++ para código de alto desempenho, etc. Isso é feito por estruturas de linguagens cruzadas, como Apache Thrift ou Buffers de protocolo do Google .

Maxixe

Gherkin é uma linguagem desenvolvida para definir casos de teste para verificar o comportamento do software, sem especificar como esse comportamento é implementado. Ele deve ser lido e usado por usuários não técnicos usando uma sintaxe de linguagem natural e um design orientado a linhas . Os testes definidos com Gherkin devem então ser implementados em uma linguagem de programação geral. Em seguida, as etapas em um programa Gherkin atuam como uma sintaxe para invocação de método acessível a não desenvolvedores.

Outros exemplos

Outros exemplos proeminentes de idiomas específicos de domínio incluem:

Vantagens e desvantagens

Algumas das vantagens:

  • As linguagens específicas de domínio permitem que as soluções sejam expressas no idioma e no nível de abstração do domínio do problema. A ideia é que os próprios especialistas de domínio possam entender, validar, modificar e, muitas vezes, até desenvolver programas de linguagem específicos para o domínio. No entanto, raramente é esse o caso.
  • Os idiomas específicos do domínio permitem a validação no nível do domínio. Desde que as construções de linguagem sejam seguras, qualquer frase escrita com eles pode ser considerada segura.
  • Linguagens específicas de domínio podem ajudar a mudar o desenvolvimento de sistemas de informações de negócios dos desenvolvedores de software tradicionais para o grupo tipicamente maior de especialistas em domínio que (apesar de ter menos experiência técnica) têm um conhecimento mais profundo do domínio.
  • Linguagens específicas de domínio são mais fáceis de aprender, devido ao seu escopo limitado.

Algumas das desvantagens:

  • Custo de aprender um novo idioma vs. sua aplicabilidade limitada
  • Custo de projetar, implementar e manter uma linguagem específica de domínio, bem como as ferramentas necessárias para desenvolver com ela ( IDE )
  • Encontrar, definir e manter o escopo adequado.
  • Dificuldade de balancear trade-offs entre especificidade de domínio e construções de linguagem de programação de propósito geral.
  • Perda potencial de eficiência do processador em comparação com software codificado manualmente.
  • Proliferação de linguagens específicas de domínio não padronizadas semelhantes, por exemplo, uma DSL usada em uma seguradora versus uma DSL usada em outra seguradora.
  • Especialistas de domínio não técnicos podem achar difícil escrever ou modificar programas DSL por conta própria.
  • Maior dificuldade de integração do DSL com outros componentes do sistema de TI (em comparação com a integração com uma linguagem de uso geral).
  • A baixa oferta de especialistas em um determinado DSL tende a aumentar os custos de mão de obra.
  • Mais difícil de encontrar exemplos de código.

Ferramentas para projetar linguagens específicas de domínio

  • JetBrains MPS é uma ferramenta para projetar linguagens específicas de domínio. Ele usa a edição projetada que permite superar os limites dos analisadores de linguagem e construir editores DSL, como aqueles com tabelas e diagramas. Ele implementa programação orientada a linguagem. O MPS combina um ambiente para definição de linguagem, uma bancada de trabalho de linguagem e um Ambiente de Desenvolvimento Integrado (IDE) para tais linguagens.
  • Xtext é uma estrutura de software de código aberto para o desenvolvimento de linguagens de programação e linguagens de domínio específico (DSLs). Ao contrário dos geradores de analisador padrão, o Xtext gera não apenas um analisador, mas também um modelo de classe para a árvore de sintaxe abstrata. Além disso, ele fornece um IDE baseado em Eclipse personalizável e cheio de recursos.
  • Racket é uma cadeia de ferramentas de linguagem de plataforma cruzada incluindo compilador, compilador JIT, IDE e ferramentas de linha de comando projetadas para acomodar a criação de linguagens específicas de domínio e linguagens completamente novas.

Veja também

Referências

Leitura adicional

links externos

Artigos