Quando uma API é considerada uma DSL incorporada?

10

Qual é a diferença entre uma API e uma DSL (Linguagem Específica de Domínio) incorporada?

É apenas sintaxe?

Considere uma API como o OpenGL. Qual é a diferença de uma DSL gráfica?

Em outras palavras, se uma API é suficientemente complexa, ela pode ser considerada uma DSL incorporada?

Phyllostachys
fonte
11
O objetivo de uma DSL é tornar as coisas mais simples. Você não deveria estar perguntando se uma API suficientemente simples poderia ser considerada uma DSL?
Doval 31/07
Suponho que o que eu quero saber / entender é como as API e DSLs são diferenciadas. Eu coloquei complexo lá porque acho que quando alguém está constantemente fazendo chamadas para uma API, é bastante específico do domínio, ou pelo menos é assim que eu pensava originalmente sobre isso.
Phyllostachys
11
A questão é qual é a diferença entre uma API e uma DSL incorporada ?
proskor

Respostas:

8

A distinção é difícil de fazer e depende da linguagem usada. Também é subjetivo.

No clojure, você pode definir APIs que se parecem com uma DSL. Por exemplo, o soluço permite gerar html:

(html [:span {:class "foo"} "bar"])

Isso pode ser considerado como um DSL com uma sintaxe lisp. O fato de htmlpoder ser uma macro fornece a mesma quantidade de poder, como se você estivesse escrevendo uma biblioteca de modelos html com expressões s (consulte sxml )

Em python, a mesma API pode se parecer com:

html(["span", {"class" : "foo"}, "bar"])

html é uma função. Seu argumento será avaliado primeiro e, em seguida, a chamada da função acontecerá. O fato de a sintaxe python ser mais específica e a semântica python ser mais rigorosa significa que essa expressão é mais difícil de interpretar como uma DSL independente da linguagem.

Uma representação de linguagem clássica é uma árvore como estrutura de dados e uma função eval chamada recursivamente em seus nós. As linguagens LISP tornam essa estrutura em árvore muito aparente, portanto, qualquer chamada de função aninhada é indistinguível de um recurso de linguagem interno. É por isso que a comunidade LISP fala sobre DSLs para quase tudo.

Acredito que a programação é fornecer abstrações úteis. Acho que olhar para tudo o que você constrói (uma biblioteca ou mesmo a interface do usuário do seu aplicativo) como elementos de linguagem, ajudando as pessoas a resolver um problema complexo, é uma maneira eficaz de projetar a maioria das coisas. Com essa perspectiva, afirmo que todas as bibliotecas são DSLs, mas algumas delas são mal projetadas :-)

Simon Bergot
fonte
4

APIs e DSLs são conceitos bastante diferentes e há apenas algumas áreas em que se diz que se sobrepõem.

Todos os DSLs são linguagens de computador . Eles podem ser interpretados, compilados, de marcação, linguagens de consulta (por exemplo, SQL) ou (como JSON ou alguns usos de XML) linguagens de dados que podem ser usadas em mensagens passadas por uma API, mas devem ser linguagens . O termo descreve a natureza , não o objetivo.

APIs são interfaces que permitem que um componente de software seja usado por outros componentes. O termo descreve o objetivo , não a natureza. Uma API pode ser um conjunto de métodos de objetos, por exemplo - que não é uma DSL. Uma API da web pode usar uma DSL (ou, se for tranqüila, você pode argumentar que é uma DSL), mas uma linguagem específica de domínio compartilhada não faz parte da definição. Um driver de software para um dispositivo pode ser escrito em C, a API distribuída como uma biblioteca compilada, o protocolo totalmente binário e qualquer idioma que possa usar a biblioteca pode ser usado para criar um cliente. Nada nessa API poderia ser chamado de DSL (uma lista de nomes simbólicos para as funções da API não é suficiente).

Estou um pouco confuso sobre o motivo pelo qual você só pode ver semelhanças, dadas as definições.

itsbruce
fonte
Como comentou um comentarista, devo ter considerado apenas DSLs incorporadas. Considere algo como Forth, onde se constrói um dicionário de palavras. Eu li isso ao criar uma DSL quando se aproxima de ter um aplicativo completo de recursos, mas parece muito com uma API.
31414 Phyllostachys
2
O que realmente não afeta minha resposta. Se é uma linguagem, com sua própria sintaxe, etc, é uma DSL. Uma interface complexa que não possui esses recursos de idioma não é uma DSL. Você provavelmente deve atualizar sua pergunta e considerarei atualizar minha resposta.
itsbruce
2
Uma sub-linguagem ainda é uma linguagem. Não é necessário ter sua própria sintaxe, ele pode "emprestá-lo" do idioma do host.
proskor
Então, todos os projetos não são seus próprios DSL quando terminam (ou seja, linguagens de programação gerais são eventualmente DSLs)? Um tipo contínuo de geral para específico de domínio.
Phyllostachys
4

