Starten Sie Ihre Suche...


Durch die Nutzung unserer Webseite erklären Sie sich damit einverstanden, dass wir Cookies verwenden. Weitere Informationen

FunnyQT

Laufzeit: 01.12.2013 - 30.11.2015

Förderung durch: DFG-gefördertes Projekt (Fördernummer EB119/10-1)

Website

Kurzfassung



Im FunnyQT-Projekt wird ein umfassender Ansatz zum Querying und zur Transformation von Modellen entwickelt.

FunnyQT ist keine eigenständige Querying- bzw. Transformationssprache mit eigener konkreter Syntax sondern eine API für den funktionalen, JVM-basierten Lisp-Dialekt Clojure. Queries und Transformationen sind also Clojure-Programme, welche die Funktionen und Konstrukte der FunnyQT-API benutzen.

Durch den API-basierten Ansatz und die Einbettung in eine funktionale Programmiersprache werden...

Im FunnyQT-Projekt wird ein umfassender Ansatz zum Querying und zur Transformation von Modellen entwickelt.

FunnyQT ist keine eigenständige Querying- bzw. Transformationssprache mit eigener konkreter Syntax sondern eine API für den funktionalen, JVM-basierten Lisp-Dialekt Clojure.  Queries und Transformationen sind also Clojure-Programme, welche die Funktionen und Konstrukte der FunnyQT-API benutzen.

Durch den API-basierten Ansatz und die Einbettung in eine funktionale Programmiersprache werden deren Konzepte wie Funktionen als erstklassige Objekte und Funktionen höherer Ordnung für die Definition von Queries und Transformationen verfügbar.  Zudem können bei der Definition von Queries und Transformationen beliebige Java- und Clojure-Bibliotheken neben FunnyQT verwendet werden.  Somit lassen sich Transformationen erstellen, die neben Modellen beliebige andere programmatisch zugreifbare Artefakte abfragen bzw. modifizieren (z.B. Datenbanken).

Clojure's von Lisp geerbtes Makrosystem ermöglicht Transformationen auf der abstrakten Syntax der Sprache selbst zum Zwecke der Definition von eingebetteten domänenspezifischen Sprachen (DSLs).  Dieses Sprachfeature wird von FunnyQT genutzt, um dem Query- bzw. Transformationsentwickler adäquate und prägnante Konstrukte an die Hand zu geben, die es für den Benutzer aussehen lassen, er spezifiziere seine Queries und Transformationen in einer dafür spezialisierten Sprache.

FunnyQT unterstützt sowohl die Anfrage und Transformation von TGraphen (JGraLab-Modellen) als auch von EMF-Modellen, und weitere (JVM-basierte) Modellierungs-Frameworks können nachträglich angebunden werden.  Herauszuheben ist hierbei, dass FunnyQT nativ mit den Modellen der jeweiligen Frameworks arbeitet, also keine eigene, interne Modellrepräsentation benutzt.

Als umfassender Querying- und Transformationsansatz wird FunnyQT die folgenden (in Sub-APIs/Namespaces organisierten) Features bereitstellen:

  • Den Kern bildet eine API zum allgemeinen Model-Management.  Hierzu zählen Funktionen zum Erstellen, Laden und Speichern von Modellen, Funktionen zur Erzeugung und zum Löschen von Modellelementen und Funktionen zum Attributzugriff.  Diese Kern-API gliedert sich in Framework-spezifische APIs (für TGraphen einerseits und EMF-Modelle andererseits), welche alle Eigenschaften der jeweiligen Modellrepräsentationen abdecken.  Komplementierend dazu existiert eine generische API, welche vom konkret verwendeten Framework abstrahiert und alle gemeinsamen Eigenschaften abdeckt.
  • Aufbauend auf der Kern-API ist eine effiziente und ausdrucksmächtige Querying-API definiert.  Diese bietet unter anderem Konzepte wie Comprehensions, quantifizierte Ausdrücke und eine Variante der aus GReQL bekannten regulären Pfadausdrücke.
  • Weiterhin ist eine Pattern-Matching-API konzipiert.  Hier wird ein Pattern textuell mittels typisierter Knoten- und Kantensymbolen und eventuellen zusätzlichen Constraints beschrieben.  Die Auswertung eines Patterns liefert dann die Sequenz aller Matches dieses Patterns im angefragten Modell.  Ein Match enthält jeweils die Modellelemente, auf die die Symbole im Pattern im Sinne einer homomorphen Abbildung unter Berücksichtigung der Typisierung und weiterer Constraints abgebildet werden können.
  • Eine in-place-Transformations-API baut auf der Pattern-Matching-API auf.  Diese erlaubt die Definition von Transformationsregeln, die jeweils aus einem Pattern und einer Aktion bestehen.  Wird eine Regel aufgerufen, so wird ein Match des Patterns im Modell gesucht und die Aktion darauf aufgeführt.
  • Zwei out-place-Transformations-APIs unterstützen die Generierung von neuen Zielmodellen aus existierenden Quellmodellen.  Hierbei lehnt sich die eine API an die extensionale Herangehensweise von GReTL an, die andere API realisiert eine regelbasierte Herangehensweise an unidirektionale Transformationen.
  • Eine relationale Querying-API unterstützt die Prolog-ähnliche, logikbasierte Anfrage von Modellen.  Es können parametrisierte Relationen auf Modellen definiert werden, die sich dadurch durch Funktionen unterscheiden, dass jeder Parameter sowohl Eingabe als auch Ausgabe sein kann.  Sind alle Parameter belegt, so hat eine Relation die Semantik eines Prädikats.  Existieren unbelegte Parameter, so werden alle möglichen Parameterbelegungen enumeriert, welche die Relation bezüglich des angefragten Modells wahr machen.
  • Auf Basis der relationalen Querying-API wird eine bidirektionale Transformations-API realisiert.  Eine solche Transformation definiert Relationen zwischen den Elementen eines linken und eines rechten Modells.  Für alle Elemente des linken Modells, die der Spezifikation einer Relation genügen, muss es entsprechende Elemente im rechten Modell geben und umgekehrt.  Eine solche Transformation kann sowohl ein neues rechtes/linkes Modell aus einem bestehenden linken/rechten Modell generieren, als auch zwei bestehende Modelle synchronisieren.
  • Zuletzt ermöglicht eine (TGraph-spezifische) Sub-API die parallele Transformation von Metamodell und Modell zur Laufzeit.  Es werden CRUD-Operationen für Metamodellelemente bereitgestellt deren Semantik auf Modellebene durch Funktionen definiert werden kann.  So kann beispielsweise einer existierenden Metamodellklasse ein neues Attribut hinzugefügt werden, wobei die Semantik auf Modellebene durch eine Funktion definiert wird, die Elementen dieses Typs den Wert des neuen Attributs zuweist.
» weiterlesen» einklappen

Projektteam


Beteiligte Einrichtungen