Quando una API è considerata un DSL incorporato?

8

Qual è la differenza tra un'API e un DSL (Domain Specific Language) incorporato?

È solo sintassi?

Considera un'API come OpenGL. Com'è diverso da un DSL grafico?

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

    
posta Phyllostachys 31.07.2014 - 15:40
fonte

5 risposte

7

La distinzione è difficile da fare e dipende dal linguaggio usato. È anche soggettivo.

In clojure, puoi definire API che assomigliano a un DSL. Ad esempio, hiccup consente di generare html:

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

Questo può essere considerato come un DSL con una sintassi Lisp. Il fatto che html possa essere una macro gli dà lo stesso potere di se stessi se si stesse scrivendo una lib di template html con espressioni s (si veda sxml )

In python, la stessa API può essere simile a:

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

html è una funzione. Il suo argomento verrà valutato per primo e quindi la chiamata alla funzione avverrà. Il fatto che la sintassi python sia più specifica e la semantica python sia più severa significa che questa espressione è più difficile da interpretare come DSL indipendentemente dalla lingua.

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

Credo che la programmazione stia fornendo utili astrazioni. Trovo che esaminare tutto ciò che costruisci (una lib o anche l'interfaccia utente della tua applicazione) come elementi linguistici che aiutano le persone a risolvere un problema complesso è un modo efficace per progettare la maggior parte delle cose. Con questa prospettiva, asserisco che tutte le librerie sono DSL, ma alcune sono mal progettate: -)

    
risposta data 31.07.2014 - 16:48
fonte
4

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

Tutti i DSL sono computer lingue . Potrebbero essere interpretati, compilati, mark-up, linguaggi di query (ad esempio SQL) o (come JSON o alcuni usi di XML) lingue di dati che potrebbero essere utilizzate nei messaggi passati su un'API, ma devono essere lingue . Il termine descrive la natura , non lo scopo.

Le API sono interfacce che consentono ad 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, ovvero non un DSL. Un'API Web potrebbe utilizzare un DSL (o, se è riposante, si potrebbe sostenere che è un DSL) ma una lingua condivisa e specifica per il 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 possa utilizzare la libreria potrebbe essere utilizzato per creare un client. Nulla in quell'API potrebbe essere chiamato DSL (un elenco di nomi simbolici per le funzioni API non lo taglia).

Sono un po 'confuso sul motivo per cui puoi vedere solo le somiglianze, date le definizioni.

    
risposta data 31.07.2014 - 16:24
fonte
4

In generale, no. Un DSL è deliberatamente reso non generale allo scopo di rendere più alcune operazioni più convenienti. Cose come HTML o Logo erano in origine lingue specifiche del dominio.

In generale, non è possibile incorporare una DSL in un'altra lingua, anche con l'API più potente; qualsiasi cosa tu stia programmando contro quella API sembrerà ancora una serie di espressioni nella lingua ospite e non sarà così comoda come lo sarebbe usare un linguaggio speciale.

Le eccezioni sono le lingue che offrono eccezionali opportunità per alterare la sintassi tramite una libreria (overloading dell'operatore come C ++, inventare nuovi operatori come Scala, o anche predire una sintassi di lettura completamente diversa come Perl con i filtri di origine). Quando si utilizza tale linguaggio e si sfrutta appieno la flessibilità offerta, il risultato può sembrare piuttosto un nuovo linguaggio per uno scopo speciale (ma la semantica sarà spesso sottilmente diversa da quella che ci si aspetterebbe se la lingua fosse veramente inventato da zero per servire i tuoi fini).

    
risposta data 31.07.2014 - 15:47
fonte
2

Qui, da DslBoundary di Martin Fowler

Dall'articolo, la mia comprensione è fondamentalmente incorporata. Le DSL e le API non fanno differenza. Tuttavia, qui c'è un po 'di differenza.

  1. API sottolinea la fornitura di una nuova funzione.
  2. DSL non ti fornisce solo una nuova funzione, ma ti fornisce anche una nuova sintassi e il nuovo modo di codificare.

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

    
risposta data 20.05.2015 - 20:43
fonte
1

Penso che ogni API sia un DSL incorporato ma il contrario non è vero: non tutti i DSL incorporati sono API. Solo quando la lingua viene utilizzata come mezzo per integrare i componenti, può essere definita un'API.

Perché un'API può essere considerata un DSL incorporato? Prima di tutto, 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 gestisce set di oggetti e il dominio dell'API OpenGL è il rendering 3D. Quindi un'API è un linguaggio specifico del dominio.

Ma non tutte le DSL sono 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 dominio specifico 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 è "componentizzata" (mi dispiace per mancanza di un termine migliore), la DSL diventa effettivamente un'API.

    
risposta data 31.07.2014 - 16:52
fonte

Leggi altre domande sui tag