Motivation Die Sprache Tempus Semantische Analyse Ein Interpreter für die funktional-reaktive Sprache Tempus Diplomarbeit Matthias Reisner Brandenburgische Technische Universität Cottbus 23.09.2011 Implementierung Motivation Die Sprache Tempus 1 Motivation 2 Die Sprache Tempus 3 Semantische Analyse 4 Implementierung Semantische Analyse Implementierung Motivation Die Sprache Tempus 1 Motivation 2 Die Sprache Tempus 3 Semantische Analyse 4 Implementierung Semantische Analyse Implementierung Motivation Die Sprache Tempus Semantische Analyse Funktionale reaktive Programmierung FRP = deklarative Beschreibung von zeitveränderlichen, reaktiven Systemen funktional: Kombination von reaktiven Systemen reaktiv: zeitabhängiges Systemverhalten zeitveränderliche Typen: Verhalten und Ereignisse behavior τ = ˆ Time → τ event τ = ˆ Time × τ Implementierung Motivation Die Sprache Tempus Semantische Analyse Implementierung Lineare Temporallogik Temporallogik: Aussagen unter Berücksichtigung der Zeit zusätzliche temporalogische Operatoren: Notwendigkeit 2A : A wird immer gelten Möglichkeit 3A : A wird irgendwann gelten linear: totale Ordnung aller Zeitpunkte Motivation Die Sprache Tempus Semantische Analyse Curry-Howard-Isomorphismus Beziehung zwischen Logik und Programmiersprachen: Aussagen = ˆ Typen ↑ ↑ Beweise = ˆ Ausdrücke klassische Logikoperatoren: Konjunktion A ∧ B Disjunktion A ∨ B Implikation A → B Feststellung: Temporallogik = ˆ Produkttyp τ1 × τ2 = ˆ Summentyp τ1 + τ2 = ˆ Funktionstyp τ1 → τ2 entspricht FRP temporallogische Operatoren: Notwendigkeit 2A = ˆ Verhalten behavior τ Möglichkeit 3A = ˆ Ereignis event τ Implementierung Motivation Die Sprache Tempus 1 Motivation 2 Die Sprache Tempus 3 Semantische Analyse 4 Implementierung Semantische Analyse Implementierung Motivation Die Sprache Tempus Semantische Analyse Implementierung Einführendes Beispiel type List α = µ%.1 + α × % – – product : List N+ → N+ value product = fold [List N+ ] (case (λ . 1) (uncurry mult)) type Stream α = ν % . event (α × %) – – innerFun : Stream N+ → event (Bool × Stream N+ ) value innerFun = λ s . const (onFirst even) unpack [Stream N+ ] s – – mapEven : Stream N+ → Stream Bool value mapEven = unfold [Stream Bool] innerFun Motivation Die Sprache Tempus Semantische Analyse Implementierung Startzeiten Startzeiten für Verhalten/Ereignisse Typ liefert nur Werte nach Startzeit ⇒ keine Werte zum Startzeitpunkt selbst außerdem: Wertemenge abhängig von Zeit spielt keine Rolle für einfache/rekursive Datentypen behavior τ /event τ : Wert von τ zum Zeitpunkt t muss in Wertemenge von τ bei t enthalten sein Beispiele: behavior (1 + 1) event (behavior N+ ) Motivation Die Sprache Tempus Semantische Analyse Startzeitkonsistenz Startzeit statisch in der Sprache verankern Feststellung: inkonsistente Startzeiten nur durch lokale Variablen möglich spezielle Operatoren zur Absicherung, bspw. const: e :τ zeitunabhängig ⇒ const e : behavior τ Beispiel: λ f . const f beh ⇒ λ behf . behf beh Implementierung Motivation Die Sprache Tempus Semantische Analyse Implementierung Terminationssicherung Problem: nicht-terminierende Berechnungen durch Rekursion möglich value val = add 1 val Lösung: implizite Rekursion verbieten µ-Typen mit fold-Operator: Abbau einer endlichen Datenstruktur ⇒ Auswertung immer terminierend ν-Typen mit unfold-Operator: Aufbau einer potentiell unendlichen Datenstruktur ⇒ partielle Auswertung durch Nutzen der pack-Operatoren Motivation Die Sprache Tempus 1 Motivation 2 Die Sprache Tempus 3 Semantische Analyse 4 Implementierung Semantische Analyse Implementierung Motivation Die Sprache Tempus Semantische Analyse Implementierung Allgemeiner Algorithmus Syntaktische Analyse ; Liste von Werte- und Typdefinitionen Typdefinitionen type t x 1 . . . x n = τ : Varianzprüfung für τ nur bereits definierte Variablen in τ verwendet? Anzahl der Typparameter bei Verwendung Wertedefinitionen value v = e: nicht oder doppelt definierte Variablen? Typinferenz für e ; τ Varianzprüfung für τ Motivation Die Sprache Tempus Semantische Analyse Typinferenz Algorithmus W(Γ, Λ, e) rekursiv über Struktur von e definiert für Primitiven kann Typ direkt angegeben werden W(Γ, Λ, left) ; τ1 → τ1 + τ2 Operatoren wie () können auf Funktionsanwendung zurückgeführt werden Nutzen der Typannotationen von pack/unpack bei const lokale Variablen verbieten: ⇒ W(Γ, ∅, e) ; τ W(Γ, Λ, const e) ; behavior τ Implementierung Motivation Die Sprache Tempus Semantische Analyse Implementierung Varianzprüfung für fold [%]/unfold [%] Funktor-Instanz mit map-Funktion notwendig rekursive Analyse des Typs % Beispiele für τ in µ α . τ : 1+β N+ → event α α → N+ ⇒ okay ⇒ falsch Varianzprüfung erfolgreich ⇒ Funktor-Instanz existiert Herleitung der map-Funktion rekursiv über der Typstruktur Motivation Die Sprache Tempus 1 Motivation 2 Die Sprache Tempus 3 Semantische Analyse 4 Implementierung Semantische Analyse Implementierung Motivation Die Sprache Tempus Semantische Analyse Implementierung Implementierung Implementierung in Haskell als interaktive Konsolenanwendung diskretes Zeitmodell mit relativen Zeitangaben neue Operatoren zu Simulationszwecken: behavior : (N+ → τ ) → behavior τ event : N+ → τ → event τ syntaktische Analyse Lexer: handgeschrieben Parser: Verwendung des Parsergenerators Happy semantische Analyse größtenteils direkte Umsetzung der Algortihmen Motivation Die Sprache Tempus Semantische Analyse Implementierung Auswertung Typ Value für Darstellung ausgewerteter Ausdrücke data Value = Natural Integer | Pair Value Value | Function (Value → Value) ... Beispiel: (left hi, 17) ; Pair (ChoiceLeft Unit) (Natural 17) Auswertung rekursiv über Ausdruck Typ für Zeitdarstellung induktiv definiert ⇒ behebt Probleme im Zusammenhang mit nie eintretenden Ereignissen Motivation Die Sprache Tempus Semantische Analyse Implementierung Zusammenfassung Motivation der FRP-Sprache Tempus durch LTL Startzeitkonsistenz statisch gesichert ⇒ Anpassung der Typinferenz-Algorithmen an neue Operatoren Termination von Berechnungen durch Verbot von impliziter Rekursion ⇒ Varianzprüfung notwendig Umsetzung in Haskell ⇒ interaktive Konsolenanwendung Motivation Die Sprache Tempus Semantische Analyse Implementierung Erweiterungsmöglichkeiten Einführung eines Modulsystems diverse Erweiterungen an der Sprache, bspw. explizite Typsignaturen Anbindung an I/O Untersuchung der Einschränkungen durch Startzeitkonsistenz Erlauben von freien Typvariablen in Typannotationen syntaktische Unterscheidung von Typvariablen und Typsynonymen notwendig Beispiel: pack [List element] kann auf Typannotationen vollständig verzichtet werden?