Typed open programming : a higher-order, typed approach to dynamic modularity and distribution [article]

Andreas Rossberg, Universität Des Saarlandes, Universität Des Saarlandes
2007
In this dissertation we develop an approach for reconciling open programming -the development of programs that support dynamic exchange of higher-order values with other processes -with strong static typing in programming languages. We present the design of a concrete programming language, Alice ML, that consists of a conventional functional language extended with a set of orthogonal features like higher-order modules, dynamic type checking, higher-order serialisation, and concurrency. On top
more » ... these a flexible system of dynamic components and a simple but expressive notion of distribution is realised. The central concept in this design is the package, a first-class value embedding a module along with its interface type, which is dynamically checked whenever the module is extracted. Furthermore, we develop a formal model for abstract types that is not invalidated by the presence of primitives for dynamic type inspection, as is the case for the standard model based on existential quantification. For that purpose, we present an idealised language in form of an extended λ-calculus, which can express dynamic generation of types. This calculus is the first to combine and explore the interference of sealing and type inspection with higher-order singleton kinds, a feature for expressing sharing constraints on abstract types. A novel notion of abstracton kinds classifies abstract types. Higher-order type and kind coercions allow for modular translucent encapsulation of values at arbitrary type. Kurzdarstellung In dieser Dissertation entwickeln wir einen programmiersprachlichen Ansatz zur Verbindung offener Programmierung -der Entwicklung von Programmen, die das dynamische Laden und Austauschen höherstufiger Werte mit anderen Prozessen erlauben -mit starker statischer Typisierung. Wir stellen das Design einer konkreten Programmiersprache namens Alice ML vor. Sie besteht aus einer konventionellen funktionalen Sprache, die um einen Satz orthogonaler Konzepte wie höherstufige Modularisierung, dynamische Typüberprüfung, höherstufige Serialisierung und Nebenläufigkeit erweitert wurde. Darauf aufbauend ist ein flexibles System dynamischer Komponenten sowie ein einfacher aber expressiver Ansatz für Verteilung verwirklicht. Zentral ist dabei das Konzept eines Pakets (package), welches ein Modul in Kombination mit seinem Schnittstellentyp in einen Wert einbettet, und bei der Extraktion des Moduls eine dynamische Typüberprüfung vornimmt. Weiterhin entwickeln wir einen theoretischen Ansatz zur Modellierung von abstrakten Typen, welcher im Gegensatz zum herkömmlichen formalen Modell existentieller Quantifizierung auch in Gegenwart dynamischer Typinspektion gültig ist. Zu diesem Zweck definieren wir eine idealisierte Sprache in Form eines erweiterten λ-Kalküls, der dynamische Typgenerierung ausdrücken kann. Der Kalkül kombiniert diese erstmals mit höherstufigen "Singleton Kinds, einem Sprachkonstrukt, welches Gleichheit von Typen ausdrücken kann. Zur Klassifizierung abstrakter Typen werden Abstraktions-Kinds als verwandtes Konzept entwickelt. Höherstufige Konversionen auf Term-und Typebene erlauben zudem die nachträgliche modulare Enkapsulierung von Werten beliebigen Typs. iii Zusammenfassung Die zunehmende Verbreitung des Internets hat begonnen, die Struktur von Software nachhaltig zu verändern. An die Stelle von in sich geschlossenen Programmen, die nur lokal operieren, treten mehr und mehr offene Applikationen, die dynamisch Daten mit anderen Prozessen im Netzwerk austauschen, oder von dort sogar neue Funktionalität beziehen. Das offensichtlichste Beispiel für ein Programm dieser Kategorie ist ein Web-Browser. Auf programmiersprachlicher Ebene erfordert dieser Paradigmenwechsel eine verbesserte Unterstützung offener Programmierung, zu der wir Konzepte wie Modularität, Dynamik, Portabilität, Sicherheit, Verteilung und Nebenläufigkeit zählen. Nur wenige existierende Sprachen sind bisher darauf ausgelegt. Zu ihnen gehören vor allem die zu diesem Zweck entwickelte objektorientierte Sprache Java, die mittlerweile weite industrielle Verbreitung gefunden hat, und die im akademischen Umfeld entwickelte nebenläufige Constraint-Sprache Oz. Diese setzt entsprechende Konzepte noch weitaus konsequenter um, insbesondere durch die einheitliche Repräsentation von Programmkomponenten und externen Daten, so dass beide beliebig gemischt werden können. Diese Dissertation widmet sich einem spezifischen Aspekt offener Programmierung, der bislang von keinem der Vertreter auf befriedigende Weise gelöst wurde: der Kombination offener Programmierung mit einem expressiven, starken Typsystem. Ein Typsystem ist ein in die Programmiersprache integriertes formales Werkzeug zur automatischen Verifikation bestimmter Programmeigenschaften. Es weist jedem Programmkonstrukt einen Typ zu, eine logische Formel, die das bei Ausführung des Konstrukts zu erwartende Resultat klassifiziert. Die damit möglichen Konsistenzprüfungen können die Zuverlässigkeit von Software verbessern. Moderne Programmiersprachen bieten zudem die Möglichkeit, die Typstruktur um benutzerdefinierte, sogenannte abstrakte Typen zu erweitern, welche die Festlegung gewisser Zugriffsbeschränkungen erlauben. Wenn die Semantik der Programmiersprache verhindert, dass diese Zugriffsbeschränkungen umgangen werden können, so spricht man von Abstraktionssicherheit. Diese garantiert Modularitätseigenschaften und steigert damit vor allem die Wartbarkeit von Programmen. Typüberprüfungen erfolgen naturgemäss vor der Ausführung eines Programmes,üblicherweise durch denÜbersetzer der verwendeten Programmiersprache. Dadurch entsteht ein inhärenter Konflikt mit offener Programmierung, da in einem offenen Ansatz im Allgemeinen nicht alle Programmteile vorweg bekannt sind und analysiert werden können. Es ist deshalb unausweichlich, bestimmte Typüberprüfungen in die Laufzeit des Programms zu verlagern. Ein seit langem bekannter Ansatz dafür ist die Einbringung eines speziellen universellen Typs Dynamic, der Werte der Sprache gepaart mit ihrem jeweiligen Typ beinhaltet. Die Extraktion eines Wertes erfolgt explizit und erfordert die Angabe eines oder mehrerer erwarteter Zieltypen, die dynamisch abgeglichen werden. Leider haben sich Dynamics jedoch in der Praxis als zu unhandlich erwiesen. Zudem ergeben sich durch die Möglichkeit des dynamischen Typabgleichs semantische Implikationen, die unter anderem die Abstraktionssicherheit abstrakter Typen beeinträchtigen. Wir nähern uns diesen Problemen von zwei Seiten an. Zum einen beschreiben wir das Design einer konkreten Sprache names Alice ML, welche typisierte offene Programmierung ermöglicht. Dabei handelt es sich um einen Dialekt der funktionalen Sprache Standard ML, die durch einen relativ kleinen Satz orthogonaler und hinreichen einfacher Sprachkonstrukte erweitert wurde. Dabei handelt es sich zunächst um Pickling zum serialisierten Import und Export höherstufiger iv Werte, verschiedene Formen von Futures für die Synchronisation nebenläufiger Berechnungen, sowie Module höherer Ordnung, welche die Sprache um wichtige Abstraktionsmöglichkeiten ergänzen. Die meisten dieser Konstrukte sind bekannt und für sich gut verstanden, aber bisher nicht in dieser Form und zu diesem Zweck in einem kohärenten Design integriert worden. Neu ist ausserdem das zentrale Konzept von Paketen (packages), welches das Kernproblem der dynamischen Typisierung löst. Esähnelt der Idee von Dynamics, jedoch werden nicht einzelne Werte, sondern komplette Module eingebettet. Die feinkörnige Typunterscheidung weicht so einem strukturellen Inklusionstest auf Modulschnittstellen, der robust gegenüber Erweiterungen ist und eine Handhabung auf hohem Abstraktionsgrad erlaubt. Auf Grundlage dieser Basiskonzepte definiert die Sprache einen flexiblen, typsicheren Begriff von Komponenten, der nicht nur bedarfsgetriebenes dynamisches Laden ermöglicht, sondern Komponenten als Werte erster Klasse verfügbar macht, die dynamisch berechnet und aus einem Prozess exportiert werden können. Mit Hilfe dieser Idee wiederum ist ein vergleichsweise einfacher aber expressiver Ansatz für verteilte Programmierung möglich, bei dem Verbindungen zwischen Prozessen durch den initialen Austausch einer dynamisch berechneten Komponente aufgebaut werden. Das Konzept von programmierbaren Komponentenmanagern erlaubt es dem Empfängerprozess dabei, gezielte Sicherheitsstrategien durch Einschränkung der Importrechte für die empfangene Komponente zu realisieren. Eine nahezu vollständige Implementation von Alice ML wurde realisiert und steht als offene Software zur Verfügung. Zum anderen entwickeln wir einen theoretischen Ansatz zur Modellierung von Typabstraktion, der Abstraktionssicherheit auch in Gegenwart dynamischer Typinspektion sicherstellt. Zu diesem Zweck führen wir eine idealisierte Formalisierung der Sprache Alice ML ein, die auf dem polymorphen λ-Kalkül basiert. Sie modelliert zentrale Konzepte des Typ-und Modulsystems: höherstufige Typen spiegeln Polymorphismus und parametrisierte Module wider, Singleton Kinds können Gleichheit von abstrakten Typen ausdrücken (type sharing), ein Konditionalüber Typen erlaubt Typinspektion und das Kodieren von Paketen, Subtyping und Subkinding erfassen Schnittstelleninklusion. Zudem wird Pickling als spezielles Konstrukt eingeführt, welches das Hantieren mit potentiell nicht-wohlgeformten Werten ermöglicht. Das wichtigste Merkmal ist jedoch dynamische Typgenerierung, welche abstrakte Typen realisiert. Der Kalkül modelliert damit erstmals die Interaktion von höherstufiger dynamischer Typabstraktion mit dynamischem Typ-Sharing, welche zentral ist für die Typisierung von Alice ML. Typgenerierung geht einher mit der neu entwickelten Idee von Abstraktions-Kinds, welche zur feinkörnigen Klassifikation abstrakter Typen höherer Ordnung benutzt werden. Auf Termebene erlauben explizite, höherstufige Konversionen (coercions) die nachträgliche Enkapsulation beliebig komplexer Objekte in punktuell abstrahierte Typen. Wir beweisen die Entscheidbarkeit des Typsystems, seine Korrektheit in Bezug auf die operationale Semantik des Kalküls, sowie eine einfache Eigenschaft von Abstraktionssicherheit. 13.1.
doi:10.22028/d291-25878 fatcat:tadaeu7yyvgdrlnvr73pm6246q