Em geral, não. Uma DSL é deliberadamente tornada não geral com o objetivo de tornar algumas operações mais convenientes. Coisas como HTML ou Logo eram originalmente idiomas específicos do domínio.

Em geral, você não pode incorporar uma DSL em outro idioma, mesmo com a API mais poderosa; o que você programar contra essa API ainda parecerá uma série de expressões na linguagem host e não será tão conveniente quanto seria o uso de uma linguagem para fins especiais.

As exceções são linguagens que oferecem oportunidades excepcionais para distorcer a sintaxe por meio de uma biblioteca (sobrecarga de operadores como C ++, invenção de novos operadores como Scala ou até mesmo uma declaração de sintaxe de leitura completamente diferente, como Perl, com filtros de origem). Quando você usa esse idioma e aproveita ao máximo a flexibilidade que eles oferecem, o resultado pode se parecer com um novo idioma de finalidade especial (mas a semântica geralmente é sutilmente diferente do que você esperaria se o idioma fosse realmente inventado). do zero para servir aos seus fins).

Kilian Foth
fonte
Portanto, talvez se possa criar algo que analise uma string (DSL) que atue como um invólucro simples para uma API grande. Suponho que a separação do DSL do que analisa o DSL é a diferenciação.
Phyllostachys
3
Sim, isso é chamado de padrão de design "Intérprete" e é considerado uma boa prática: você escreve o código do intérprete uma vez e, a partir de então, pode expressar seu conteúdo específico de domínio com muito mais facilidade.
22714 Kilian Foth
"inventando novos operadores como o Groovy" Talvez você quis dizer Scala; no Groovy, o conjunto de operadores é fixo, mas pode ser sobrecarregado como no C ++.
Vorg van Geir
@VorgvanGeir Desculpe, corrigido.
Kilian Foth
2

Aqui, de DslBoundary por Martin Fowler

A partir do artigo, meu entendimento é basicamente DSLs e APIs incorporadas não são tão diferentes. Mas, no entanto, há uma pequena diferença aqui.

  1. A API enfatiza o fornecimento de uma nova instalação.
  2. O DSL não fornece apenas um novo recurso, mas uma nova sintaxe e a nova maneira de codificar também.

Mas se falar de DSL externo , será outra história. O DSL externo é como uma pequena linguagem de programação, mas com certeza não é uma linguagem de uso geral, o que significa que não pode resolver todos os problemas, mas o problema específico.

fronthem
fonte
1

Acho que toda API é uma DSL incorporada, mas o inverso não é verdadeiro: nem toda DSL incorporada é uma API. Somente quando a linguagem é usada como um meio de integrar componentes, ela pode ser chamada de API.

Por que uma API pode ser considerada uma DSL incorporada? Antes de tudo, forma uma linguagem: possui elementos primitivos (tipos e operações) que podem ser combinados (por meio da linguagem hospedeira) para formar abstrações e resolver problemas complexos. Por exemplo, a API OpenGL pode ser usada para renderizar cenas 3D em tempo real. A API Collections pode ser usada para criar algoritmos que operam em conjuntos de objetos, etc. Segundo, é obviamente específico do domínio; por exemplo, o domínio da API de coleções está manipulando conjuntos de objetos e o domínio da API do OpenGL é renderização em 3D. Portanto, uma API é um idioma específico do domínio.

Mas nem todo DSL é uma API. Por exemplo, algumas DSLs não devem ser implementadas por um componente designado. Todos os sistemas definem algumas abstrações, e as abstrações que lidam com algum domínio específico podem ser consideradas uma DSL, mas isso não implica que as implementações dessas abstrações devam ser "trocáveis", ou seja, elas não precisam formar uma API . Eles poderiam, mas isso nem sempre é necessário. No entanto, nos casos em que a implementação é "componente" (desculpe pela falta de um termo melhor), o DSL se torna uma API.

proskor
fonte
Essa é apenas a sua opinião ou você pode apoiá-la de alguma forma?
gnat 31/07
@gnat Estendi minha resposta para explicar melhor meu ponto.
proskor