Fachspezifische Dialekte und Sprachen helfen Menschen, präzise und effektiv über ihre jeweiligen Themen zu kommunizieren. MPS bringt die gleiche Flexibilität in die Welt der Programmiersprachen. Anders als traditionelle Programmiersprachen mit strikter Syntax und Semantik erlaubt MPS seinen Benutzer*innen, eine Sprache von Grund auf neu zu erstellen, zu bearbeiten und zu erweitern.
Das Kernproblem der Spracherweiterung liegt in den Parsern, die Zeichenfolgen analysieren, um Datenstrukturen aufzubauen. Parser beschränken die code-persistente Repräsentation auf eine einzige Notation was bedeutet, dass sie nicht einfach mit anderen Parsern kombiniert werden können, was die Modularisierung der Sprache unterbindet.
Die Implementierung der nicht-textuellen Darstellung von Programmcode ist die am häufigsten vorgeschlagene Alternative zur Lösung dieses Problems. Ein großer Vorteil dieses Ansatzes liegt darin, dass er die Notwendigkeit von Parsern eliminiert. In MPS schlagen wir jedoch eine andere Alternative vor. Unsere Lösung besteht darin, dass der Code immer in einem so genannten Abstrakten Syntaxbaum (AST) unterhalten wird, einer Datenstruktur, die aus Knoten mit einer Reihe von Attributen (Eigenschaften, untergeordneten Elementen und Referenzen) besteht, die den Programmcode vollständig beschreiben.
Es ist die Aufgabe des MPS-Editors, den AST auf benutzerfreundliche Weise darzustellen und eine möglichst effektive Bearbeitung zu ermöglichen. Wenn Sie z. B. eine Sprache erstellen, die eine Standardtextsprache simuliert, sollte sich der Editor wie ein gewöhnlicher Texteditor verhalten. Wenn Sie eine Sprache mit grafischen Notationen erstellen, sollte der Editor sich wie ein ordentlicher Editor zur Diagrammerstellung verhalten.
Wenn Sie eine Sprache in MPS erstellen, definieren Sie die Regeln für die Codebearbeitung und legen fest, wie der Code für den Benutzer dargestellt werden soll. Sie können auch das Typsystem und die Einschränkungen der Sprache angeben, die als Regeln auf Ihre Sprache angewendet werden. Zusammengenommen ermöglichen diese Eigenschaften MPS, den Programmcode in Echtzeit zu überprüfen. Sie machen die Programmierung mit der neuen Sprache einfach und weniger fehleranfällig.
MPS verwendet einen generativen Ansatz. Das bedeutet, dass Sie Generatoren für Ihre Sprache definieren können, um die Eingaben des Endbenutzers in eine konventionellere, typischerweise allgemeinere Sprache zu transformieren. Derzeit ist MPS unter anderem gut, um Java-Code zu generieren. Darüber hinaus können Sie auch C, C#, XML, FHTML, PDF, LaTeX, JavaScript und anderen Code generieren.
„Programmiersprachen, die das Abstraktionsniveau über das Programmieren hinaus heben, indem sie eine Lösung spezifizieren, welche direkt Konzepte und Regeln aus einer spezifischen Domäne nutzt.”
Kelly und Tolvanen (2008)
Mit MPS können Sie für jede neue Sprache einen eigenen Editor festlegen, um die Verwendung dieser DSLs zu vereinfachen. Selbst Domänenexperten, die nicht mit dem traditionellen Programmieren vertraut sind, können mühelos mit MPS arbeiten und domänenspezifische Sprachen nutzen, die unter Berücksichtigung ihrer eigenen, domänenspezifischen Terminologie entwickelt wurden.
Ein projizierender Editor ermöglicht es Benutzern, die Darstellung von Code in Form des abstrakten Syntaxbaums (AST) effizient zu bearbeiten. Er kann sich für textbasierte Notationen wie ein Texteditor, für grafische Sprachen wie ein Grafikeditor, für Tabellenbearbeitung wie ein Tabelleneditor verhalten usw. Die Benutzer interagieren mit dem Code über intuitive visuelle Elemente, zwischen denen sie sogar wechseln können, um den gleichen Code auf verschiedene Arten anzuzeigen.
JetBrains ist wohlbekannt für seine leistungsstarken IDEs und Entwicklertools, und MPS ist keine Ausnahme.
MPS ist eine leistungsfähige IDE, die alles bietet, was Sie brauchen, um von allen Vorteilen von DSLs zu profitieren. Einige der Features sind: Codevervollständigung, Navigation, Refaktorierung, Fehlerüberprüfung, Quick-Fixes, Debugging von DSLs, Sprachversionierung mit automatischer Migration und Integration in bekannte Versionsverwaltungssysteme.
Der MPS-Generator überbrückt die semantische Lücke zwischen der Geschäftsdomäne und der Implementierungsdomäne.
In einer Reihe an Schritten transformiert der Generator das ursprüngliche domänenspezifische Modell zu einem Modell, das in Form einer maschinennahen universellen Sprache wie Java, C, JavaScript oder XML repräsentiert wird. Das daraus resultierende Modell kann dann weiter zu textbasierten Quelldateien transformiert werden, die in einen traditionellen Compiler eingespeist werden, um ausführbare Binärdateien zu erzeugen.
Während die domänenspezifische Sprache das Geschäftswissen von Domänenexperten formalisiert, kapselt der Generator die Implementierung dieses Wissens in einer bestimmten Technologie. Der Generator bewahrt das Fachwissen der besten Softwareentwickler in einer wiederverwertbaren Form auf und erlaubt anderen, davon zu profitieren.
Die eindeutige Trennung zwischen dem Geschäftswissen, das in der Sprache enthalten ist, und dem Implementierungswissen, das der Generator umfasst, erlaubt es Benutzern, für mehrere Plattformen gleichzeitig zu entwickeln, indem sie mehrere Generatoren für dieselbe Sprache verwenden. Benutzer sparen sich außerdem zusätzlichen Aufwand, wenn sie zu einer neuen Implementierungstechnologie wechseln, da dabei nur der Generator gewechselt werden muss. Das Geschäftswissen, das in den bestehenden domänenspezifischen Modellen enthalten ist, bleibt unversehrt.
MPS enthielt ursprünglich eine gebrauchsfertige, universelle Sprache mit dem Namen „BaseLanguage“, die eine Kopie von Java war. Im Laufe der Zeit wurden weitere Sprachen hinzugefügt, darunter XML, C und JavaScript. Diese können direkt zur Erstellung von Programmen verwendet werden. Allerdings liegt die wahre Stärke von MPS darin, BaseLanguage oder andere universelle Sprachen zu erweitern und darüber hinaus neue Sprachen zu erstellen. MPS bringt zahlreiche nützliche Erweiterungen für BaseLanguage mit, um die Arbeit mit Strings, Collections, Datumsangaben, regulären Ausdrücken usw. zu erleichtern. Diese können auch als Referenz zur Entwicklung neuer Sprachen verwendet werden. Diese leistungsstarken Tools machen MPS zu einem idealen Werkzeug zur Erstellung von domänenspezifischen Sprachen (DSL).