O que é um idioma específico de domínio? Alguém está usando? E de que maneira?

107

Acho que estou procurando algum tipo de introdução e ver se alguém a usou. Existe alguma vantagem particular em usá-lo?

Wikipedia:

Linguagem específica de domínio (DSL) é uma linguagem de programação ou linguagem de especificação dedicada a um domínio de problema particular, uma técnica de representação de problema particular e / ou uma técnica de solução particular.

Alguém pode dar exemplos específicos de como você o implementou ou como ele pode ser útil em um determinado cenário?

Srikar Doddi
fonte
Na verdade, linguagem específica de domínio é um termo com um significado bem definido na programação - verifique o artigo da wikipedia
1800 INFORMAÇÕES
Conforme observado abaixo, DSL não é uma linguagem, mas o nome de uma classe inteira de linguagens de propósito especial.
dmckee --- ex-moderador gatinho
Então, posso dizer que R é um DSL?
Srikar Doddi
2
No limite disso, mas eu não faria. R tem todas as estruturas de propósito geral e é usado para uma ampla variedade de cálculos; cálculos numéricos e estatísticas não são um domínio muito comum. É um bom teste de definição, no entanto.
Charlie Martin

Respostas:

114

Um idioma específico de domínio é aquele escrito para lidar com um domínio específico ou conjunto de interesses. Existem muitos deles por aí, como make, ant e rake para descrever compilações de software ou lexx e yacc para construção de linguagem. Nos últimos anos, eles se tornaram populares porque algumas coisas se combinaram para torná-los mais fáceis de construir. Grande entre essas coisas é a popularidade crescente do Ruby, que tem vários recursos que facilitam a construção de novas DSLs.

Martin Fowler é um grande defensor da ideia, como aqui .

Charlie Martin
fonte
3
Quais recursos Ruby tem que tornam a criação de uma nova DSL mais fácil?
Lernkurve
2
@Lernkurve - Ruby tinha metaprogramação, o que ajuda. rubylearning.com/blog/2010/11/23/…
James Black
@CharlieMartin poderia me informar sobre "descolado"? que tipo de linguagem exatamente é? Eu quero saber por favor,
ajude
2
Groovy é uma linguagem de script executada em uma JVM. A intenção é basicamente ser uma resposta Java para Ruby. É uma linguagem de propósito geral, mas pode ser usada para escrever DSLs. docs.groovy-lang.org/docs/latest/html/documentation/…
Charlie Martin
1
Eu gostaria de adicionar o groovy do Gradle. Se não me engano, eles têm sua própria linguagem descrevendo uma construção.
Neon Warge
67

Você pode pensar em DSLs como argumentos excessivamente complexos para funções escritas em uma linguagem de programação mais geral. A linguagem de programação real analisa o código DSL e faz algo com ele, normalmente, o código DSL se concentra apenas no que você deseja fazer e o sistema maior descobre como .

Exemplos de DSL incluem todas as linguagens de consulta (SQL, XPath, ...), todas as linguagens de template (Django, Smarty, ...), scripts de shell, especialmente incluindo coisas como twill, um navegador orientado a comandos (usado principalmente para teste automatizado ), armazenamento de dados e linguagens de intercâmbio (XML, YAML, ...) e linguagens de documentos como LaTex, HTML ou CSS.

Algumas linguagens com sintaxe muito flexível como TCL e Lisp constroem seu DSL diretamente na linguagem ... quando possível. A maioria das linguagens usa strings, geralmente carregadas de arquivos externos.

Existem vantagens particulares em usá-los? Usá-los para os fins pretendidos é muito vantajoso a ponto de você recorrer a eles sem saber, da mesma forma que tem usado (presumo) SQL ou HTML sem pensar neles como DSLs.

Ouso dizer que existem DSLs suficientes para qualquer tipo de aplicativo de que você possa precisar; você quase certamente não precisa aprender a escrever o seu próprio.

rgz
fonte
1
Engraçado, o único exemplo que você não listou é o primeiro em que penso: regex
CoffeeTableEspresso
12

