Was ist eine domänenspezifische Sprache? Jemand, der es benutzt? Und auf welche Weise?

107

Ich schätze, ich suche nach einer Art Intro und sehe nach, ob jemand es benutzt hat. Gibt es besondere Vorteile bei der Verwendung?

Wikipedia:

Die domänenspezifische Sprache (DSL) ist eine Programmiersprache oder Spezifikationssprache, die einer bestimmten Problemdomäne, einer bestimmten Problemdarstellungstechnik und / oder einer bestimmten Lösungstechnik zugeordnet ist.

Kann jemand konkrete Beispiele geben, wie Sie es implementiert haben oder wie es in einem bestimmten Szenario nützlich sein kann?

Srikar Doddi
quelle
Tatsächlich ist die domänenspezifische Sprache ein Begriff mit einer genau definierten Bedeutung in der Programmierung - siehe Wikipedia-Artikel
1800 INFORMATION
Wie unten erwähnt, ist DSL nicht eine Sprache, sondern der Name einer ganzen Klasse von Spezialsprachen.
dmckee --- Ex-Moderator Kätzchen
Kann ich also sagen, dass R ein DSL ist?
Srikar Doddi
2
Am Rande, aber ich würde nicht. R hat alle Allzweckstrukturen und wird für eine Vielzahl von Berechnungen verwendet; Numerische Berechnungen und Statistiken sind keine sehr neue Domäne. Es ist jedoch ein guter Test der Definition.
Charlie Martin

Antworten:

114

Eine domänenspezifische Sprache ist eine Sprache, die für eine bestimmte Domäne oder eine Reihe von Bedenken geschrieben wurde. Es gibt viele davon, wie make, ant und rake, um Software-Builds zu beschreiben, oder Lexx und Yacc für die Sprachkonstruktion. In den letzten Jahren sind sie populär geworden, da einige Dinge kombiniert wurden, um sie einfacher zu bauen. Großartig unter diesen Dingen war die zunehmende Beliebtheit von Ruby, das über mehrere Funktionen verfügt, die das Erstellen neuer DSLs vereinfachen.

Martin Fowler ist wie hier ein großer Befürworter der Idee .

Charlie Martin
quelle
3
Welche Funktionen hat Ruby, die das Erstellen eines neuen DSL erleichtern?
Lernkurve
2
@Lernkurve - Ruby hatte Metaprogrammierung, was hilft. rubylearning.com/blog/2010/11/23/…
James Black
@CharlieMartin Könntest du mich bitte über "groovy" informieren? Welche Art von Sprache ist es genau? Ich möchte wissen, bitte
helfen
2
Groovy ist eine Skriptsprache, die in einer JVM ausgeführt wird. Es soll im Grunde eine Java-Antwort auf Ruby sein. Es ist eine Allzwecksprache, aber sie kann zum Schreiben von DSLs verwendet werden. docs.groovy-lang.org/docs/latest/html/documentation/…
Charlie Martin
1
Ich möchte Gradles Groovy hinzufügen. Wenn ich mich nicht irre, haben sie ihre eigene Sprache, die einen Build beschreibt.
Neon Warge
67

Sie können sich DSLs als zu komplexe Argumente für Funktionen vorstellen, die in einer allgemeineren Programmiersprache geschrieben sind. Die eigentliche Programmiersprache analysiert den DSL-Code und macht etwas damit. Normalerweise konzentriert sich der DSL-Code nur auf das, was Sie tun möchten, und das größere System ermittelt, wie .

Beispiele für DSL sind alle Abfragesprachen (SQL, XPath, ...), alle Vorlagensprachen (Django, Smarty, ...), Shell-Skripte, insbesondere solche wie Twill, ein befehlsgesteuerter Webbrowser (der hauptsächlich für automatisierte Tests verwendet wird) ), Datenspeicherungs- und Austauschsprachen (XML, YAML, ...) und Dokumentensprachen wie LaTex, HTML oder CSS.

Einige Sprachen mit sehr flexibler Syntax wie TCL und Lisp bauen ihre DSL direkt in die Sprache ein ... wenn möglich. Die meisten Sprachen verwenden Zeichenfolgen, die normalerweise aus externen Dateien geladen werden.

Gibt es besondere Vorteile bei der Verwendung? Die Verwendung für die beabsichtigten Zwecke ist bis zu dem Punkt sehr vorteilhaft, an dem Sie sich ohne Wissen an sie wenden, genau wie Sie (ich nehme an) SQL oder HTML verwendet haben, ohne sie als DSLs zu betrachten.

Ich wage zu sagen, dass es genügend DSLs für jede Art von Anwendung gibt, die Sie benötigen. Sie müssen mit ziemlicher Sicherheit nicht lernen, wie Sie Ihr eigenes schreiben.

