Idioma específico do domínio

Da Wikipédia, a enciclopédia livre
Ir para a navegação Saltar para pesquisar

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

A linha entre linguagens de propósito geral e linguagens de domínio específico nem sempre é nítida, pois 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, o Perl foi originalmente desenvolvido como uma linguagem de processamento de texto e de cola, para o mesmo domínio do AWK e dos scripts de shell , mas mais tarde foi usado principalmente como uma linguagem de programação de uso geral. Por outro lado, PostScript é uma linguagem Turing completa e, em princípio, pode ser usada para qualquer tarefa, mas na prática é usada estritamente como uma linguagem de descrição de página .

Usar

O design e uso de DSLs apropriadas é uma parte fundamental da engenharia de domínio , usando uma linguagem adequada ao domínio em questão – isso pode consistir em usar uma DSL ou GPL existente ou desenvolver uma nova DSL. Programação orientada a linguagemconsidera a criação de linguagens de propósito específico para expressar problemas como parte padrão do processo de resolução de problemas. Criar 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 bastante frequência. Pragmaticamente, uma DSL pode ser especializada em um domínio de problema específico, uma técnica de representação de problema específica, uma técnica de solução específica 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 específico e não se destina a resolver problemas fora dele (embora isso possa ser tecnicamente possível). Em contraste, linguagens de propósito 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 específica de domínio está em algum lugar entre uma pequena linguagem de programação e uma linguagem de script e é frequentemente usada de maneira análoga a uma biblioteca de programação . Os limites entre esses conceitos são bastante confusos, assim como o limite entre linguagens de script e linguagens de uso geral.

Em design e implementação

