Ich diskutiere über das Entwerfen einer domänenspezifischen Sprache, um ein bestimmtes, undurchsichtiges Programmiermodell zu vereinfachen. Ein Teil der Debatte ist, ob es (als Skript) auf einer vorhandenen Sprache / Laufzeit (z. B. Java) erstellt oder eigenständig (eigener Compiler usw.) erstellt werden soll.
Haben Sie Vor- / Nachteile und / oder eine sichere Antwort auf den entsprechenden Ansatz?
language-design
scripting
dsl
runtime
Jé Queue
quelle
quelle
Antworten:
Ich würde empfehlen, Ihr DSL auf einer vorhandenen Sprache (internes DSL) zu erstellen. Ich habe dies einige Male mit Python gemacht und Systeme erstellt, in denen der Verbraucher von DSL eine Python-Datei schreibt, die als Konfigurationsdatei für das System verwendet wird. Die Konfigurationsdatei verwendet Konstrukte (Klassen, Funktionen), die ich definiert habe. Diese Konstrukte bilden das DSL.
IMO, eine Sprache wie Python (IronPython oder Jython, wenn das Hostsystem .NET oder Java ist) oder Ruby (IronRuby, JRuby) ist besser für die Basis Ihres DSL als Java oder C #.
In meinem Fall war das Hostsystem auch (C) Python, daher war es selbstverständlich, Python für DSL zu wählen.
Einige Profis:
quelle
Schauen Sie sich Xtext (http://www.eclipse.org/Xtext/) und Xbase (http://blog.efftinge.de/2010/09/xbase-new-programming-language.html) an. Wenn die Benutzer keine Programmierer sind, sollten Sie Ihr DSL nicht auf einer vorhandenen Programmiersprache basieren. Es wird ihnen zu kompliziert sein. Ein "sauberes" DSL kann bei korrekter Erstellung sehr effizient sein.
quelle
Erlauben Sie mir, anstatt einen bestimmten Ansatz zu empfehlen, die domänenspezifischen Sprachen von Martin Fowler als hervorragende Quelle für die Entscheidung zu empfehlen . Es hat eine umfassende, zum Nachdenken anregende Untersuchung der relativen Vorzüge interner und externer DSLs.
quelle
Es gibt eine dritte Option: Erstellen Sie ein DSL als Compiler auf einer Allzwecksprache. Jede Sprache mit einem angemessenen Grad an Metaprogrammierfähigkeiten erledigt den Job, einschließlich einer so einfachen Sache wie C ++. Ich bevorzuge Lisp und ähnliche Sprachen für diese Art von Dingen, aber Template Haskell oder Nemerle könnten auch das gleiche Maß an Flexibilität bieten.
quelle
Martin Folwer beschreibt in seinem Buch "Domain-Specific Languages" interne und externe DSLs.
Internal DSL
= ist eine Teilmenge der vorhandenen Programmiersprache, z. B. Ruby / Java usw.External DSL
= Sie definieren eine Syntax und ein Vokabular.Ein externes DSL kann viel aussagekräftiger sein, erfordert jedoch eine externe Analyse und Codegenerierung.
Ein internes DSL erfordert zwar keine zusätzliche Verarbeitung, ist jedoch für nicht programmierende Domain-Experten (z. B. Geschäftsanalysten, Tester) manchmal schwer zu verstehen.
Bei der Auswahl Ihres DSL-Typs ist es wichtig zu analysieren, wer seine Benutzer sind. Wenn es sich hauptsächlich um nicht technische Personen handelt, kann ein externes DSL die bessere Wahl sein. Für ein kleines Team erfahrener Programmierer kann ein internes DSL ausgewählt werden, wenn die von ihnen verwendete Programmiersprache ausdrucksstark genug ist.
quelle