modularity; abstraction; context-oriented programming; configuration settings; plugin system; type checker; key database; contract; context-aware applications; configuration specification language
en
Abstract:
Software ist mit Hilfe von Konfigurationseinstellungen, welche üblicherweise in Konfigurationsdateien gespeichert werden, hochgradig adaptiv. Moderne Systeme beinhalten bereits detaillierte Informationen, in welchem Kontext sich das System gerade befindet. Wir definieren Kontext als jede Information relevant für Konfigurationseinstellungen, zum Beispiel der aktuelle Ort, vorhandene Hardware, Netzwerkkonfigurationen, Konfigurationen anderer Programme, etc. Heutzutage sind Konfigurationseinstellungen und Kontext nicht verbunden. Adaptionen von Konfigurationseinstellungen, wie besseres Anpassen an den Kontext, werden manuell durchgeführt -- oftmals in komplizierten Schnittstellen und ohne hilfreiche Rückmeldungen bei Fehlern. Mit einer in der Arbeit durchgeführten Umfrage und Quelltextanalyse erkannten wir Ursachen dafür, warum Programme derzeit selten Kontext berücksichtigen: Entwickler haben Informationen über den Kontext nicht bequem verfügbar und vermeiden Abhängigkeiten zu Software, welche die Informationen bereitstellen könnte. Wir zielen darauf ab, diese Probleme durch eine systemnahe Konfigurationsspezifikationssprache, welche die Beziehungen zwischen Konfigurationseinstellungen und Kontext beschreibt, zu lösen. Der Hintergedanke ist, dass die Berücksichtigung von Kontext in den Konfigurationseinstellungen die Benutzerfreundlichkeit erhöht und fehlerhafte Konfigurationseinstellungen reduziert. Unsere Konfigurationsspezifikationssprache orchestriert dabei Frontends und Backends, um den Zugriff auf Konfigurationseinstellungen zu vereinheitlichen. Wir führen ein Frontend (eine Programmierschnittstelle für Entwickler) ein, welches mittels Quelltextgenerierung die Konfigurationsspezifikationssprache in kontextsensitive Variablen abbildet und dabei Kontextsensitivität in dynamischen Sichtbarkeitsbereichen ermöglicht. Die Konfigurationsspezifikationssprache modularisiert Quelltexte in Form von Plugins, mit deren Hilfe die Backends aufgebaut werden. Dadurch werden die zuvor genannten Probleme von fehlenden Kontextinformationen in Applikationen und unerwünschten Abhängigkeiten gemindert. Um unseren Ansatz zu validieren, haben wir mehrere Sprachkonstrukte einer modularen Konfigurationsspezifikationssprache implementiert. Wir haben die Implikationen unserer neuartigen modularen Abstraktionen der Konfigurationsspezifikationssprache ausführlich evaluiert. Dabei diskutieren wir Funktionalität zur Introspektion, neu entwickelte Werkzeuge, Analysen zur Fehlerbehebung und Entwicklungszeit. Ebenfalls messen wir den durch Backends verursachten Mehraufwand und vergleichen Lösungen, implementiert als Frontends und Backends, mit dem Ergebnis, dass Mehraufwände in modularen Backends gering sind. Trotz Kontextsensitivität ermöglicht das Frontend lesende Zugriffe auf Konfigurationseinstellungen mit der Laufzeit-Effizienz von native Variablen. Da es unrealistisch ist alle existierenden Applikationen auf solche typsicheren Frontends umzuschreiben, demonstrieren wir verschiedene Möglichkeiten, wie bestehende Applikationen ebenfalls an unsere Backends angebunden werden können. Mit 16 bekannten Standardapplikationen, wie etwa Firefox, zeigen wir, dass die Kontextsensitivität der Konfigurationseinstellungen auch ohne Quelltextänderungen verbessert werden kann.
de
With the help of configuration Settings --usually stored in configuration files-- applications are highly adaptable. Modern systems give us detailed information about the context the system is situated in. We define context as every information relevant for configuration settings, for example, the location, available hardware, the network settings, settings of other applications, etc. Today, configuration settings and the context are not connected. Adaptations of configuration settings to better fit the context happen manually -- often in complicated interfaces and without proper feedback on errors. Using a questionnaire survey and a source code analysis, we reveal obstacles why applications rarely account for context: Developers do not have context information readily available and dislike dependences to software that would give them the information. We aim to overcome these problems by introducing a novel system-level configuration specification language, which specifies the relation between context and configuration settings. Including more context into configuration settings improves usability and decreases misconfiguration. Our configuration specification language orchestrates frontends and backends for unified, context-aware access to configuration settings. We introduce a frontend (an API) that maps via code generation the configuration specification language to context-aware variables. We use it to enable context adaptations in dynamic scopes as suggested by context-oriented programming. The configuration specification language modularizes the system into plugins that build up backends. The modularization mitigates the previously mentioned applications' problems of missing context information and unwanted dependences. We implemented different language constructs for the modular configuration specification language to validate our approach. We evaluate the implications of the novel modular abstractions in the configuration specification language in-depth. We discuss emerging tools, debugging support, introspection, and development time. Furthermore, we measure the overhead caused by the backends and compare solutions, implemented in the frontend and backend, with the result that the overhead in modular backends is small. Despite the context awareness, the frontend enables read access to configuration settings with the run-time efficiency of native variables. Because it is unrealistic that every application gets rewritten to use such type-safe frontends, we demonstrate different ways to connect legacy applications with our backends. With 16 well-known standard applications, such as Firefox, we show the feasibility and practicality of increasing context awareness of configuration settings without modifying any source code.