Cos'è una lingua specifica del dominio? Qualcuno lo usa? E in che modo?


107

Immagino di cercare una sorta di intro e vedere se qualcuno l'ha usata. Ci sono particolari vantaggi nell'usarlo?

Wikipedia:

il linguaggio specifico del dominio (DSL) è un linguaggio di programmazione o un linguaggio di specifica dedicato a un particolare dominio del problema, una particolare tecnica di rappresentazione del problema e / o una particolare tecnica di soluzione.

Qualcuno può fornire esempi specifici di come l'hai implementato o di come può essere utile in un dato scenario?


In realtà il linguaggio specifico del dominio è un termine con un significato ben definito nella programmazione - controlla l'articolo di wikipedia
1800 INFORMAZIONI

COME indicato di seguito, DSL non è una lingua, ma il nome di un'intera classe di linguaggi speciali.
dmckee --- gattino ex moderatore

Quindi posso dire che R è un DSL?
Srikar Doddi

2
Al limite, ma non lo farei. R ha tutte le strutture di uso generale ed è utilizzato per un'ampia gamma di calcoli; calcoli numerici e statistiche non sono un dominio molto nrrow. Tuttavia è un buon test della definizione.
Charlie Martin

Risposte:


114

Una lingua specifica del dominio è una lingua scritta per gestire un dominio specifico o un insieme di problemi. Ce ne sono molti in giro, come make, ant e rake per descrivere build del software, o lexx e yacc per la costruzione del linguaggio. Negli ultimi anni sono diventati popolari poiché alcune cose si sono combinate per renderli più facili da costruire. Grande tra queste cose è stata la crescente popolarità di Ruby, che ha diverse caratteristiche che rendono facile creare nuovi DSL.

Martin Fowler è un grande sostenitore dell'idea, come qui .


3
Quali caratteristiche ha Ruby che facilitano la creazione di un nuovo DSL?
Lernkurve

2
@Lernkurve - Ruby aveva la metaprogrammazione, il che aiuta. rubylearning.com/blog/2010/11/23/…
James Black

@CharlieMartin potresti farmi sapere di "groovy"? che tipo di lingua è esattamente? Voglio sapere, per favore, assistere qui ..
G dangi

2
Groovy è un linguaggio di scripting che viene eseguito in una JVM. Fondamentalmente è inteso come una risposta Java a Ruby. È un linguaggio generico ma può essere utilizzato per scrivere DSL. docs.groovy-lang.org/docs/latest/html/documentation/…
Charlie Martin,

1
Vorrei aggiungere il groovy di Gradle. Se non sbaglio, hanno la loro lingua che descrive una build.
Neon Warge

67

Puoi pensare ai DSL come argomenti eccessivamente complessi per funzioni scritte in un linguaggio di programmazione più generale. Il vero linguaggio di programmazione analizza il codice DSL e fa qualcosa con esso, in genere, il codice DSL si concentra solo su ciò che si desidera fare e il sistema più grande capisce come .

Esempi di DSL includono tutti i linguaggi di query (SQL, XPath, ...), tutti i linguaggi dei modelli (Django, Smarty, ...), script di shell, in particolare inclusi roba come twill, un browser web basato su comandi (utilizzato principalmente per test automatizzati ), archiviazione dei dati e linguaggi di scambio (XML, YAML, ...) e linguaggi per documenti come LaTex, HTML o CSS.

Alcuni linguaggi con sintassi molto flessibile come TCL e Lisp costruiscono il loro DSL direttamente nella lingua ... quando possibile. La maggior parte delle lingue utilizza stringhe, solitamente caricate da file esterni.

Ci sono particolari vantaggi nell'usarli? Usarli per gli scopi previsti è molto vantaggioso al punto che ti rivolgerai a loro senza saperlo, proprio come hai usato (presumo) SQL o HTML senza pensarli come DSL.

Oserei dire che ci sono abbastanza DSL là fuori per qualsiasi tipo di applicazione di cui potresti aver bisogno; quasi certamente non hai bisogno di imparare a scrivere il tuo.