(abordando o cerne da questão)

Acho que a primeira vez que vi DSL em algum lugar e sua definição como "linguagem de domínio específico" também pensei que era uma linguagem particular e concreta qual eu simplesmente não tinha ouvido falar - mas, não, é um termo geral para linguagens que são adaptado a uma área de aplicação específica.

Ironicamente, se você tivesse acabado de ouvir sobre o TCL como uma "linguagem de comando de ferramenta", você poderia pensar, como DSLs, que haveria muitos TCLs para várias ferramentas - mas, não, é o nome específico de uma linguagem de script em particular.

rndmcnlly
fonte
10

Acho que é uma linguagem adequada para resolver problemas de um domínio específico. Pode ser alguma linguagem de processamento de regras ou linguagem de descrição de serviço.

O oposto de uma linguagem específica de domínio (DSL) é uma linguagem de uso geral .

Michael Damatov
fonte
10

Tudo é um DSL ...

Assembler: MOV R1 para R2
Compiladores: Instruções de atribuição - A = A + 1, condicionais - IF (TRUE) ..., Branch - RETURN
HTML: ... descreve uma estrutura aninhada
TCP / IP: descreva para / de endereços
PDF: descreva a colocação do texto / imagem no papel
Fontes: descreva os caracteres

Qualquer linguagem que usamos para descrever um processo específico é uma DSL. Infelizmente, faltam linguagens específicas de domínio para descrever até mesmo nossos processos mais básicos, então usamos as poucas linguagens que temos para descrever tudo o que fazemos. "Compactar todos os arquivos html em meu site" requer 300 linhas de 3 ou 4 idiomas diferentes para ser concluído.

Para construir uma DSL, determine o número mínimo de caracteres necessários para descrever um processo que você pode lembrar e não requer documentação. Lembre-se de que velocidade e facilidade de uso são os principais critérios de design. A análise é tão rápida que qualquer sintaxe que você usa é adequada, eu prefiro a linguagem natural como minha sintaxe na maioria dos casos, "Pagar funcionários no primeiro dia do mês", mas específico de domínio é apenas isso, específico de domínio, você determina a sintaxe que melhor se encaixa no problema.

Eu ficaria longe de usar outras soluções que poderiam ser convenientes, mas não se encaixam no problema, como HTML que foi usado para definir dados (XML). CSV é muito útil, ele se adapta à maioria dos problemas. JSON não se encaixa na parte de facilidade de uso, é um exagero adicionar complicações desnecessárias onde o CSV funciona para a maioria dos problemas. Usamos muito o EXCEL para DSL, ele funciona muito bem para descrever pequenos problemas, abaixo de 65K a 1M de linhas, como estruturas de árvore ou menus, a coluna A é o nível, outras colunas são ícones, cores, rótulos e outros (EXCEL é um CSV editável).

Descobri que o HTML não resolveu realmente o problema do layout da página, então me livrei dele e defini uma DSL que se encaixa. Eu defini 6 regiões na página, HEADER, BODY, FOOTER, LEFT / RIGHT MARGINS e LEFT / RIGHT FULL MARGINS. Eu poderia então dizer ao gerador de páginas para adicionar uma BARRA DE TÍTULO, BARRA DE STATUS, MENUS, TABELA, FORMULÁRIOS, ..., para células específicas. Cada uma dessas células pode ser dividida em linhas e colunas em qualquer profundidade. O layout da página leva segundos para qualquer estilo.

BODY contém uma tabela dos meus funcionários
HEADER contém uma legenda da barra de título 'Hello World' com login no software Collins

Um menu DSL não se encaixa no layout de página DSL, então eu construí um DSL exclusivo para menus.

Recurso Meu Menu Principal
* define: menu, m, Nível, Etiqueta, Ícone, Ação;
m, 0, arquivo;
m, 1, open, open.gif, Dialog Open File;