rgz
quelle
1
Komischerweise ist das einzige Beispiel, das Sie nicht
aufgelistet haben,
12

(spricht den Kern der Frage an)

Ich denke, als ich DSL zum ersten Mal irgendwo sah und seine Definition als "domänenspezifische Sprache", dachte ich auch, dass es eine bestimmte, konkrete Sprache war , von der ich gerade noch nichts gehört hatte - aber nein, es ist ein allgemeiner Begriff für Sprachen, die es sind auf einen bestimmten Anwendungsbereich zugeschnitten.

Ironischerweise könnten Sie , wenn Sie gerade von TCL als "Werkzeugbefehlssprache" gehört hätten, wie bei DSLs denken, dass es viele TCLs für verschiedene Werkzeuge geben würde - aber nein, es ist der spezifische Name einer bestimmten Skriptsprache.

rndmcnlly
quelle
10

Ich denke, es ist eine Sprache, die geeignet ist, Probleme für eine bestimmte Domäne zu lösen. Es kann sich um eine Regelverarbeitungssprache oder eine Dienstbeschreibungssprache handeln.

Das Gegenteil zu einer domänenspezifischen Sprache (DSL) ist eine Allzwecksprache .

Michael Damatov
quelle
10

Alles ist ein DSL ...

Assembler: MOV R1 zu R2
Compiler: Zuweisungsanweisungen - A = A + 1, Bedingungen - IF (TRUE) ..., Branch - RETURN
HTML: ... beschreiben eine verschachtelte Struktur
TCP / IP: beschreiben zu / von Adressen
PDF: Text- / Bildplatzierung auf Papier
beschreiben Schriftarten: Zeichen beschreiben

Jede Sprache, mit der wir einen bestimmten Prozess beschreiben, ist DSL. Leider fehlt es an domänenspezifischen Sprachen, um selbst unsere grundlegendsten Prozesse zu beschreiben. Daher verwenden wir die wenigen Sprachen, die wir benötigen, um alles zu beschreiben, was wir tun. "Alle HTML-Dateien auf meiner Website komprimieren" erfordert 300 Zeilen mit 3 oder 4 verschiedenen Sprachen.

Um ein DSL zu erstellen, legen Sie die Mindestanzahl von Zeichen fest, die zur Beschreibung eines Prozesses erforderlich sind, an den Sie sich erinnern können und für den keine Dokumentation erforderlich ist. Denken Sie daran, dass Geschwindigkeit und Benutzerfreundlichkeit die Hauptkriterien für das Design sind. Das Parsen ist so schnell, dass jede von Ihnen verwendete Syntax in Ordnung ist. In den meisten Fällen bevorzuge ich die natürliche Sprache als meine Syntax "Mitarbeiter am ersten des Monats bezahlen", aber domänenspezifisch ist genau das, domänenspezifisch. Sie bestimmen die Syntax, die am besten ist passt zum Problem.

Ich würde mich von anderen Lösungen fernhalten, die praktisch sein könnten, aber nicht zu dem Problem passen, wie z. B. HTML, das zum Definieren von Daten (XML) verwendet wurde. CSV ist sehr nützlich, es passt zu den meisten Problemen. JSON passt nicht zum benutzerfreundlichen Teil, es ist ein Overkill, der unnötige Komplikationen hinzufügt, wenn CSV für die meisten Probleme funktioniert. Wir verwenden EXCEL häufig für DSL. Es eignet sich hervorragend zur Beschreibung kleiner Probleme unter 65 KB bis 1 Million Zeilen, z. B. Baumstrukturen oder Menüs. Spalte A ist die Ebene, andere Spalten sind Symbole, Farben, Beschriftungen usw. (EXCEL ist eine bearbeitbare CSV).

Ich stellte fest, dass HTML das Problem des Seitenlayouts nicht wirklich löste, also habe ich es beseitigt und ein DSL definiert, das passt. Ich habe 6 Regionen auf der Seite definiert: HEADER, BODY, FOOTER, LEFT / RIGHT MARGINS und LEFT / RIGHT FULL MARGINS. Ich könnte dann den Seitengenerator anweisen, bestimmten Zellen eine TITELLEISTE, eine STATUSLEISTE, ein MENÜ, eine TABELLE, FORMEN usw. hinzuzufügen. Jede dieser Zellen kann dann bis zu einer beliebigen Tiefe in Zeilen und Spalten aufgeteilt werden. Das Seitenlayout dauert für jeden Stil Sekunden.

KÖRPER enthält eine Tabelle meiner Mitarbeiter
HEADER enthält eine Titelleistenbeschriftung "Hallo Welt" mit Login bei Collins Software

Ein Menü-DSL passt nicht zum Seitenlayout-DSL, daher habe ich ein einzigartiges DSL für Menüs erstellt.