1
Abbastanza divertente, l'unico esempio che non hai elencato è il primo a cui penso: regex
CoffeeTableEspresso

12

(affrontando il nocciolo della domanda)

Penso che la prima volta che ho visto DSL da qualche parte e la sua definizione di "linguaggio specifico del dominio" ho anche pensato che fosse un linguaggio particolare e concreto di cui non avevo sentito parlare, ma no, è un termine generico per le lingue che sono su misura per una particolare area di applicazione.

Ironia della sorte, se avessi appena sentito parlare di TCL come "linguaggio di comando degli strumenti" potresti pensare, come i DSL, che ci sarebbero molti TCL per vari strumenti, ma no, è il nome specifico di un particolare linguaggio di scripting.


10

Penso che sia un linguaggio adatto a risolvere problemi per un dominio specifico. Potrebbe essere un linguaggio di elaborazione delle regole o un linguaggio di descrizione del servizio.

L'opposto di un linguaggio specifico del dominio (DSL) è un linguaggio generico .


10

Tutto è un DSL ...

Assemblatore: MOV da R1 a R2
Compilatori: Assignment Statements - A = A + 1, Conditionals - IF (TRUE) ..., Branch - RETURN
HTML: ... descrive una struttura nidificata
TCP / IP: descrive a / da indirizzi
PDF: descrivere il posizionamento di testo / immagine su carta
Font: descrivere i caratteri

Qualsiasi linguaggio che utilizziamo per descrivere un processo specifico è un DSL. Sfortunatamente mancano linguaggi specifici del dominio per descrivere anche i nostri processi più elementari, quindi usiamo i pochi linguaggi che abbiamo per descrivere tutto ciò che facciamo. "Comprimi tutti i file html nel mio sito web" richiede 300 righe di 3 o 4 lingue diverse per essere completato.

Per costruire un DSL, determina il numero minimo di caratteri necessari per descrivere un processo che puoi ricordare e che non richiede documentazione. Ricorda che velocità e facilità d'uso sono i criteri di progettazione primari. L'analisi è così veloce che qualsiasi sintassi che utilizzi va bene, preferisco il linguaggio naturale come sintassi nella maggior parte dei casi, "Paga i dipendenti il ​​primo del mese", ma specifico del dominio è proprio questo, specifico del dominio, sei tu a determinare la sintassi che meglio si adatta al problema.

Eviterei di utilizzare altre soluzioni che potrebbero essere convenienti ma non si adattano al problema, come l'HTML utilizzato per definire i dati (XML). CSV è molto utile, si adatta alla maggior parte dei problemi. JSON non si adatta alla parte di facilità d'uso, è eccessivo che aggiunge complicazioni inutili dove CSV funziona per la maggior parte dei problemi. Usiamo molto EXCEL per DSL, funziona alla grande per descrivere piccoli problemi, da 65K a 1M di righe, come strutture ad albero o menu, la colonna A è il livello, le altre colonne sono icone, colori, etichette e simili (EXCEL è un CSV modificabile).

Ho scoperto che l'HTML non risolveva davvero il problema del layout della pagina, quindi me ne sono sbarazzato e ho definito un DSL che si adattava. Ho definito 6 aree nella pagina, HEADER, BODY, FOOTER, LEFT / RIGHT MARGINS e LEFT / RIGHT FULL MARGINS. Potrei quindi dire al generatore di pagine di aggiungere una BARRA DEL TITOLO, BARRA DI STATO, MENU, TABELLA, MODULI, ..., a celle specifiche. Ciascuna di queste celle potrebbe quindi essere suddivisa in righe e colonne a qualsiasi profondità. Il layout della pagina richiede pochi secondi per qualsiasi stile.

BODY contiene una tabella dei miei dipendenti L'
INTESTAZIONE contiene una didascalia della barra del titolo "Hello World" con accesso a Collins Software

