Eine domänenspezifische Sprache (DSL) ist eine Sprache, die für die Verwendung im Kontext einer bestimmten Domäne gedacht ist. Eine Domäne kann ein geschäftlicher Kontext (z. B. Banken, Versicherungen usw.) oder ein Anwendungskontext (z. B. eine Webanwendung, eine Datenbank usw.) sein. Im Gegensatz dazu kann eine Allzwecksprache (GPL) für ein breites Spektrum an geschäftlichen Problemen und Anwendungen verwendet werden.
Eine DSL versucht nicht, es allen recht zu machen. Stattdessen wird sie für einen begrenzten Anwendungs- und Einsatzbereich geschaffen, ist aber mächtig genug, um die Probleme und Lösungen in diesem Bereich abzubilden und anzugehen. Ein gutes Beispiel für eine DSL ist HTML. Es ist eine Sprache für den Bereich der Webanwendungen. Sie kann nicht für, sagen wir, Number Crunching verwendet werden, aber es ist klar, wie weit verbreitet HTML im Web ist.
Ein GPL-Ersteller weiß nicht, wo die Sprache verwendet werden könnte oder die Probleme, die der Benutzer mit ihr lösen will. Also wird eine GPL mit generischen Konstrukten erstellt, die potentiell für jedes Problem, jede Lösung, jedes Geschäft oder jeden Bedarf verwendbar sind. Java ist eine GPL, da es auf Desktops und mobilen Geräten verwendet wird, eingebettet in das Web in den Bereichen Bankwesen, Finanzen, Versicherungen, Fertigung usw. und vieles mehr.
Klassifizierung von DSLs
In der DSL-Welt gibt es zwei Arten von Sprachen:
- Domänenspezifische Sprache (DSL): Die Sprache, in der eine DSL geschrieben oder präsentiert wird
- Host-Sprache: Die Sprache, in der eine DSL ausgeführt oder verarbeitet wird
Eine DSL, die in einer anderen Sprache geschrieben ist und von einer anderen Host-Sprache verarbeitet wird, nennt man eine externe DSL.
Das ist eine DSL in SQL, die in einer Wirtssprache verarbeitet werden kann:
SELECT account
FROM accounts
WHERE account = '123' AND branch = 'abc' AND amount >= 1000
Dazu könnte eine DSL in Englisch mit einem definierten Vokabular und einer definierten Form geschrieben werden, die in einer anderen Wirtssprache mit Hilfe eines Parsergenerators wie ANTLR verarbeitet werden kann:
if smokes then increase premium by 10%
Wenn die DSL und die Wirtssprache identisch sind, handelt es sich um eine interne DSL, bei der die DSL in der Semantik der Sprache geschrieben und von dieser verarbeitet wird. Diese werden auch als eingebettete DSLs bezeichnet. Hier sind zwei Beispiele.
- Eine Bash-DSL, die in einer Bash-Engine ausgeführt werden kann:
if today_is_christmas; then apply_christmas_discount; fi
Das ist gültige Bash, die wie Englisch geschrieben ist.
- Eine DSL, die in einer GPL wie Java geschrieben ist:
orderValue = orderValue
.applyFestivalDiscount()
.applyCustomerLoyalityDiscount()
.applyCustomerAgeDiscount();Dies verwendet einen flüssigen Stil und ist lesbar wie Englisch.
Ja, die Grenzen zwischen DSL und GPL verschwimmen manchmal.
DSL-Beispiele
Einige Sprachen, die für DSLs verwendet werden, sind:
- Web: HTML
- Shell: sh, Bash, CSH und dergleichen für *nix; MS-DOS, Windows Terminal, PowerShell für Windows
- Markup-Sprachen: XML
- Modellierung: UML
- Datenverwaltung: SQL und seine Varianten
- Geschäftsregeln: Drools
- Hardware: Verilog, VHD
- Build-Tools: Maven, Gradle
- Numerische Berechnungen und Simulationen: MATLAB (kommerziell), GNU Octave, Scilab
- Verschiedene Arten von Parsern und Generatoren: Lex, YACC, GNU Bison, ANTLR
Warum DSL?
Der Zweck einer DSL ist es, die Anforderungen und das Verhalten einer Domäne zu erfassen oder zu dokumentieren. Die Verwendung einer DSL kann sogar noch enger auf bestimmte Aspekte innerhalb der Domäne beschränkt sein (z.B. der Warenhandel im Finanzwesen). DSLs bringen fachliche und technische Teams zusammen. Dies bedeutet nicht, dass eine DSL nur für den geschäftlichen Gebrauch bestimmt ist. Zum Beispiel können Designer und Entwickler eine DSL verwenden, um eine Anwendung darzustellen oder zu entwerfen.
Eine DSL kann auch verwendet werden, um Quellcode für eine adressierte Domäne oder ein Problem zu generieren. Die Codegenerierung aus einer DSL wird jedoch nicht als obligatorisch angesehen, da ihr primärer Zweck das Domänenwissen ist. Wenn sie jedoch verwendet wird, ist die Code-Generierung ein ernsthafter Vorteil beim Domain Engineering.
DSL-Vor- und Nachteile
Auf der Plusseite sind DSLs mächtig, um die Attribute einer Domain zu erfassen. Da DSLs klein sind, sind sie außerdem leicht zu erlernen und zu verwenden. Schließlich bietet eine DSL eine Sprache für Domänenexperten und zwischen Domänenexperten und Entwicklern.
Auf der Nachteilsseite wird eine DSL nur innerhalb der vorgesehenen Domäne und des vorgesehenen Zwecks verwendet. Außerdem hat eine DSL eine Lernkurve, auch wenn diese nicht sehr hoch sein muss. Außerdem kann die Verwendung von Tools für die DSL-Erfassung zwar Vorteile bieten, ist aber nicht zwingend erforderlich, und die Entwicklung oder Konfiguration solcher Tools stellt einen zusätzlichen Aufwand dar. Schließlich brauchen DSL-Ersteller sowohl Domänenwissen als auch Sprachentwicklungswissen, und Einzelpersonen haben selten beides.
DSL-Software-Optionen
Open-Source-DSL-Software-Optionen sind:
- Xtext: Xtext ermöglicht die Entwicklung von DSLs und ist mit Eclipse integriert. Es ermöglicht die Codegenerierung und wurde von mehreren Open-Source- und kommerziellen Produkten verwendet, um bestimmte Funktionen bereitzustellen. MADS (Multipurpose Agricultural Data System) ist eine interessante Idee auf Basis von Xtext zur „Modellierung und Analyse landwirtschaftlicher Aktivitäten“ (das Projekt scheint jedoch nicht mehr aktiv zu sein).
- JetBrains MPS: JetBrains MPS ist eine integrierte Entwicklungsumgebung (IDE) zur Erstellung von DSLs. Sie bezeichnet sich selbst als Projektionseditor, der ein Dokument als zugrunde liegende abstrakte Baumstruktur speichert. (Dieses Konzept wird auch von Programmen wie Microsoft Word verwendet.) JetBrains MPS unterstützt auch die Codegenerierung nach Java, C, JavaScript oder XML.
DSL Best Practices
Wollen Sie eine DSL verwenden? Hier sind ein paar Tipps:
- DSLs sind keine GPLs. Versuchen Sie, begrenzte Bereiche von Problemen in der definitiven Domäne zu adressieren.
- Sie müssen nicht Ihre eigene DSL definieren. Das wäre mühsam. Suchen Sie auf Seiten wie DSLFIN, die DSLs für den Finanzbereich auflistet, nach einer bestehenden DSL, die Ihren Bedarf löst. Wenn Sie keine passende DSL finden, können Sie Ihre eigene definieren.
- Es ist besser, DSLs „wie Englisch“ zu machen, als zu technisch zu sein.
- Die Codegenerierung aus einer DSL ist nicht zwingend erforderlich, aber sie bietet signifikante und produktive Vorteile, wenn sie durchgeführt wird.
- DSLs werden Sprachen genannt, aber im Gegensatz zu GPLs müssen sie nicht ausführbar sein. Ausführbar zu sein ist nicht der Sinn einer DSL.
- DSLs können mit Textverarbeitungsprogrammen geschrieben werden. Die Verwendung eines DSL-Editors erleichtert jedoch die Überprüfung von Syntax und Semantik.