Ressource Mein Hauptmenü
* definieren: Menü, m, Ebene, Beschriftung, Symbol, Aktion;
m, 0, Datei;
m, 1, open, open.gif, Dialog Open File;

Jedes Problem ist einzigartig, der Computer kann jedes Format verwenden, es ist der Mensch, für den DSLs entwickelt wurden. Machen Sie es für den Menschen verständlich, etwas, das er eingeben kann, und machen Sie die Sprache aus echten Wörtern. denn es sind reale Menschen, Orte und Dinge, die wir beschreiben.

Clif
quelle
8

Ein DSL ist ein guter Weg, um eine Sprache zu entwickeln, die von Nicht-Programmierern verwendet wird. Wenn Sie beispielsweise ein DSL für die Finanzmitarbeiter in einem Unternehmen haben, können Sie sie einfach das Programm schreiben lassen, das sie ausführen möchten, anstatt nach deren Spezifikation zu programmieren. Wenn es dann zu langsam ist, können Sie das, was sie geschrieben haben, so verwenden, wie es will, in eine kompilierte Sprache schreiben, um es zu beschleunigen.

James Black
quelle
5

Gut! Es gibt viele Dinge, die oben erklärt wurden. Ich werde versuchen, dies auf viel einfachere Weise zu erklären, da jemand wie ich es verstehen wird.

Da Allzwecksprachen für umfangreiche Zwecke verwendet werden, wird DSL nur für bestimmte Domänen erstellt. Wie HTML oder CSS.

Sie können sagen, wenn Sie Anweisungen auf ein Papier geschrieben haben, das nur eine Person oder Ihr einziger bester Freund verstehen kann und niemand sonst. Dann kann es ein DSL sein. Aber wenn Sie Anweisungen in solchen Begriffen geschrieben haben, die viele Menschen verstehen und befolgen könnten, dann ist dies kein DSL.

Ich habe einmal eine Switch-Karte für den Benutzer erstellt, die über die serielle Schnittstelle eines Computers betrieben werden kann, und der Benutzer möchte ein Programm für diese Karte, das auf dieser Karte ausgeführt werden kann, und die Relais-Schalter werden entsprechend ein- und ausgeschaltet. Also schrieb ich einige Anweisungen und forderte den Benutzer auf, diese Karte gemäß diesen Anweisungen zu programmieren. Dies ist ein Beispiel für DSL. Ich habe keine neue Sprache erfunden, sondern nur eine Reihe von Strings erstellt, die der Mikrocontroller aus dem EEPROM lesen und entsprechend analysieren und eine bestimmte Aufgabe ausführen kann.

Abdul Rehman
quelle
4

Ich habe einen kurzen Blog-Beitrag geschrieben, in dem erläutert wird, warum ich DSLs gerne verwende:

Ich wünschte, wir hätten domänenspezifische Sprachen (DSLs) verwendet

Darin definiere ich ein DSL als:

Eine kleine Programmiersprache, die speziell für die Kommunikation von Lösungen für einen bestimmten Problembereich entwickelt wurde.

Wenn Sie jemals Ant, SQL (Structured Query Language) oder CSS (Cascading Style Sheets) verwendet haben, haben Sie DSL verwendet.

Ich benutze DSLs gerne, weil sie sich darauf konzentrieren, die Kommunikation von Lösungen für bestimmte Problembereiche zu erleichtern, und dies auf eine Weise, die die Einbeziehung von Domain-Experten fördert.

AdamJonR
quelle
3

Ein einfaches Beispiel für Domain Specific Language (DSL) ist HTML, das für die bestimmte Domäne verwendet wird, die als webbasierte Anwendungen bezeichnet wird.

Anil kumar
quelle
3

Ich habe erst kürzlich DSL gehört, finde aber ein wirklich hilfreiches Beispiel: LUNA (ehemaliges Lunascript).

Es ist eine maßgeschneiderte Programmiersprache / ein Framework, das vom Asana-Team für die eigene Plattform erstellt wurde.

Wie ich weiter finde, stellen viele Unternehmen ihre eigenen Frameworks und Sprachen her, um einen angemessenen Wettbewerbsvorteil zu erzielen. Einige Beispiele sind:

  • SAP mit AbAp
  • PeopleSoft mit PeopleCode
  • Apple mit Objective-C
  • Facebook hat Dinge wie FBML und FQL

Diese sind domänenspezifisch, da Sie sie fast ausschließlich für die Arbeit auf diesen Plattformen verwenden.

Ich hoffe, diese Antwort hilft Ihnen, das Konzept zu klären.

Abraham Romero
quelle
3
Objective-C ist keine domänenspezifische Sprache
Boraseoksoon
Es wurde auch nicht von (und für) den Apple gemacht.
Alexander Rossa
2

