Ein Interpreter für die funktional

Werbung
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?
Herunterladen