Uma linguagem dedicada (em inglês, linguagem de domínio específico ou DSL ) é uma linguagem de programação cujas especificações são projetadas para atender às restrições de um campo específico de aplicação . É conceitualmente oposta às linguagens de programação clássicas (ou generalistas) como Java ou C , que tendem a lidar com um conjunto de domínios. No entanto, não há consenso que defina precisamente o que é uma linguagem dedicada. Essa falta de definição precisa da natureza de uma linguagem dedicada torna difícil a tarefa de estabelecer uma história clara da origem do conceito.
Na ciência da computação, as linguagens dedicadas lidam com vários campos da computação (pilotos de computador, computação científica, bancos de dados) ou lidam com vários outros campos em que a ciência da computação está envolvida ( medicina , aeronáutica ). O uso de uma linguagem dedicada não é específica para computadores, existem linguagens dedicadas aos campos da medicina, culinária, etc. .
A construção de linguagens dedicadas é fundamentalmente diferente daquela de uma linguagem clássica. O processo de desenvolvimento pode ser muito complexo. Seu design requer habilidades duplas no campo a ser tratado e no desenvolvimento de TI. Quer seja uma linguagem interna ou externa dedicada, a implementação deste tipo de linguagem requer o uso de um modelo de design . Existem padrões de design que descrevem a implementação conforme descrito por Spinellis e, em vez disso, descrevem os estágios de desenvolvimento da linguagem. Essas duas abordagens, embora baseadas em ideias diferentes, se complementam.
O uso de linguagens dedicadas tem vantagens e desvantagens em comparação com o uso de linguagens gerais. A justificativa para o uso de idiomas dedicados pode ser baseada em considerações tecnológicas ou financeiras. Por outro lado, as vantagens e desvantagens não são as mesmas, quer se trate de uma linguagem dedicada interna ou externa.
Existem linguagens dedicadas em outras áreas além da ciência da computação. Os mais famosos são em particular:
Também podemos encontrar dicionários dedicados à linguagem da medicina, culinária, filosofia, etc. .
Um idioma dedicado a um domínio (em inglês : idioma específico do domínio "ou DSL) fornece uma notação orientada para este domínio de aplicação. Baseia-se nos conceitos e na funcionalidade do domínio em questão. Como tal, uma linguagem dedicada é uma forma eficiente de descrever e gerar programas em uma área específica.
De acordo com Gilles Muller, uma linguagem dedicada é uma linguagem de programação específica para uma família de problemas denominada "domínio". Ele permite ao programador garantir que ele construa uma linguagem apropriada e que essa linguagem atenda aos requisitos específicos do domínio de destino.
Outra definição é dada por Deursen, Klint e Visser. Uma linguagem dedicada é uma linguagem de programação ou uma linguagem de especificação executável que oferece, por meio de notações e abstrações apropriadas , poder expressivo focado e geralmente limitado a um domínio específico.
Existem dois tipos de linguagens dedicadas: linguagens dedicadas internas, também chamadas de linguagens incorporadas, ou linguagens incorporadas (em inglês : linguagem incorporada de domínio específico ou DSEL) e linguagens dedicadas externas.
Os primeiros devem ser usados no código-fonte de um programa, expresso em outro idioma conhecido como idioma do host. As linguagens que se prestam bem à recepção de uma linguagem embarcada são por exemplo: Lisp, Haskell, Tcl ...
Os últimos não se destinam a expressões adicionais em outro idioma. Os códigos-fonte dos programas que permitem implementar são autônomos e independentes de qualquer outra linguagem de programação.
De acordo com Watt, o idioma dedicado deve ter certos critérios:
Uma linguagem dedicada pode evoluir de acordo com a própria evolução do campo de aplicação. Acontece também que uma linguagem dedicada evolui para se tornar uma linguagem de programação generalista.
Os campos de aplicação de linguagens dedicadas são muito variados. No entanto, essas linguagens são criadas para realizar uma tarefa específica. Os exemplos de uso abaixo são apenas uma pequena parte dos campos de aplicação de linguagens dedicadas.
Exemplo de geração de página da web com HTML e PHP:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> <html> <head> <!-- entre les balises <?php ?>, du code PHP inclus dans du code HTML --> <title><?php echo 'Hello World'; ?></title> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> </head> <body> <!-- entre les balises <?php ?>, du code PHP inclus dans du code HTML --> <p><?php echo 'Hello World'; ?></p> </body> </html>Exemplo de consulta SQL em PHP.
<?php // Requete SQL à l'intérieur d'une variable PHP $query = "SELECT id, name FROM products ORDER BY name ;"; // PostgreSQL $result = pg_query($conn, $query); // MySQL $result = mysql_query($query); ?>Não há história real sobre idiomas dedicados porque não há consenso real sobre uma definição exata.
As primeiras linguagens de programação ( Cobol , Lisp , Fortran ) são consideradas linguagens dedicadas, embora não sejam nomeadas como tal. Essas primeiras linguagens de programação eram, de fato, dedicadas a um domínio de aplicação. Com o desenvolvimento das possibilidades de aplicação, as linguagens tenderam a se espalhar. Ao mesmo tempo, continuou a sentir-se a necessidade de linguagens especializadas para resolver necessidades específicas. Várias soluções foram encontradas:
O termo "linguagem dedicada" teria aparecido pela primeira vez em Setembro de 1984, em uma publicação da JM Neighbours. Encontramos então a ideia de linguagem dedicada com nomes diferentes, em particular “petit langue” ( pequena linguagem ) ou mesmo “micro linguagem” em 1986. Em 1996, uma conceituação da linguagem dedicada foi implementada. Os autores discutem em particular a visão de adotar a abordagem entre "domínio como um mundo real" ( domínio como um mundo real ) ou a abordagem de "domínio como um conjunto de sistemas" ( domínio como um conjunto de sistemas ) para modelar um sistema dedicado língua.
A realização de linguagens dedicadas é fundamentalmente diferente daquela das linguagens de programação tradicionais. O processo de desenvolvimento pode ser muito complexo. Requer experiência na área em questão, mas também conhecimento na área de design de linguagem de programação.
Na prática, o desenvolvimento de uma linguagem dedicada não é um processo sequencial simples, mas um processo iterativo. Para que a linguagem esteja o mais próximo possível do domínio visado, a construção requer uma dupla habilidade (do domínio da aplicação e da programação da linguagem), ou uma estreita colaboração entre a equipe de programadores e os especialistas do tratado domínio.
Diomidis Spinellis (en) e Anthony M Sloane oferecem padrões de design de linguagem dedicados.
O método de caracterização de um idioma dedicado especifica que ele deve ser descrito de acordo com duas sintaxes:
Ele deve ser construído usando essas duas partes, começando com a árvore da sintaxe abstrata e complementando com uma ou mais ramificações da sintaxe concreta.
Os padrões Spinellis estão principalmente ligados à implementação de linguagens dedicadas, ao contrário dos padrões Sloane que classificam as fases de desenvolvimento e construção de uma linguagem dedicada. Spinellis oferece oito padrões de design para idiomas dedicados, classificados em três tipos:
Padrões estruturais ( linguagens incorporadas ( piggyback ) ) Esses padrões estão interessados nas interações entre a linguagem dedicada e as outras linguagens. Ele oferece uma linguagem de programação como um host de linguagem dedicado. Padrões comportamentais ( pipeline ) Esses padrões visam resolver os problemas de composição de linguagens dedicadas. Um sistema pode ser descrito usando uma família de linguagens dedicadas em camadas, o pipeline é mais precisamente o elemento no qual a execução e a execução das instruções desta família de linguagens dedicadas são divididas. Padrões criativos Linguagens dedicadas são, portanto, linguagens de programação reais caracterizadas por sua própria sintaxe e semântica. A descrição da sintaxe, design e implementação dessas linguagens correspondem aos seis padrões criativos de Spinellis: Processamento lexical ( processamento lexical ) Este modelo de processamento léxico criativo oferece uma maneira eficiente de projetar e implementar a sintaxe de linguagens dedicadas; Extensão de idioma ( extensão de idioma ) Este padrão é usado para adicionar nova funcionalidade a uma linguagem dedicada existente. Freqüentemente, uma linguagem existente pode efetivamente atender a uma nova necessidade com a adição de algumas novas funcionalidades ao seu kernel que a tornam uma linguagem base; Língua de especialização ( especialização linguística ) Este padrão elimina ou modifica características de uma linguagem básica (ou generalista) para formar uma linguagem dedicada; Transformação de fonte para fonte (transformação de fonte para fonte ) O programa de linguagem dedicado é traduzido para um programa equivalente em uma linguagem geral, permitindo assim reutilizar todas as ferramentas vinculadas a esta linguagem sem ter que modificá-las; Representação das estruturas de dados ( estrutura de representação de dados ) Estruturas complexas às vezes são difíceis de expressar, o design de uma linguagem dedicada é uma solução interessante para representar dados e estruturas complexas; Sistema frontal ( front-end do sistema ) Este padrão gerencia a configuração e adaptação das funcionalidades do sistema de linguagens dedicadas de forma a se limitar ao necessário para a criação de uma determinada aplicação. Padrões de SloaneProjetar uma linguagem dedicada é uma tarefa difícil, existem muitas abordagens relacionadas principalmente a restrições de domínio. Diversas classificações têm sido propostas para melhor compreender as motivações e os limites de cada uma dessas concepções, como os padrões de Sloane que são classificados de acordo com as fases do desenvolvimento da linguagem. As diferentes fases do desenvolvimento do Sloane são as seguintes:
Além das especificidades das diferentes línguas, o uso de uma linguagem dedicada em comparação com o uso de linguagens generalistas tem vantagens e desvantagens.
Veja Questões Econômicas para mais informações sobre as implicações econômicas.
Benefícios de idiomas dedicados internos
Vantagem de idiomas externos dedicados
O uso de linguagens dedicadas a um domínio envolve várias questões econômicas, como seu custo de aprendizado e seu custo de manutenção.
Uma das questões econômicas diz respeito ao tempo gasto no aprendizado do idioma. De fato, o custo de aprender uma língua geral pode ser mais facilmente amortizado pela multiplicação dos campos de aplicação tratados. No caso de um idioma dedicado, o campo de amortecimento é menor dependendo do campo de aplicação. É preciso poder medir o ganho de produtividade gerado pelo seu uso e determinar em que medida esse ganho compensa o tempo de aprendizagem.
Por outro lado, o uso de línguas dedicadas na educação também é discutido. É possível oferecer o aprendizado de uma língua dedicada, que os alunos podem usar para aprender outras línguas gerais. Também é possível oferecer a aprendizagem de várias línguas generalistas para, então, poder utilizar línguas dedicadas de acordo com o campo de aplicação.
O uso de uma linguagem dedicada implica sua implementação. O custo inicial do desenvolvimento da linguagem também deve ser levado em consideração ao medir o impacto econômico. Paul Hudak (en) propõe uma abordagem para limitar esse custo inicial. Essa abordagem é baseada em linguagens dedicadas incorporadas (internas). O princípio é aproveitar a infraestrutura e as ferramentas do ambiente de desenvolvimento de uma linguagem geral.
Um dos desafios econômicos é a sustentabilidade dos programas produzidos, bem como a possibilidade de desenvolvimento da linguagem. Na verdade, o custo de manter um idioma dedicado é menor do que o de um idioma geral.
(en) Modelagem de domínio da organização: Relatório Técnico STARS-VC-A025 / 001/00, Synquiry Technologies,1996, 509 p. ( leia online )