Un menu DSL non si adatta al layout di pagina DSL, quindi ho creato un DSL unico per i menu.

Risorsa Il mio menu principale
* definisce: menu, m, Livello, Etichetta, Icona, Azione;
m, 0, di file;
m, 1, open, open.gif, Finestra di dialogo Apri file;

Ogni problema è unico, il computer può utilizzare qualsiasi formato, è l'umano per cui sono progettati i DSL, quindi rendilo comprensibile agli umani, qualcosa che possono digitare e trasformare il linguaggio in parole reali; perché sono persone, luoghi e cose reali che stiamo descrivendo.


8

Un DSL è un buon modo per sviluppare un linguaggio che deve essere utilizzato dai non programmatori. Ad esempio, se hai un DSL per gli addetti alla finanza in un'azienda, invece di programmare secondo le loro specifiche puoi semplicemente lasciare che scrivano il programma che vogliono che sia fatto. Quindi, se è troppo lento, puoi prendere quello che hanno scritto che funziona come vogliono, scriverlo in un linguaggio compilato per accelerarlo.


5

Bene! ci sono molte cose spiegate sopra. Cercherò di spiegare questo in un modo molto più semplice come capirà qualcuno come me.

Poiché i linguaggi generici vengono utilizzati per scopi vasti, il DSL viene creato solo per un dominio specifico. Come HTML o CSS.

Puoi dire se hai scritto istruzioni su un foglio che solo una persona o il tuo unico migliore amico può capire e nessun altro potrebbe. Quindi potrebbe essere un DSL. Ma se hai scritto istruzioni in termini tali che molte persone potrebbero capire e potrebbero seguire, allora questo non è DSL.

Una volta ho creato una scheda Switch per l'utente che potrebbe essere azionata tramite la porta seriale di un computer e l'utente desidera un programma per quella scheda che possa essere eseguito su quella scheda e gli interruttori del relè verranno attivati ​​e disattivati ​​di conseguenza. Così ho scritto alcune istruzioni e ho detto all'utente di programmare quella scheda secondo queste istruzioni. Questo è un esempio di DSL. Non ho inventato un nuovo linguaggio, piuttosto ho semplicemente creato un gruppo di stringhe che il microcontrollore potrebbe leggere da EEPROM e potrebbe analizzare di conseguenza e potrebbe eseguire un'attività specifica.


4

Ho scritto un breve post sul blog discutendo perché mi piace usare i DSL:

Vorrei che usassimo di più le lingue specifiche del dominio (DSL)

In esso, definisco un DSL come:

Un piccolo linguaggio di programmazione progettato specificamente per comunicare soluzioni per un particolare dominio di problemi.

In termini di utilizzo, se hai mai utilizzato Ant, Structured Query Language (SQL) o Cascading Style Sheets (CSS), hai utilizzato un DSL.

Mi piace usare i DSL perché si concentrano sulla facilitazione della comunicazione di soluzioni a spazi problematici specifici, e lo fanno in un modo che promuove l'inclusione di esperti di dominio.


3

Un semplice esempio di Domain Specific Language (DSL) è l'HTML che viene utilizzato per il particolare dominio chiamato applicazioni web.


3

Ho appena sentito DSL ma trovo un esempio davvero utile: LUNA (ex lunascript).

È un linguaggio di programmazione / framework personalizzato realizzato dal team di Asana per la propria piattaforma.

Come ho scoperto inoltre, molte aziende creano i propri framework e linguaggi al fine di creare un vantaggio competitivo adeguato, alcuni esempi sono:

  • SAP con AbAp
  • PeopleSoft con PeopleCode
  • Apple con Objective-C
  • Facebook ha cose come FBML e FQL

Questi sono specifici del dominio perché li utilizzerai quasi esclusivamente per lavorare su queste piattaforme.

Spero che questa risposta ti aiuti a chiarire il concetto.


3
Objective-C non è un linguaggio specifico del dominio
boraseoksoon

