Befactoring und generisch kontrollierte Änderungen
Zusammenfassung der Projektergebnisse
Programmieren wird heute von zahlreichen, in sog. integrierten Entwicklungsumgebungen angebotenen Assistenzfunktionen unterstützt. Diese Assistenzfunktionen basieren grundsätzlich auf der statischen Semantik einer Programmiersprache, wie sie auch in Compilern für die Sprache spezifiziert und umgesetzt ist. Allerdings werden solche Assistenzfunktionen heute noch individuell entworfen und implementiert. Die unmittelbare Folge ist, dass die Assistenzfunktionen sich häufig inkonsistent zu einander und zum Compiler verhalten. Zugleich bedeuten Entwicklung und Pflege (Nachführung bei Weiterentwicklung einer Programmiersprache) dieser Funktionen einen erheblichen Aufwand, so dass sie vor allem für (wenige) weit verbreitete Sprachen und ihre Entwicklungsumgebungen angeboten werden — für kleine und neue Sprachen hinkt die Unterstützung entsprechend hinterher. Nicht besser sieht es mit Assistenzfunktionen für die Verwendung von Frameworks aus — hier ist häufig nicht einmal eine statische Prüfung der korrekten Verwendung verfügbar. Ziel des Projekts war, aus einer einzigen, bestehenden Spezifikation der statischen Semantik einer Sprache eine Vielzahl möglicher, die Änderung eines Programms betreffende Assistenzfunktionen automatisch abzuleiten. Dabei sollte allen Änderungsfunktionen gemein sein, dass sie stets ein bzgl. der statischen Semantik wohlgeformtes Programm liefern. Zu diesem Zweck müssen von der Programmiererin bei Aufruf der Funktion vorgetragene, beabsichtige Änderungen um berechnete, kompensierende Änderungen ergänzt werden, die nötig sind, um die Wohlgeformtheit herzustellen. Solche aus beabsichtigten und kompensierenden Änderungen bestehenden Änderungen werden im Projekt kontrollierte Änderungen genannt; sie umfassen neben Änderungen zur Reparatur und zur Vervollständigung von Programmen auch ursprünglich sogenannte (und für das Projekt mit namensgebende) Befactorings als Umkehrung von Refactorings, also Änderungen des Verhaltens eines Programms, die andere Eigenschaften erhalten (mittlerweile in „robust edits“ umbenannt). Durch die Arbeiten zum Projekt wurde gezeigt, wie sich aus formalen Spezifikationen der statischen Semantik, wie sie in Form einer Referenzattributgrammatik oder von OCL-Ausdrücken vorliegen, kontrollierte Änderungsfunktionen ableiten lassen. Dazu wird aus der Spezifikation, dem zu ändernden Programm und den beabsichtigten Änderungen eine Menge von Constraints erzeugt, deren Variablen anfangs die Werte zugewiesen sind, die das zu ändernde Programm bzw. die beabsichtigten Änderungen repräsentieren und deren Lösung die kompensierenden Änderungen berechnet. Um die Menge der erzeugten Constraints so klein wie möglich zu halten, wird ein Verfahren der constraint-basierten Reparatur verwendet, das lokale Suchstrategien verwendet und das, durch geschickte Einbeziehung constraint-logischer Programmierung, die Constraint-Erzeugung und -Lösung so ineinander verschränkt, dass der technische Aufwand (Speicher- und Zeitbedarf) auch im praktischen Einsatz realistisch bleibt. Die gewonnenen Erkenntnisse wurden verwendet, um auf Basis eines erweiterbaren, referenzattributgrammatikbasierten Java-Compilers (ExtendJ) ein automatisches Prüf- und Reparatursystem für große Java-Programme, die die Java Persistence API (JPA) verwenden, zu implementieren und umfassend zu evaluieren, um für in der Object Constraint Language (OLC) vorliegende Spezifikationen der statischen Semantik unter Verwendung von partieller Evaluation praktisch die gesamte Palette bekannter Funktionen (von der Wohlgeformtheitsprüfung bis zur automatischen Generation von Programmen bzw. Modellen) abzudecken und um für die Language Workbench MPS ein generisches Änderungswerkzeug zu entwickeln, das auf einer einzigen Spezifikation der statischen Semantik basierend den herkömmlichen Editor von MPS sowie alle seine Hilfen für die Eingabe vollständig ersetzt. Das geplante Arbeitsprogramm wurde umfassend abgearbeitet und alle Ergebnisse mit hoher internationaler Sichtbarkeit publiziert.
Projektbezogene Publikationen (Auswahl)
- „Computing Repair Alternatives for Malformed Programs using Constraint Attribute Grammars” in: Proceedings of the 2016 ACM SIGPLAN International Conference on Object-Oriented Programming, Systems, Languages, and Applications (OOPSLA 2016) 711–730
Friedrich Steimann, Jörg Hagemann, Bastian Ulke
(Siehe online unter https://doi.org/10.1145/3022671.2984007) - „Partial Evaluation of OCL Expressions“ in: Proceedings of the 20th ACM/IEEE International Conference on Model Driven Engineering Languages and Systems (MODELS 2017) 63–73
Bastian Ulke, Friedrich Steimann, Ralf Lämmel
(Siehe online unter https://doi.org/10.1109/MODELS.2017.31) - „Robust Projectional Editing“ in: Proceedings of the 10th ACM SIGPLAN International Conference on Software Language Engineering (SLE 2017) 79–90
Friedrich Steimann, Marcus Frenkel, Markus Völter
(Siehe online unter https://doi.org/10.1145/3136014.3136034) - „Constraint-Based Refactoring“ ACM Transactions on Programming Languages and Systems 40:1 (TOPLAS 2018) 2:1–2:40
Friedrich Steimann
(Siehe online unter https://doi.org/10.1145/3156016)