Quando un'API è considerata un DSL incorporato?


10

Qual è la differenza tra un'API e un linguaggio specifico di dominio incorporato (DSL)?

È solo sintassi?

Prendi in considerazione un'API come OpenGL. In cosa differisce da una DSL grafica?

In altre parole, se un'API è sufficientemente complessa, può essere considerata una DSL integrata?


1
Il punto di una DSL è semplificare le cose. Non dovresti chiedere se un'API sufficientemente semplice possa essere considerata una DSL?
Doval,

Suppongo che ciò che voglio sapere / capire sia come si differenziano API e DSL. Ci ho messo dentro perché immagino che quando si effettuano costantemente chiamate a un'API, è piuttosto specifico per il dominio, o almeno così è stato inizialmente pensato a questo proposito.
Phyllostachys,

1
La domanda è: qual è la differenza tra un'API e un DSL incorporato ?
proskor,

Risposte:


8

La distinzione è difficile da fare e dipende dalla lingua utilizzata. È anche soggettivo.

In clojure, è possibile definire API che sembrano DSL. Ad esempio, il singhiozzo ti consente di generare html:

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

Questo può essere considerato come un DSL con una sintassi lisp. Il fatto che htmlpotrebbe essere una macro dà la stessa quantità di potenza di se stessi scrivendo una libreria di template HTML con espressioni S (vedi sxml )

In Python, la stessa API può apparire come:

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

html è una funzione. Il suo argomento verrà valutato per primo, quindi verrà eseguita la chiamata di funzione. Il fatto che la sintassi di Python sia più specifica e che la semantica di Python sia più rigorosa significa che questa espressione è più difficile da interpretare come una DSL indipendente dal linguaggio.

Una rappresentazione linguistica classica è un albero come una struttura di dati e una funzione di valutazione chiamata ricorsivamente sui suoi nodi. I linguaggi LISP rendono questa struttura ad albero molto evidente, quindi qualsiasi chiamata di funzione nidificata è indistinguibile da una funzione di linguaggio integrata. Ecco perché la comunità LISP parla di DSL per quasi tutto.

