Felgentreff, The Design and Implementation of Object-Constraint Programming The Design and Implementation of Object-Constraint Programming von Tim Felgentreff Dissertation zur Erlangung des akademischen Grades des Doktor der Naturwissenschaften (Doctor rerum naturalium) vorgelegt der Mathematisch-Naturwissenschaftlichen Fakultät der Universität Potsdam. Betreuer Prof. Dr. Robert Hirschfeld Fachgebiet Software-Architekturen Hasso-Plattner-Institut Universität Potsdam 21. April 2017 Erklärung Hiermit erkläre ich an Eides statt, dass ich die vorliegende Dissertation selbst angefertigt und nur die im Literaturverzeichnis aufgeführten Quellen und Hilfsmittel verwendet habe. Diese Dissertation oder Teile davon wurden nicht als Prüfungsarbeit für eine staatliche oder andere wissenschaftliche Prüfung eingereicht. Ich versichere weiterhin, dass ich diese Arbeit oder eine andere Abhandlung nicht bei einer anderen Fakultät oder einer anderen Universität eingereicht habe. Potsdam, den 21. April 2017 Tim Felgentreff v Abstract Constraints allow developers to specify properties of systems and have those properties be main- tained automatically. This results in compact declarations to describe interactive applications avoid- ing scattered code to check and imperatively re-satisfy invariants in response to user input that perturbs the system. Constraints thus provide flexibility and expressiveness for solving complex problems and maintaining a desired system state. Despite these advantages, constraint program- ming is not yet widespread, with imperative programming still being the norm. There is a long history of research on constraint programming as well as its integration with general purpose programming languages, especially from the imperative paradigm. However, this integration typically does not unify the constructs for encapsulation and abstraction from both paradigms and often leads to a parallel world of constraint code fragments and abstractions inter- mingled with the general purpose code. This impedes re-use of modules, as client code written in one paradigm can only use modules written to support that paradigm — thus, modules require redundant definitions if they are to be used in both paradigms. Furthermore, clear distinction between the paradigms requires developers to learn about and fully understand both paradigms to make use of them. In our work, we have developed a design for a family of object-constraint languages called Ba- belsberg. Our design unifies the constructs for encapsulation and abstraction by using only object- oriented method definitions for both declarative and imperative code. Just like assertions, our constraints are expressed using ordinary imperative expressions, including full objects and message sends. Unlike assertions, however, the system attempts to satisfy them if they are not currently true, and keeps them satisfied throughout the remaining execution. We provide a semantics that guides implementers of our design to combine Babelsberg with existing object-oriented host languages both semantically and syntactically and to demonstrate its feasibility with an executable seman- tics and three concrete implementations of Babelsberg. To allow developers to use the power of constraints without having to understand the specifics of different constraint solving strategies, we integrate an architecture for using multiple cooperating solvers. Finally, based on our experi- ence with the concrete implementations, we propose performant implementation strategies of key features for object-constraint programming. Weargue that our approach provides a useful step toward making constraint solving a useful tool for object-oriented programmers. We also provide example code, written in our implementations, which uses constraints in a variety of application domains, including interactive graphics, physical simulations, data streaming with both hard and soft constraints on performance, and interactive puzzles. vii Zusammenfassung Die Constraint-basierte Programmierung erlaubt es Entwicklern, erwünschte Eigenschaften ei- nes Systems zu spezifizieren, und es dem System selbst zu überlassen, diese aufrechtzuerhalten. Dies resultiert in kompaktem, deklarativem Quelltext. Dies steht im Gegensatz zu verstreutem Quelltext, welcher bei imperativer Programmierung oft nötig ist, um Invarianten zu überprüfen und wiederherzustellen. Constraints bieten in diesem Sinne Flexibilität und Ausdruckskraft um komplexe Probleme zu lösen und erwünschte Systemzustände zu erhalten. Trotz seiner Vortei- le ist die Constraint-basierte Programmierung jedoch nicht weit verbreitet, und die imperative Programmierung ist heute die Norm. Constraint-basierte Programmiersprachen sowie deren Integration mit Allzweckprogrammier- sprachen, insbesondere aus dem imperativen Paradigma, haben eine lange Forschungsgeschichte. Allerdings beschränkt sich die Integration bisheriger Arbeiten zumeist auf reine Interoperabilität der Paradigmen, statt deren Abstraktionsmechanismen zu vereinheitlichen. Das führt dazu, das Constraint-Quelltext und imperativer Quelltext vermischt werden, aber nicht einheitlich benutzt und entwickelt werden können. Das schränkt die Wiederverwendbarkeit von Modulen ein, da diese explizit für das eine oder andere Paradigma optimiert werden müssen, oder redundante Defi- nitionen erfordern, um in beiden Paradigmen einsetzbar zu sein. Desweiteren zwingt der scharfe Bruch beim Paradigmenwechsel die Programmierer dazu, beide Paradigmen voll zu verstehen, bevor sie sinnvoll eingesetzt werden können. In unserer Arbeit haben wir ein Design für eine Sprachfamilie von Objekt-Constraint-basierten Sprachen entworfen, welches wir Babelsberg nennen. In unserem Design sind die Konstrukte zur Abstraktion vereinheitlicht, indem nur objektorientierte Abstraktionen und Methodendefinitio- nen für sowohl imperativen als auch deklarativen Quelltext verwendet werden. Genau wie impe- rativer Fehlerprüfcode können Constraints nun objektorientierte Sprachkonstrukte verwenden, und das System kann diese in eine deklarative Form übersetzen und für den Rest der Laufzeit kon- tinuierlich prüfen und sicherstellen. Zu diesem Design präsentieren wir außerdem eine Semantik, welche Sprachentwicklern als detaillierte Grundlage zur Integration unseres Designs mit existie- renden, objektorientierten Sprachen dienen kann. Die Korrektheit dieser Semantik haben wir für Schlüsseltheoreme theoretisch bewiesen, sowie praktisch mithilfe einer ausführbaren Semantik gezeigt. Mithilfe dreier konkreter Implementierungen unseres Designs zeigen wir weiterhin dessen Praktikabilität. Um Entwicklern aus dem imperativen Paradigma den Einsatz von Constraints zu ermöglichen, ohne dass diese die spezifischen Limitierungen der verschiedenen automatischen Constraint-Lösungsstrategien verstehen müssen, präsentieren wir außerdem eine Architektur die es ermöglicht, automatisch verschiedene Lösungsstrategien zu kombinieren, um auch komplexe Probleme zu lösen. Schlussendlich diskutieren wir anhand der konkreten Implementierungen deren Ausführungsgeschwindigkeit unter verschiedenen Bedingungen, sowie Erfahrungen in der Entwicklung und Benutzung von Objekt-Constraint-basierten Sprachen. Wir glauben, dass unser Ansatz einen nützlichen Schritt darstellt, um das automatische Lösen von Constraints zu einem nützlichen Werkzeug für imperativen Programmierer zu machen. Das zeigen wir auch anhand von Beispielanwendungen, in denen wir unsere Implementierungen des Babelsberg Designs in einer Reihe von Anwendungsdomänen wie interaktive Grafiken, physika- ix lische Simulationen, Datenübertragung mit Constraints über die Performance, sowie interaktive Puzzlespiele. x Acknowledgements I want to thank Robert Hirschfeld and Michael Perscheid for convincing me to pursue a PhD. I would never have considered it before, but their support during my Master’s studies made it an easy decision. I also want to thank Alan Borning who happened to visit at the right time for me to latch on to a topic that would have been much harder for me to get into without his help. I want to thank my friends and current and former colleagues during my studies at HPI, in the Software Architecture Group, and the HPI Research School: Marcel Taeumel, Jens Lincke, Tobias Pape, Philipp Tessenow, Stephanie Platz, Konstantin Haase, Maria Kaline, Frank and Lysann Schlegel, Lars Wassermann, Anton Gulenko, Lauritz Thamsen, Bastian Steinert, Carl Friedrich Bolz-Tereick, Stefan Lehmann, Marco Roeder, Lena Feinbube: You all listened to my ideas and helped me put them into perspective at the right times, you pushed back when I went overboard and cheered me up when I was glum, you made my travels immensely enjoyable and memorable, you helped me without asking questions when I obviously procrastinated on random side projects, you introduced me to more board games than I can remember, and you tolerated me when I went ran into your offices singing at the top of my lungs. You shaped me as a person, and a part of each of you is forever a part of me. The financial support, the freedom to explore, and the superb work environment that the HPI has afforded me through the HPI research school was fundamental to my work. I want to express my gratitude to Andreas Polze and Sabine Wagner for running the research school as you did while I was there. I also want to thank my foreign friends who afforded me a wider perspective on the world during my PhD studies, who read and discussed my work with me, and who called ambulances for me and came with me to hospitals in the middle
Details
-
File Typepdf
-
Upload Time-
-
Content LanguagesEnglish
-
Upload UserAnonymous/Not logged-in
-
File Pages203 Page
-
File Size-