Ein Beispiel für ein DSL, das beim maschinellen Lernen verwendet wird, ist patsy in Python: https://patsy.readthedocs.io/en/latest/formulas.html#

Dies basiert auf der Formel DSL von 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

und Hadley hat einen schönen Abschnitt seines fortgeschrittenen R-Buches, der beschreibt, wie man ein DSL mit R erstellt: http://adv-r.had.co.nz/dsl.html

Sobald sich das Deep-Learning-Feld etwas stabilisiert hat (oder sogar jetzt), würde ich gerne sehen, dass im Apache MXnet-Projekt etwas Ähnliches entsteht. Ich habe jedoch noch keinen Vorschlag dafür auf der Vorschlagseite gesehen .

Lucas Roberts
quelle
1

Domänenspezifische Sprachen drücken Ihre Domänenprozesse und -kenntnisse in einer Sprache aus, die die Konzepte und die Logik aus Ihrem speziellen Bereich direkt verwendet.

Die Community wächst definitiv, aber immer noch nicht auf dem Niveau anderer "Mainstream" -Technologien.

In den meisten Fällen werden DSLs entwickelt, um die Produktivität in den Unternehmen zu verbessern. Daher halten sie diese privat und geben ihre Ergebnisse / Erkenntnisse nicht weiter.

Hier ist eine Konferenz, auf der der Redner einige Beispiele für DSL mit JetBrains MPS mit der Technologie der Projektionsbearbeitung gibt: https://vimeo.com/197381453

Oscar Rodriguez
quelle
1

DSL - domänenspezifische Sprache. Beginnen wir mit der Domäne - Domäne ist ein definierter Bereich, Bereich. Diese Domain kann wie eine Website aussehen, und Sie haben dafür CSS und die zweite Domain kann eine Website-Struktur haben, und hier haben Sie HTML.

Domain kann aber auch Company X Application sein. Und im Rahmen dieser Domain kann eine Sprache erstellt werden. Sprache bedeutet nicht - vollmundiges Ding mit eigener Grammatik, Syntax, Compilator oder Laufzeit. DSL kann nur eine Liste von Tools sein, die Domänenprobleme lösen.

Betrachten wir OOP und sein Modell, um Domänenobjekte nach Klassen und Methoden als Verhalten dieser Objekte darzustellen. Wenn wir eine solche Struktur erstellen und diesen Objekten Verhalten geben, können wir mit diesen Konzepten einen Code schreiben. Betrachten Sie dieses Pseudocode-Beispiel:

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")
}

Wie viel von oben ist GPL (Allzwecksprache) und wie viel ist spezifische Domain-Terminologie und Tools. Dies ist eine Mischung aus zwei, aber alle Befehle sind hier domänenspezifisch. Das heißt, wir können sagen, dass oben in DSL geschrieben ist, wo die Domäne eine Anwendung x ist.

Wenn ich mit diesem Beispiel fortfahre, kann ich noch abstraktere Tools erstellen und meistens den Kontrollfluss mit diesen Tools ausführen. Dies ist mehr FP, aber ich hoffe, Sie verstehen, was ich meine.

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

Wie Sie sehen, konnte ich ziemlich viel abstrahieren und diese Abstraktion verwenden, um den Kontrollfluss durchzuführen. Und alles basiert auf GPL und funktioniert im Rahmen der GPL.

Um die Wahrheit zu enthüllen, schreiben wir alle DSL. Jede domänenspezifische Abstraktion, die Sie verwenden können, ist so gut. Die meisten dieser Abstraktionen sind jedoch keine vollständigen Lösungen. Deshalb möchten wir dieses Wort nicht zu oft verwenden. Wenn Sie jedoch eine Reihe von Tools haben, Funktionen, die Ihre Domain abstrahieren, bilden sie eine Art DSL.

Was auch DSL ist, viele Dinge, zum Beispiel jedes Framework, das Regelsätze bereitstellt, ist DSL. Wenn Sie sehen, dass jemand behauptet, er sei ein React-Entwickler, dann wissen Sie, dass er ein domänenspezifischer Entwickler ist, da React genau DSL ist, was eine Alternative für die Verwendung der nativen Webplattform darstellt. Wenn Sie Funktionen aus vorhandenen domänenspezifischen Tools zusammenstellen können, schreiben Sie mit DSL. Wenn Sie tiefer in React einsteigen, entschuldigen Sie alle Leute, die nicht aus diesem DSL: D stammen. Sie können eine Reihe von Komponenten erstellen und diese als Bausteine ​​zusammenstellen, und hurra!, Jetzt haben Sie DSL über DSL erstellt.

Yep hat DSL hier zu oft wiederholt, sorry.

Maciej Sikora
quelle