Welche Technologie soll bei der Erstellung von DSL für die Regel-Engine verwendet werden?

StackOverflow https://stackoverflow.com/questions/545937

  •  23-08-2019
  •  | 
  •  

Frage

Welche Technologie würden Sie empfehlen, um ein DSL für einen zu erstellen? Anwendungsblock für Geschäftsregeln und Validierung für .NET?Und warum?

Die Architektur des Frameworks wird von einer Produktion erstellt und geprüft.Ich möchte lediglich einen .NET-Prozessor erstellen, um für Menschen lesbare Regeln in kompilierte Regelimplementierungen umzuwandeln.

Die Optionen, die mir bekannt sind, sind:

  • Verwenden Sie die Compiler-Pipeline von .NET Boo
  • Verwenden Sie die Parser-Builder, die mit F# geliefert werden – FsLex und FsYacc

Leider bietet keiner dieser Ansätze die Möglichkeit, angesichts der DSL-Syntax (die sich weiterentwickeln würde) eine mehr oder weniger benutzerfreundliche IDE für die Bearbeitung von DSL zu erstellen.

Irgendwelche Ideen oder Hinweise?

War es hilfreich?

Lösung

Microsofts Anwendungsentwicklungsplattform der nächsten Generation, Codename Oslo

Erleichtert es den Menschen, Dinge so aufzuschreiben, dass sie für den Problembereich, in dem sie arbeiten, sinnvoll sind

Oslo scheint aus einem visuellen Designtool namens „Quadrant“, einer Modellierungssprache namens „M“ und dem „Oslo“-Repository (einer SQL Server-Datenbank) zu bestehen, in dem die Regeln gespeichert sind.

Wenn ich das richtig verstehe, könnten Sie also eine Modellierungssprache in M ​​definieren, Quadrant verwenden, um Ihre Validierungsregeln mithilfe Ihrer eigenen Modellierungssprache zu definieren und zu bearbeiten, und eine Anwendung schreiben, die das Oslo-Repository nutzt und so Ihre Geschäftsregeln und Validierungsanwendung generiert Block für .NET.

Andere Tipps

Eine grafische Sprache für Geschäftsregeln ist keine gute Idee. Ich würde es Geschäftsregeln vermeiden haben viele, wenn Kontrollen und Schleifen in ihnen, die nicht gut visualisieren.

Sie sind viel besser dran mit einem Textsprache für Geschäftsregeln beschreiben.

Um einen phenomenial User Experience für die Bearbeitung von Code zu erhalten Sie brauchen:

  1. Ein Parser mit guter Fehlerkorrektur
  2. Die Möglichkeit, inkrementelle Wieder Kompilierung zu tun

Gute Fehlerkorrektur ermöglicht es Ihnen, effektiv aus syntaktisch unvollständigen Konstrukten programer Absicht zu bestimmen. Das ist von entscheidender Bedeutung für die Umsetzung Intellisence.

Die Fähigkeit, inkrementelle-Neuübersetzung zu tun gibt Ihnen die Möglichkeit in Reaktion auf Benutzer Änderungen efficent Hintergrund Kompilierung zu tun.

Der einfachste Weg, um gute Fehlerkorrektur zu erhalten, ist Ihre Parser von Hand zu schreiben. Auf diese Weise kann, was Menge des Blickes kann vor oder algrorithmic Regeln, um herauszufinden, was in der Gegenwart von Syntaxfehlern zu tun.

Wenn Sie einen Parser-Generator benutzen, um Ihre Parser zu erstellen, verlieren Sie viel Flexibilität mit Syntaxfehler im Umgang. Diese Flexibilität macht den Unterschied zwischen einem guten Intellisence expereince und crapy ein. Also, ich empfehle Ihnen, schreiben Sie es nur von Hand rekursiven Abstiegs verwendet wird.