Inoltre non è stato prodotto da (e per) la Apple.
Alexander Rossa

2

Un esempio di un DSL utilizzato in Machine Learning è patsy in python: https://patsy.readthedocs.io/en/latest/formulas.html#

che si basa sulla formula DSL di 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 ha una bella sezione del suo libro R avanzato che descrive come costruire un DSL con / R: http://adv-r.had.co.nz/dsl.html

Una volta che il campo di apprendimento profondo si sarà stabilizzato (o anche adesso) mi piacerebbe vedere qualcosa di simile sorgere all'interno del progetto Apache MXnet. Tuttavia, non ho ancora visto alcuna proposta in merito sulla pagina della proposta .


1

I linguaggi specifici del dominio esprimono i processi e le conoscenze del tuo dominio in un linguaggio che utilizza direttamente i concetti e la logica del tuo campo particolare.

La comunità è decisamente in crescita ma non ancora al livello di altre tecnologie "tradizionali".

Il più delle volte, i DSL sono realizzati per migliorare la produttività all'interno delle aziende, quindi mantengono la privacy e non condividono i loro risultati / intuizioni.

Ecco una conferenza in cui il relatore fornisce alcuni esempi di DSL utilizzando JetBrains MPS , con la tecnologia di editing proiezioni: https://vimeo.com/197381453


1

DSL - lingua specifica del dominio. Cominciamo cos'è il dominio: il dominio è un'area definita, ambito. Questo dominio può essere l'aspetto di un sito web, e tu hai CSS e il secondo dominio può essere la struttura del sito web, e qui hai HTML.

Tuttavia, il dominio può essere anche l'applicazione Company X. E nell'ambito di questo dominio è possibile creare una lingua. Linguaggio non significa - cosa completamente aromatizzata con il proprio gramma, sintassi, compilatore o runtime. DSL può essere solo un elenco di strumenti che risolvono i problemi del dominio.

Consideriamo OOP e il suo modello per rappresentare oggetti di dominio mediante classi e metodi come comportamenti di tali oggetti. Se creiamo tale struttura e diamo a questi oggetti comportamenti, allora possiamo scrivere un codice usando quei concetti. Considera questo esempio di pseudo codice:

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 sopra è GPL (linguaggio generico) e quanto è terminologia e strumenti di dominio specifici. Questo è un mix di due, ma tutti i comandi qui sono specifici del dominio. Detto questo possiamo dire che sopra è scritto in DSL dove il dominio è qualche applicazione x.

Andando avanti con questo esempio, posso creare strumenti ancora più astratti e per lo più eseguire il flusso di controllo da questi strumenti, considera (questo è più FP, ma spero che tu capisca cosa intendo):

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

Come puoi vedere, sono stato in grado di astrarre parecchio e utilizzare questa astrazione per eseguire il flusso di controllo. E tutto è basato su GPL e funziona nell'ambito della GPL.

Per rivelare la verità, scriviamo tutti DSL, ogni astrazione specifica del dominio che puoi usare è gentile. Ma la maggior parte di queste astrazioni non sono soluzioni complete, ecco perché tendiamo a non usare questa parola troppo spesso. Ma se hai un set di strumenti, funzioni che astraggono il tuo dominio, formano una specie di DSL.

Ciò che è anche DSL, molte cose, ad esempio qualsiasi framework che fornisce un insieme di regole è DSL. Se vedi qualcuno che afferma di essere uno sviluppatore React, allora sai che è uno sviluppatore specifico per il dominio, poiché React è esattamente DSL, un'alternativa per l'utilizzo della piattaforma web nativa. Se puoi comporre funzionalità da strumenti specifici del dominio esistente, stai scrivendo utilizzando DSL. Approfondendo React, scusate tutta la gente non da questo DSL: D, potete creare un set di componenti e comporli come blocchi di costruzione, e hurra !, ora avete creato DSL sopra DSL.

Sì, ho ripetuto DSL troppe volte qui, mi dispiace.

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.