As linguagens específicas de domínio são linguagens (ou frequentemente, 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. Muitas vezes, essas pequenas linguagens podem ser usadas juntas dentro de um shell para executar tarefas de programação mais complexas.

A linha entre linguagens específicas de domínio e 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 completas, scripts ou outros. Muitas linguagens específicas de domínio não compilam para código de byte 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 SQLapresenta um caso interessante: pode ser considerada uma linguagem de domínio específico porque é específica para um domínio específico (no caso do SQL, acessando e gerenciando bancos de dados relacionais), e muitas vezes é chamado 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 por si só, talvez devido à prevalência da manipulação de banco de dados na programação e à quantidade de domínio necessária para ser um especialista na linguagem.

Esbatendo ainda mais essa linha, muitas linguagens de domínio específico têm APIs expostas 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 ao longo do tempo para incluir ferramentas de programação completas, 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 (particularmente em sua versão 2.0) várias formas de interação com sistemas 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 tipicamente linguagens de modelagem de propósito geral.

Para resumir, uma analogia pode ser útil: uma linguagem muito pequena é como uma faca, que pode ser usada de milhares de maneiras diferentes, desde cortar alimentos até cortar á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, ou seja, fazer buracos nas coisas. Uma linguagem de propósito geral é um workbench completo, com uma variedade de ferramentas destinadas a executar 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 exercício melhor e descobrem que uma linguagem específica de domínio fornece exatamente isso.

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

Idiomas Específicos de Domínio Externos e Incorporados

As DSLs implementadas por meio de um interpretador ou compilador independente são conhecidas 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 Embutidas (ou Internas) é normalmente implementada em uma linguagem host como uma biblioteca e tende a ser limitada à sintaxe da linguagem host, embora isso dependa dos recursos da linguagem host. [1]

Padrões de uso

Existem vários padrões de uso para linguagens específicas de domínio: [2] [3]

  • Processamento com ferramentas autônomas, invocadas via operação direta do usuário, geralmente na linha de comando ou de um Makefile (por exemplo, grep para correspondência de expressões regulares, 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 de uso geral host em tempo de compilação ou em tempo real
  • linguagem específica de domínio incorporada ( eDSL ), [4] implementada como bibliotecas que exploram a sintaxe de sua linguagem de uso geral host ou um subconjunto dela enquanto adiciona elementos de linguagem específicos de domínio (tipos de dados, rotinas, métodos, macros etc.). (por exemplo , jQuery , React , SQL incorporado , LINQ )
  • Linguagens específicas de domínio que são chamadas (em tempo de execução) de programas escritos em linguagens de uso 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 interpretador 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 escrito por usuários do aplicativo, (2) gerado dinamicamente pelo aplicativo ou (3) Ambas.

Muitas linguagens específicas de domínio podem ser usadas de mais de uma maneira. [ citação necessária ] 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.

Objetivos de design

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

As linguagens específicas de domínio têm objetivos de design importantes que contrastam com os das linguagens de uso geral:

Expressões

Na programação, expressões idiomáticas são métodos impostos pelos 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 de linha de comando forem alterados porque afetam o comportamento do programa.

Linguagens de programação de uso geral raramente suportam tais expressões idiomáticas, mas linguagens específicas de domínio podem descrevê-las, por exemplo:

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

Exemplos

Exemplos de linguagens específicas de domínio incluem HTML , Logo para desenho a lápis, linguagens de descrição de hardware Verilog e VHDL , MATLAB e GNU Octave para programação matricial, Mathematica , Maple e Maxima para matemática simbólica , Specification and Description Language 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 , o Generic Eclipse Modeling System para criar linguagens de diagramação, Csound para síntese de som e música e as linguagens de entrada de GraphViz e GrGen , pacotes de software usados ​​para layout de gráfico e reescrita de gráfico , Hashicorp Configuration Language usada para Terraform e outros ferramentas Hashicorp , Puppet também possui 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 iniciantes para aprender programação facilmente. Embora a linguagem sirva como uma mistura de várias linguagens, incluindo Delphi , C++ e BASIC , há uma falta de 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 a portabilidade. A linguagem serve principalmente para tornar mais fácil para qualquer pessoa aprender a linguagem e desenvolver um jogo.

Linguagem de marcação ColdFusion

A linguagem de script associada do ColdFusion é outro exemplo de linguagem específica de domínio para sites orientados a dados. Essa 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.

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

Erlang OTP

A Erlang Open Telecom Platform foi originalmente projetada para uso dentro da Ericsson como uma linguagem específica de domínio. 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 que um engenheiro implante aplicativos ou bibliotecas de suporte, que foram mostrados em benchmarks do setor para superar outras linguagens destinadas a um conjunto misto de domínios , como C e C++. A linguagem agora é oficialmente de código aberto e pode ser baixada em seu site.

FilterMeister

FilterMeister é um ambiente de programação, com 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 vários recursos específicos úteis apenas nesse domínio específico.

Modelos do MediaWiki

O recurso de modelo do MediaWiki é uma linguagem incorporada específica de domínio cujo objetivo 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 poderia fornecer um conjunto robusto de ferramentas para 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 [5] é 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 detectar casos ausentes em fórmulas bem formadas na especificação, um verificador de modelo e um provador de teorema para verifica as propriedades do programa em relação à especificação e um gerador de invariantes que constrói automaticamente invariantes com base nos requisitos.

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

Metacompiladores

Complementando a programação orientada a linguagem , assim como todas as outras formas de linguagens específicas de domínio, estão a classe de ferramentas de escrita de compiladores chamadas metacompiladores . Um metacompilador não é apenas útil para gerar analisadores e geradores de código para linguagens específicas de domínio, mas um metacompilador em si 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 do meta-compilador é frequentemente encontrada em sistemas de transformação de programas .

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

Unreal Engine antes da versão 4 e outros jogos

Unreal e Unreal Tournament revelaram uma linguagem chamada UnrealScript . Isso permitiu o 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, um exemplo mais comum é Lua para scripts. [ citação necessária ]

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

Vários Business Rules Engines foram desenvolvidos para automatizar políticas e regras de negócios usadas tanto no governo quanto no setor privado. ILOG , Oracle Policy Automation , DTRules , Drools e outros fornecem suporte para DSLs destinadas a suportar vários domínios de problemas. O DTRules chega a definir uma interface para o uso de várias DSLs dentro de um conjunto de regras.

A finalidade dos Mecanismos de Regras de Negócios é 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 fornece uma abordagem para simplificar as estruturas de controle para lógica de negócios (por exemplo, usando Declarative Rules ou Decision Tables ) juntamente com alternativas à sintaxe de programação 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 usando simulação.

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

Gere 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 linguagem cruzada, como Apache Thrift ou Buffers de protocolo do Google .

Pepino

Gherkin é uma linguagem projetada 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. Então, 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: [2] [3]

  • As linguagens de domínio específico 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 de domínio. No entanto, isso raramente é o caso. [8]
  • As linguagens específicas de domínio permitem a validação no nível do domínio. Desde que as construções da linguagem sejam seguras, qualquer frase escrita com elas pode ser considerada segura. [ citação necessária ]
  • As linguagens específicas de domínio podem ajudar a mudar o desenvolvimento de sistemas de informações de negócios de desenvolvedores de software tradicionais para o grupo tipicamente maior de especialistas em domínio que (apesar de ter menos conhecimento técnico) têm um conhecimento mais profundo do domínio. [9]
  • As 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 versus 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 equilibrar os trade-offs entre a especificidade do domínio e as construções de linguagem de programação de propósito geral.
  • Perda potencial de eficiência do processador em comparação com software codificado à mão.
  • Proliferação de linguagens específicas de domínio não padrão semelhantes, por exemplo, um DSL usado em uma seguradora versus um DSL usado em outra seguradora. [10]
  • Especialistas em domínio não-técnicos podem achar difícil escrever ou modificar programas DSL sozinhos. [8]
  • 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 trabalhistas.
  • Mais difícil 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. Utiliza edição projecional que permite superar os limites dos analisadores de linguagem e construir editores DSL, como os de tabelas e diagramas. Ele implementa programação orientada a linguagem. O MPS combina um ambiente para definição de linguagem, um ambiente de trabalho de linguagem e um Ambiente de Desenvolvimento Integrado (IDE) para tais linguagens. [11]
  • Xtext é uma estrutura de software de código aberto para o desenvolvimento de linguagens de programação e linguagens específicas de domínio (DSLs). Ao contrário dos geradores de analisadores padrão, o Xtext gera não apenas um analisador, mas também um modelo de classe para a árvore sintática abstrata. Além disso, ele fornece um IDE baseado em Eclipse personalizável e com todos os recursos. [12]
  • Racket é uma cadeia de ferramentas de linguagem multiplataforma, incluindo código nativo, compilador JIT e Javascript, IDE (além de suportar Emacs, Vim, VSCode e outros) e ferramentas de linha de comando projetadas para acomodar a criação de linguagens específicas de domínio e de uso geral. [13] [14]

Veja também

Referências

  1. ^ Fowler, Martin; Parsons, Rebeca. "Idiomas Específicos de Domínio" . Recuperado em 6 de julho de 2019 .
  2. ^ a b Marjan Mernik, Jan Heering e Anthony M. Sloane. Quando e como desenvolver linguagens específicas de domínio. ACM Computing Surveys , 37(4):316-344, 2005. doi : 10.1145/1118890.1118892
  3. ^ a b Diomidis Spinellis. Padrões de design notáveis ​​para linguagens específicas de domínio . Journal of Systems and Software , 56(1):91–99, fevereiro de 2001. doi : 10.1016/S0164-1212(00)00089-3
  4. ^ Felleisen, Matthias; Findler, Robert Bruce; Flatt, Matthew; Krishnamurthi, Shriram; Barzilay, Eli; McCarthy, Jay; Tobin-Hochstadt, Sam (março de 2018). "Uma linguagem de programação programável" . Comunicações da ACM . 61 (3): 62–71. doi : 10.1145/3127323 . S2CID 3887010 . Recuperado em 15 de maio de 2019 . 
  5. ^ Heitmeyer, C. (1998). "Usando o conjunto de ferramentas SCR* para especificar requisitos de software" (PDF) . Processos. 2º Workshop IEEE sobre Técnicas de Especificação Formal de Resistência Industrial . IEEE. págs. 12–13. doi : 10.1109/WIFT.1998.766290 . ISBN  0-7695-0081-1. S2CID  16079058 . Arquivado a partir do original (PDF) em 19/07/2004.
  6. ^ Shorre, DV (1964). "META II uma linguagem de escrita de compilador orientada a sintaxe". Anais da 19ª Conferência Nacional da ACM de 1964 : 41.301–41.3011. doi : 10.1145/800257.808896 . S2CID 43144779 . 
  7. ^ Carr, C. Stephen; Lutero, David A.; Erdmann, Sherian (1969). "O sistema de compilador-compilador TREE-META: Um sistema de meta compilador para o Univac 1108 e General Electric 645" . Relatório Técnico RADC-TR-69-83 da Universidade de Utah .
  8. ^ a b Freudenthal, Margus (1 de janeiro de 2009). "Línguas Específicas de Domínio em um Sistema de Informação Aduaneiro". Software IEEE : 1. doi : 10.1109/MS.2009.152 .
  9. ^ Aram, Michael; Neumann, Gustavo (2015-07-01). "Análise multicamadas de co-desenvolvimento de sistemas de informação de negócios" (PDF) . Journal of Internet Services and Applications . 6 (1). doi : 10.1186/s13174-015-0030-8 . S2CID 16502371 .  
  10. ^ Miotto, Eric. "Sobre a integração de corpos de conhecimento científicos e específicos de domínio em Model Driven Engineering" (PDF) . Arquivado a partir do original (PDF) em 24/07/2011 . Recuperado em 22/11/2010 .
  11. ^ "MPS JetBrains: Criador de idioma específico de domínio" .
  12. ^ "Xtexto" .
  13. ^ Tobin-Hochstadt, S.; St-Amour, V.; Culpepper, R.; Flatt, M.; Felleisen, M. (2011). "Idiomas como Bibliotecas" (PDF) . Projeto e Implementação de Linguagem de Programação .
  14. ^ Flatt, Matthew (2012). "Criando Idiomas em Raquete" . Comunicações da ACM . Recuperado em 2012-04-08 .

Leitura adicional

Links externos

Artigos