Cada problema é único, o computador pode usar qualquer formato, é o humano para o qual as DSLs foram projetadas, portanto, torne-o compreensível para os humanos, algo que eles possam digitar e fazer a linguagem de palavras reais; pois são pessoas, lugares e coisas reais que estamos descrevendo.

Clif
fonte
8

Uma DSL é uma boa maneira de desenvolver uma linguagem a ser usada por não programadores. Por exemplo, se você tem um DSL para o pessoal de finanças de uma empresa, em vez de programar de acordo com as especificações deles, você pode apenas deixá-los escrever o programa que desejam. Então, se for muito lento, você pode pegar o que eles escreveram e funcionar como eles querem, escreva em uma linguagem compilada para acelerar.

James Black
fonte
5

Bem! há muitas coisas explicadas acima. Vou tentar explicar isso de uma maneira muito mais simples, como alguém como eu entenderá.

Como as linguagens de propósito geral são usadas para propósitos vastos, o DSL é feito apenas para domínios específicos. Como HTML ou CSS.

Você pode dizer se escreveu instruções para um artigo que apenas uma pessoa ou seu único melhor amigo pode entender e ninguém mais. Então pode ser um DSL. Mas se você escreveu instruções em termos que muitas pessoas pudessem entender e seguir, então isso não é DSL.

I Onces criou uma placa de switch para o usuário que poderia ser operada através da porta serial de um computador e o usuário deseja um programa para essa placa que poderia ser executado naquela placa e os interruptores de relé serão ligados e desligados de acordo. Então, escrevi algumas instruções e disse ao usuário para programar aquela placa de acordo com essas instruções. Este é um exemplo de DSL. Eu não inventei uma nova linguagem, em vez disso, apenas criei um monte de Strings que o microcontrolador poderia ler da EEPROM e poderia analisar de acordo e executar uma tarefa específica.

Abdul Rehman
fonte
4

Escrevi uma breve postagem no blog discutindo por que gosto de usar DSLs:

Gostaria de usar mais idiomas específicos de domínio (DSLs)

Nele, eu defino um DSL como:

Uma pequena linguagem de programação projetada especificamente para comunicar soluções para um determinado domínio de problemas.

Em termos de uso, se você já usou Ant, Structured Query Language (SQL) ou Cascading Style Sheets (CSS), você usou uma DSL.

Gosto de usar DSLs porque elas se concentram em facilitar a comunicação de soluções para espaços de problemas específicos e o fazem de uma forma que promove a inclusão de especialistas no domínio.

AdamJonR
fonte
3

Um exemplo simples de Domain Specific Language (DSL) é o HTML, que é usado para o domínio específico chamado de aplicativos baseados na web.

Anil Kumar
fonte
3

Recentemente ouvi DSL, mas encontro um exemplo realmente útil: LUNA (antigo lunascript).

É uma linguagem / estrutura de programação customizada feita pela equipe da Asana para sua própria plataforma.

Como eu descobri ainda, muitas empresas criam seus próprios frameworks e linguagens para criar uma vantagem competitiva adequada. Alguns exemplos são:

  • SAP com AbAp
  • PeopleSoft com PeopleCode
  • Apple com Objective-C
  • O Facebook tem coisas como FBML e FQL

Esses são específicos de domínio porque você os usará quase exclusivamente para trabalhar nessas plataformas.

Espero que esta resposta ajude você a esclarecer o conceito.

Abraham Romero
fonte
3
Objective-C não é uma linguagem de domínio específico
boraseoksoon
Também não foi feito pela (e para) a Apple.
Alexander Rossa
2

Um exemplo de DSL usado no aprendizado de máquina é patsy em python: https://patsy.readthedocs.io/en/latest/formulas.html#

que se baseia na fórmula DSL de R: https://stat.ethz.ch/R-manual/R-devel/library/stats/html/formula.html

https://cran.r-project.org/web/packages/Formula/vignettes/Formula.pdf

e Hadley tem uma boa seção de seu livro R avançado que descreve como construir uma DSL w / R: http://adv-r.had.co.nz/dsl.html

