Einleitung

Beispiel: C-Compiler

Inhalt der Vorlesung

Konzepte von Programmiersprachen

realisieren durch

Hilfsmittel:

Einleitung: Sprachverarbeitung

Literatur

Anwendungen von Techniken des Compilerbaus

Organisation der Vorlesung

Beispiel: Interpreter f. arith. Ausdrücke

data Exp = Const Integer 
         | Plus Exp Exp | Times Exp Exp
    deriving ( Show )

ex1 :: Exp
ex1 = 
  Times ( Plus ( Const 1 ) ( Const 2 ) ) ( Const 3 )

value :: Exp -> Integer
value x = case x of
    Const i -> i
    Plus x y -> value x + value y
    Times x y -> value x * value y

das ist syntax-gesteuerte Semantik:

Wert des Terms wird aus Werten der Teilterme kombiniert

Beispiel: lokale Variablen und Umgebungen

data Exp = ... | Let String Exp Exp | Ref String
ex2 :: Exp
ex2 = Let "x" ( Const 3 ) 
     ( Times ( Ref "x" ) (Ref "x" ) )
type Env = ( String -> Integer )
extend n w e = \ m -> if m == n then w else e m
value :: Env -> Exp -> Integer
value env x = case x of
    Ref n -> env n
    Let n x b -> value (extend n (value env x) env) b
    Const i -> i
    Plus x y -> value env x + value env y
    Times x y -> value env x * value env y
test2 = value (\ _ -> 42) ex2

Bezeichner sind Strings — oder nicht?

Datentypen für Folgen (von Zeichen)

Verstecken von Implementierungsdetails

Verwendung standardisierter Namen

Einsparung von Konstruktor-Aufrufen

Übung (Haskell)

Übung (Interpreter)

Übung (effiziente Imp. von Bezeichnern)

Inferenz-Systeme

Motivation

Definition

ein Inferenz-System \(I\) besteht aus

eine Ableitung für \(F\) bzgl. \(I\) ist ein Baum:

Def: \(I \vdash F\) \(:\iff\) \(\exists\) \(I\)-Ableitungsbaum mit Wurzel \(F\).

Regel-Schemata

Inferenz-Systeme (Beispiel)

Primalitäts-Zertifikate

Inferenzsystem: (aussagenlog.) Resolution

Inferenz von Typen

Inferenz von Werten

Umgebungen (Spezifikation)

Umgebungen (Implementierung)

Umgebung ist (partielle) Funktion von Name nach Wert

Realisierungen: type Env = String -> Integer

Operationen:

Beispiel

lookup (extend  "y" 4 (extend "x" 3 empty)) "x"

entspricht \((\emptyset[x:=3][y:=4]) x\)

Aufgaben Inferenz

  1. Primalitäts-Zertifikate

    • welche von \(2,4,8\) sind primitive Wurzel mod 101?

    • vollst. Primfaktorzerlegung von 100 angeben

    • ein vollst. Prim-Zertifikat für 101 angeben.

    • bestimmen Sie \(2^{(101-1)/5} \mod 101\) von Hand

      Hinweise: 1. das sind nicht 20 Multiplikationen,

      2. es wird nicht mit riesengroßen Zahlen gerechnet.

  2. Geben Sie den vollständigen Ableitungsbaum an für die Auswertung von

    let {x = 5} in let {y = 7} in x
  3. warum ist aussagenlog. Resolution nicht vollständig? (es gilt nicht: \((M\models F)\Rightarrow(M\vdash F)\).) Ein einfaches Gegenbeispiel reicht.

  4. ein Paper aus POPL heraussuchen, das Inferenzsysteme verwendet zur Beschreibung von statischer oder dynamische Semantik einer Programmiersprache

Semantische Bereiche

Continuations

Aufgaben

  1. Bool im Interpreter

    • Boolesche Literale

    • relationale Operatoren (==, <, o.ä.),

    • Inferenz-Regel(n) für Auswertung des If

    • Implementierung der Auswertung von if/then/else mit with_bool,

  2. Striktheit der Auswertung

    • einen Ausdruck e :: Exp angeben, für den value undefined e eine Exception ist (zwei mögliche Gründe: nicht gebundene Variable, Laufzeit-Typfehler)

    • mit diesem Ausdruck: diskutiere Auswertung von let {x = e} in 42

  3. bessere Organisation der Quelltexte

    • Cabalisierung (Quelltexte in src/, Projektbeschreibungsdatei cb.cabal), Anwendung: cabal repl usw.

    • separate Module für Exp, Env, Value,

Unterprogramme

Beispiele

Interpreter mit Funktionen

Semantik (mit Funktionen)

Let und Lambda

Mehrstellige Funktionen

…simulieren durch einstellige:

Semantik mit Closures

Closures (Spezifikation)

Rekursion?

Testfall (2)

let { t f x = f (f x) }
in  let { s x = x + 1 }
    in  t t t t s 0

Repräsentation von Fehlern

Übungen

  1. eingebaute primitive Rekursion (Induktion über Peano-Zahlen):

    implementieren Sie die Funktion fold :: r -> (r -> r) -> N -> r

    Testfall: fold 1 (\x -> 2*x) 5 == 32

    durch data Exp = .. | Fold .. und neuen Zweig in value

    Wie kann man damit die Fakultät implementieren?

  2. alternative Implementierung von Umgebungen

    • bisher type Env = Id -> Val

    • jetzt type Env = Data.Map.Map Id Val oder Data.HashMap

    Messung der Auswirkungen: 1. Laufzeit eines Testfalls, 2. Laufzeiten einzelner UP-Aufrufe (profiling)