Credo che la programmazione consista nel fornire astrazioni utili. Trovo che guardare tutto ciò che costruisci (una lib o persino l'interfaccia utente della tua applicazione) come elementi linguistici che aiutano le persone a risolvere un problema complesso sia un modo efficace per progettare la maggior parte delle cose. In questa prospettiva, asserisco che tutte le librerie sono DSL, ma alcune di esse sono progettate male :-)


4

Le API e le DSL sono concetti abbastanza diversi e ci sono solo alcune aree in cui si potrebbe dire che si sovrappongano.

Tutti i DSL sono linguaggi informatici . Potrebbero essere interpretati, compilati, sottoposti a markup, linguaggi di query (ad es. SQL) o (come JSON o alcuni usi di XML) linguaggi di dati che potrebbero essere utilizzati nei messaggi passati su un'API, ma devono essere linguaggi . Il termine descrive la natura , non lo scopo.

Le API sono interfacce che consentono a un componente software di essere utilizzato da altri componenti. Il termine descrive lo scopo , non la natura. Un'API può essere un insieme di metodi oggetto, ad esempio, che non è un DSL. Un'API Web potrebbe utilizzare un DSL (o, se è riposante, potresti obiettare che si tratta di un DSL) ma un linguaggio condiviso, specifico del dominio non fa parte della definizione. Un driver software per un dispositivo potrebbe essere scritto in C, l'API distribuita come libreria compilata, il protocollo interamente binario e qualsiasi linguaggio che può utilizzare la libreria potrebbe essere utilizzato per creare un client. Nulla in quell'API può essere chiamato DSL (un elenco di nomi simbolici per le funzioni API non lo taglia).

Sono un po 'confuso sul perché puoi vedere solo somiglianze, date le definizioni.


Come ha sottolineato un commentatore, devo aver considerato solo i DSL incorporati. Considera qualcosa come Forth dove si costruisce un dizionario di parole. Ho letto che quando si costruisce una DSL man mano che ci si avvicina ad avere un'applicazione completa di funzionalità ma sembra molto simile a un'API.
Phyllostachys,

2
Il che non influisce davvero sulla mia risposta. Se è una lingua, con la sua sintassi ecc., È una DSL. Un'interfaccia complessa che manca di quelle funzionalità linguistiche non è una DSL. Probabilmente dovresti aggiornare la tua domanda e prenderò in considerazione l'aggiornamento della mia risposta.
itsbruce

2
Una sublingua è ancora una lingua. Non è necessario avere la propria "propria" sintassi, può "prenderla in prestito" dalla lingua host.
proskor,

Quindi non tutti i progetti sono i propri DSL quando sono quasi terminati (ovvero i linguaggi di programmazione generali sono alla fine DSL)? Un continuum di sorta da generale a specifico dominio.
Phyllostachys,

4

In generale, no. Una DSL viene deliberatamente resa non generale allo scopo di rendere alcune operazioni più convenienti. Cose come HTML o Logo erano in origine linguaggi specifici del dominio.

In generale, non è possibile incorporare un DSL in un'altra lingua anche con l'API più potente; qualunque cosa tu programmi contro quell'API sembrerà comunque una serie di espressioni nella lingua host e non sarà conveniente come usare una lingua per scopi speciali.

Le eccezioni sono linguaggi che offrono eccezionali opportunità di deformare la sintassi tramite una libreria (un sovraccarico dell'operatore come C ++, l'invenzione di nuovi operatori come Scala o persino la predeclarazione di una sintassi di lettura completamente diversa come Perl con i filtri di origine). Quando usi un linguaggio del genere e sfrutti appieno la flessibilità che offrono, il risultato può apparire piuttosto come un nuovo linguaggio per scopi speciali (ma la semantica sarà spesso leggermente diversa da ciò che ti aspetteresti se il linguaggio fosse davvero inventato da zero per servire i tuoi fini).


Quindi forse si potrebbe fare una cosa che analizza una stringa (DSL) che funge da semplice wrapper per un'API di grandi dimensioni. Suppongo che la differenziazione sia la separazione del DSL dalla cosa che analizza il DSL.
Phyllostachys,

3
Sì, si chiama modello di progettazione "Interprete" ed è considerato una buona pratica: scrivi una volta il codice dell'interprete e da quel momento puoi esprimere il tuo contenuto specifico del dominio molto più facilmente.
Kilian Foth,

"inventare nuovi operatori come Groovy" Forse intendevi Scala; in Groovy il set di operatori è fisso ma può essere sovraccaricato come in C ++.
Vorg van Geir,

@VorgvanGeir Siamo spiacenti, risolto.
Kilian Foth,

2

Qui, da DslBoundary di Martin Fowler

Dall'articolo, la mia comprensione è fondamentalmente DSL e API integrate non sono così differenze. Tuttavia, qui c'è un po 'di differenza.

  1. L'API sottolinea come fornire una nuova struttura.
  2. DSL non offre solo una nuova funzione, ma offre anche una nuova sintassi e il nuovo modo di codificare.

Ma se si parla di DSL esterno , sarà un'altra storia. Il DSL esterno è proprio come un piccolo linguaggio di programmazione, ma sicuramente non è un linguaggio generico che significa che non può risolvere tutti i problemi ma un problema specifico.


1

Penso che ogni API sia un DSL incorporato ma il contrario non è vero: non tutti i DSL integrati sono un'API. Solo quando il linguaggio viene utilizzato come mezzo per integrare i componenti, può essere chiamato API.

Perché un'API può essere considerata un DSL incorporato? Innanzitutto, forma un linguaggio: ha elementi primitivi (tipi e operazioni) che possono essere combinati (tramite la lingua ospite) per formare astrazioni e risolvere problemi complessi. Ad esempio, l'API OpenGL può essere utilizzata per il rendering di scene 3D in tempo reale. L'API Collections può essere utilizzata per creare algoritmi che operano su insiemi di oggetti, ecc. In secondo luogo, è ovviamente specifico del dominio; ad esempio, il dominio dell'API Collections sta gestendo insiemi di oggetti e il dominio dell'API OpenGL è il rendering 3D. Quindi un'API è una lingua specifica del dominio.

Ma non ogni DSL è un'API. Ad esempio, alcuni DSL non devono essere implementati da un componente designato. Tutti i sistemi definiscono alcune astrazioni e le astrazioni che trattano un determinato dominio possono essere considerate DSL, ma ciò non implica che le implementazioni di queste astrazioni debbano essere "scambiabili", in altre parole, non devono formare un'API . Potrebbero, ma non è sempre necessario. Tuttavia, nei casi in cui l'implementazione è "componente" (scusate la mancanza di un termine migliore), il DSL diventa effettivamente un'API.


è solo una tua opinione o puoi sostenerla in qualche modo?
moscerino il

@gnat Ho esteso la mia risposta per spiegare ulteriormente il mio punto.
proskor,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.