Assim que o campo de aprendizado profundo se estabilizar um pouco (ou mesmo agora), adoraria ver algo semelhante surgindo dentro do projeto Apache MXnet. No entanto, ainda não vi nenhuma proposta para isso na página de propostas .

Lucas Roberts
fonte
1

Linguagens específicas de domínio expressam seus processos de domínio e conhecimento em uma linguagem que usa diretamente os conceitos e a lógica de seu campo específico.

A comunidade está definitivamente crescendo, mas ainda não no nível de outras tecnologias "convencionais".

Na maioria das vezes, as DSLs são feitas para melhorar a produtividade dentro das empresas, portanto, elas mantêm a privacidade e não compartilham seus resultados / insights.

Aqui está uma conferência onde o palestrante dá alguns exemplos de DSL usando JetBrains MPS , com a tecnologia de edição projetional: https://vimeo.com/197381453

Oscar Rodriguez
fonte
1

DSL - linguagem específica do domínio. Vamos começar o que é domínio - domínio é alguma área definida, escopo. Este domínio pode ser semelhante a um site da Web, e você tem CSS e o segundo domínio pode ser a estrutura do site da Web, e aqui você tem HTML.

Mas, o domínio também pode ser um aplicativo da empresa X. E no escopo deste domínio, alguma linguagem pode ser criada. Linguagem não significa - algo totalmente temperado com sua própria gramma, sintaxe, compilador ou runtime. DSL pode ser apenas uma lista de ferramentas que resolvem problemas de domínio.

Vamos considerar a OOP e seu modelo para representar objetos de domínio por classes e métodos como os comportamentos desses objetos. Se criarmos essa estrutura e dermos comportamentos a esses objetos, poderemos escrever um código usando esses conceitos. Considere este exemplo de pseudocódigo:

cookie = async getCookie(cookieId)
user = async getUser(userId)
result async user.buy(cookie)
if (result.isError()) {
  error.showAlert("User has not enough money")
} else {
  confirmation.showSuccess("Cookie was bought")
}

Quanto acima é GPL (linguagem de propósito geral) e quanto é terminologia e ferramentas de domínio específico. Esta é uma mistura de dois, mas todos os comandos são aqui específicos do domínio. Dito isso, podemos dizer que acima está escrito em DSL onde o domínio é algum aplicativo x.

Indo em frente com este exemplo, posso criar ferramentas ainda mais abstratas e, principalmente, realizar o fluxo de controle por essas ferramentas, considere (isto é mais FP, mas espero que você entenda o que quero dizer):

waitForMany(getCookie(cookieId), getUser(userId)
  .andThen([cookie, user] -> user.buy(cookie))
  .andThen(showSuccess("Cookie was bought"))
  .whenError(showError("User has not enough money"))

Como você pode ver, consegui abstrair bastante e usar essa abstração para realizar o fluxo de controle. E tudo é baseado na GPL e funciona no âmbito da GPL.

Para revelar a verdade, todos nós escrevemos DSL, cada abstração específica de domínio que você pode usar é tipo isso. Mas a maioria dessas abstrações não são soluções completas, por isso tentamos não usar essa palavra com muita frequência. Mas se você tiver um conjunto de ferramentas, funções que abstraem seu domínio, elas formam uma espécie de DSL.

O que também é DSL, muitas coisas, por exemplo, qualquer framework que forneça um conjunto de regras é DSL. Se você vir alguém afirmando ser um desenvolvedor React, então você sabe que ele é um desenvolvedor específico de domínio, já que o React é exatamente DSL, o que é uma alternativa para o uso de plataforma web nativa. Se você pode compor a funcionalidade de ferramentas específicas de domínio existentes, então você está escrevendo usando DSL. Indo mais fundo no React, desculpe a todos os que não são deste DSL: D, você pode criar um conjunto de componentes e compô-los como blocos de construção e uau! Agora você fez DSL em cima do DSL.

Sim, repetiu DSL muitas vezes aqui, desculpe.

Maciej Sikora
fonte