Erstellen eines DSL: Skripted auf einer Allzwecksprache oder eigenständig?

10

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?

Jé Queue
quelle
Wer ist der Verbraucher dieses DSL? und was sind die potenziellen Hosts (Sie haben Java erwähnt, erwägen Sie andere Möglichkeiten)?
Mauricio Scheffer
Ich betrachte jede Möglichkeit für die Gastgeber. Verbraucher sind diejenigen, die asynchrone Programme schreiben (Nachrichten mit Zielen).
Jé Queue

Antworten:

9

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:

  • Niedrigere Baukosten. Sie müssen viel weniger implementieren. Sie können sich auf das jeweilige Problem konzentrieren, anstatt Zeit für die Implementierung eines Parsers / Compilers / Interpreters zu investieren.
  • Zugriff auf die Host-Sprache: Ihre Sprache hat Zugriff auf die volle Leistung der vorhandenen Sprache / Plattform.
Codeape
quelle
Ich bin ziemlich sprachunabhängig, aber warum sind Python-Inkarnationen Ihrer Meinung nach besser geeignet?
Jé Queue
1
Besser geeignet als was? Ich denke, Ruby und Python haben viele der gleichen Vorteile. Ruby ist aufgrund seiner flexibleren Syntax möglicherweise sogar besser für internes DSL geeignet. Was Java und C # betrifft, habe ich in diesen Sprachen viele gute fließende Schnittstellen gesehen (und es gibt Konstrukte in neueren Versionen, die die interne Erstellung / Verwendung von DSL vereinfachen, wie die Syntax des Objektinitialisierers) - aber IMO sind die "Low Ceremony" -Sprachen etwas besser geeignet als "High Ceremony" -Sprachen.
Codeape
1
Ich habe C # gewählt, um ein internes DSL genau zu implementieren, um die "freie" statische Typprüfung zur Kompilierungszeit zu nutzen. Dynamische Sprach-DSLs bieten gegenüber externen DSLs nicht allzu viele Vorteile.
Den
@Den genau das hat mich enttäuscht, als ich versucht habe, iDSLs in Python zu machen. In Java scheint Ihre iDSL sofort von der IDE unterstützt zu werden. Ich habe keine IDE gefunden, die dies für Python erledigt.
candied_orange
2

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.

Henrik
quelle
2

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.

Eiersteuer
quelle
1

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.

SK-Logik
quelle
1

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.

Olha Pavliuk
quelle