Die Implementierung efficent Neukompilierung erfordert, dass Sie in der Lage sein: 1) Richtig brechen semantische Analyse in Phasen (für so etwas wie C # sein würde: erste Namespace und Typ Symbole konstruieren, dann lösen Aussagen verwenden, dann Basisklassen lösen, etc). 2) Die Fähigkeit, ein Phase-aware Abhängigkeitsgraphen zu konstruieren 3) Algorithmen zur Verarbeitung des Abhängigkeitsgraphen, und Teile davon in Reaktion auf eine Benutzer Änderungen ungültig gemacht

Für das Gesamt flegged Programmiersprache kann Neukompilierung Implementierung bekommen wirklich schwierig. In Ihrem Fall, weil Sie Geschäftsregeln beschreiben, könnte es vielen Simpiler für Sie (oder wenn Kompilation schnell genug ist, könnten Sie nicht einmal benötigen).

Also, ich würde mit dem Parser beginnen und dann Intellisence oben drauf bauen.

Wenn Sie VS Integration vermeiden können, würde ich. Die Integration in VS erfordert viel Sanitär-, und die Interop ist wahrscheinlich Kopfschmerzen verursachen. Es gibt ein paar Unternehmen, die Windows Forms-Editor Kontrollen verkaufen, die Sie Ihren Parser Haken bis zu. Das ist viel einfacher zu integrieren als VS.

Eine weitere möglicherweise interessante Alternative ist F # Zitate zu verwenden.

Zitate können Sie Teil des Programms als Daten behandeln, so können Sie die AST erhalten, analysieren und übersetzen sie in andere Sprache oder führen Sie es in einigen Nicht-Standard-Weg. Zusammen mit der Flexibilität von F #, sollten Sie in der Lage sein, viele Dinge zum Ausdruck bringen, so würde man eine interne F # DSL / combinator Bibliothek zur Beschreibung der Regeln und einen Übersetzer / Dolmetscher für F # Zitate entwickeln müssen, um sie auszuführen.

Nicht sicher, wie ein bussines Regel aussehen könnte, aber man kann so etwas schreiben:

let rule = <@
  if (exists customer having validEmail) then success
  else require whatever 
@>

Ich schrieb eine Einführung zu diesem Thema auf meinem Blog. Leider hat es in der F # CTP einige große Veränderungen, und ich habe noch nicht den Quellcode aktualisiert, aber es sollte Ihnen eine gute Vorstellung davon, was die Möglichkeiten und Grenzen dieses Ansatzes.

Ein gutes Beispiel für DSL ist F # Unit-Tests framewrok:

[EDIT] Nur um zu klären, warum ich denke, das ein guter Ansatz sein kann:

  • Wenn Sie editting die DSLs Visual Studio verwenden (und Sie können die Shell-Version mit F # kostenlos installiert verwenden), werden Sie eine sehr gute Bearbeitung Erfahrung kostenlos. Nicht nur Syntax-Hervorhebung, aber Intellisense auch das wird die möglichen Konstrukte vorschlagen und auch eine Hintergrund-Typprüfung, die als ‚Grammatik‘ Prüfer für Ihren DSL dient.
  • Im Vergleich zu anderen Ansätzen dieses ist vielleicht eines der am einfachsten zu implementieren.
  • Die einzige Einschränkung ist, dass Sie durch die F # Syntax begrenzt sind. Allerdings ist Ihre eigene Sprache entwirft wirklich schwierig, so kann dies nicht so schlimm sein, überhaupt. Vor allem die Flexibilität der F # gegeben.

[/ EDIT]

Hope, das hilft!

ich Boo verwenden würde, ich denke, es ist derzeit eines der flexibelsten Werkzeuge für die DSL-Erstellung. Es gibt ein sehr gutes Buch über das Thema. Ayende des und Rodrigos Blogs sind eine gute Inspiration zu.

Über die IDE, könnten Sie erweitern SharpDevelop , werfen Sie einen Blick auf diese .

Das Standardwerkzeug für DSLs Nähte Aufbau sein ANTLR - es ist ein leistungsfähiges Lexer / Parser-Generator mit viele Zielsprachen-Compiler ausgegeben. Es hat Backends für C #, Java, C / C ++, Python etc. (siehe The Defenitive ANTLR Referenz von Terrence Parr, die Autor von ANTLR) Für Verweise auf die anderen Verwendungen, von denen es finden sie in der Testimonlals Seite.

Sie müssen noch die meisten der Sanitär für die IDE selbst tun, aber es sollte der robuste Compiler Rahmen viel einfacher gegeben werden Sie von ANTLR bekommen. Dies sollte der Fall für die meisten Lösungen hier gepostet werden ...

Ich bin derzeit einen Compiler mit ANTLR vorverarbeitet eigenem DSL geschrieben C / C ++ Ausgabe und bin sehr zufrieden damit. Genug der Anzeige, Sie sollten es versuchen, für sich selbst Spaß haben :)!

Meta Programming System

  

Sie können benutzerdefinierte Spracheditoren und andere Einschränkungen für jede neue Sprache, so dass die Arbeit mit dieser DSLs wird wirklich einfach definieren. Domain-Experten, die nicht vertraut ist mit traditioneller Programmierung sind, können in MPS mit ihren domänenspezifischen Sprachen mit domänenspezifischer Terminologie leicht arbeiten.

Ich bin neu, aber OMeta scheint wie ein idealer Werkzeug für DSLs zu entwickeln. Es scheint nicht ein IDE um es zu sein, aber die gute Nachricht ist, dass die „Regeln“ ein in OMeta sind sehr gut lesbar schreiben können. (Und es beschäftigt sich mit der linken Rekursion, was sehr cool ist.)

Es gibt zur Zeit OMeta Implementierungen in mindestens Javascript (sehr aufregend für mich) und Python, vielleicht auch andere. Wie für C #, Jeff Moser ist auf einer Arbeits, die Sie auf sein Blog und sieht über unter CodePlex . Viel Glück.

Boo + OMeta = Boo.OMeta.Parser

Zur Zeit der Parser ist in der Entwicklung, aber es kann bereits für die Erstellung von komplexen externen DSLs verwendet werden. OMeta ist leistungsfähiges Werkzeug, das Programmierern ermöglicht die einfache Verwaltung lexikalischer Analysatoren und Parser zu implementieren. Ausziehbare Compiler-Pipeline-Architektur von Boo erlaubt Standard Boo.Parser mit Boo.OMeta.Parser zu ersetzen. Es kann verwendet werden Boo Syntax mit fast jeder Art von Syntax zu erweitern. Das Beispiel kann finden hier .

Ihr Projekt meta # versucht, dieses Problem zu lösen.

Wenn Sie eine freundliche IDE erstellen, die die DSLs Bearbeitungen, machen die IDE vollgrafische und kompilieren Objekte auf .NET (oder so etwas wie Ironpython als Klebstoff Sprache verwenden).

Wenn die Regeln einfach genug sind, können Sie die gesamte Regelstruktur grafisch umzusetzen. Wenn die Regeln komplex genug sind, „die menschliche Lesbarkeit“ wird ein unerreichbares Ziel.

So oder so, wenn eine Reihe von .NET-Klassen oder Ironpython Objekten, die den Vermittler-Code erstellen, ist nicht „human readable“ genug, dann sind die Chancen, Sie etwas mehr Dummy-Beweis als eine Grammatik wollen.

Das heißt, wenn Sie nur eine einfache Sprache erstellen möchten, dass Programmierer Business Rules erstellen können, können Sie eine der oben genannten verwenden, und stellen Sie die Syntax minimalistisch genug, um nicht Visual Studio IDE benötigen.

Ruby ist eine großartige Sprache DSLs für die Erstellung. Zum Beispiel Rake ist eine Build-Skript DSL Ruby geschrieben.

Mit der bevorstehenden IronRuby es möglich ist, Skripte zu schreiben, die C # -Code direkt aufrufen.

Hier einige Artikel zu schreiben DSLs in Ruby.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top