Programmieren mit Funktionen

Werbung
Seminar Programmiersprachen
03 | MetaLanguage (ML)
Name: Philipp Westrich
MetaLanguage (ML)
2
Agenda
1. Grundlagen der Sprache
1.1 Entstehungsgeschichte
1.2 Der Lambda-Kalkül
1.3 Syntax und Semantik
2. Wichtige Konzepte der Sprache
2.1 Programmieren mit Funktionen
2.2 Modulare und zustandsbehaftete Programmierung
2.3 Typdeklarationen
Kapitel 0
Agenda
3. Verwendung der Sprache
3.1 Erweiterungen
3.2 ML in der Praxis
Name: Philipp Westrich
MetaLanguage (ML)
3
Entstehungsgeschichte

1974 von Robin Milner als interaktives Beweissystem entwickelt.

Einflüsse:
LISP (Kern der Sprache)
ALGOL, COBOL (imperative Elemente)
Verwendung:

•
•
•
Zunächst begrenzt auf England (individuelle Implementierungen).
1990 Zusammenführung unterschiedlicher Konzepte zum
Standard of ML (SML).
1997 weltweite Verbreitung durch die Überarbeitung und
Erweiterung des Standards.
Entstehungsgeschichte | Der Lambda-Kalkül | Syntax und Semantik
Name: Philipp Westrich
Kapitel 1
Grundlagen der Sprache
•
•
MetaLanguage (ML)
4
Einordnung
höhere Programmiersprachen
deklarative Sprachen
imperative Sprachen
funktionale Sprachen
Haskell, LISP, ML, …
Kapitel 1
Grundlagen der Sprache
ALGOL, C, Java, …
logische Sprachen
Prolog
Entstehungsgeschichte | Der Lambda-Kalkül | Syntax und Semantik
Name: Philipp Westrich
MetaLanguage (ML)
5
Definition
Anliegen der funktionalen Sprache nach PEPPER:
„… der Versuch, etwas von der Eleganz,
Klarheit und Präzision der Mathematik in die Welt der
Programmierung einfließen zu lassen.“
Entstehungsgeschichte | Der Lambda-Kalkül | Syntax und Semantik
Name: Philipp Westrich
Kapitel 1
Grundlagen der Sprache

MetaLanguage (ML)
6

Um 1930 von Alonzo Church entwickelt.

Erlaubt die formale Beschreibung des Verhaltens von
Computerprogrammen.

mathematische Grundstein funktionaler Sprachen

Reduktionskalkül:
•
•
Legt das Verhalten von λ-Termen fest.
Beschreibt, wie ein λ-Term in einen anderen, gleichbedeutenden
überführt werden kann.
Entstehungsgeschichte | Der Lambda-Kalkül | Syntax und Semantik
Name: Philipp Westrich
Kapitel 1
Grundlagen der Sprache
Der Lambda-Kalkül
MetaLanguage (ML)
7
Der Lambda-Term
allgemeine Form: (λx.e)

•
•
•
•
Vorspann λm,x,b bindet Variablen m, x, b an den Rumpf
Lexikalische Bindung: eine Variable gehört immer zur innersten
umschließenden Abstraktion
Stellt ausschließlich Funktionen dar, daraus Nachbildung von
Zahlen, boolesche Werte, etc.
Entstehungsgeschichte | Der Lambda-Kalkül | Syntax und Semantik
Name: Philipp Westrich
Kapitel 1
Grundlagen der Sprache
Bsp: Geradengleichung in λ-Notation: (λm,x,b.mx+b)


x heißt Parameter der Abstraktion.
e wird als Rumpf bezeichnet.
MetaLanguage (ML)
8
Reduktionsregeln
2 Arten: α-Reduktion und β-Reduktion

•
•
können auf beliebige Teilausdrücke angewandt werden
Reduktionsreihenfolge beliebig (Satz von Church/ Rosser)
•
Benennt eine gebundene Variable in eine andere um.
β-Reduktion

•
•
Ersetzung aller Vorkommen eines Parameters durch den
Operanden einer Applikation (Anwendung der Applikation)
Unterschiedliche Auswertungsstrategien zur Wahl des zu
reduzierenden β-Redex.
Entstehungsgeschichte | Der Lambda-Kalkül | Syntax und Semantik
Name: Philipp Westrich
Kapitel 1
Grundlagen der Sprache
α-Reduktion

MetaLanguage (ML)
9
Auswertungsstrategien
Generell bei rein funktionalen Sprachen egal, bspw:

•
•
leftmost-innermost reduction
call-by-need reduction (Haskell)
•
•
Festlegung aufgrund imperativer Elemente erforderlich
call-by-value (von innen nach außen)
Entstehungsgeschichte | Der Lambda-Kalkül | Syntax und Semantik
Name: Philipp Westrich
Kapitel 1
Grundlagen der Sprache
Im Fall von ML

MetaLanguage (ML)
10
Syntax

Basiert auf vereinfachter Version der λ-Notation.

Für die direkte Kommunikation mit der Maschine entwickelt:
Standard Promt ‚-‘
Abschluss eines Ausdrucks mit ‚;‘
Beispiel:
Kapitel 1
Grundlagen der Sprache
•
•
•
- "Hello World!"; (* This is a commentary *)
val it = "Hello World!" : string

Ergebnisbezeichner : it

Typinferenz
Entstehungsgeschichte | Der Lambda-Kalkül | Syntax und Semantik
Name: Philipp Westrich
MetaLanguage (ML)
11
Semantik
wohldefinierte Semantik:

•
•
Definition of Standard garantiert statische Sicherheit, d. h.
mehrdeutige oder undefinierte Ausdrücke existieren nicht.
dynamische Sicherheit durch Typüberprüfung zur Laufzeit.
•
•
statisch: Alle Werte einer Operation vom gleichen Typ.
strikt:
Auswertung von innen nach außen
Entstehungsgeschichte | Der Lambda-Kalkül | Syntax und Semantik
Name: Philipp Westrich
Kapitel 1
Grundlagen der Sprache
Auswertung

MetaLanguage (ML)
12
Semantik

Dynamische Typprüfung

Kapitel 1
Grundlagen der Sprache
- 7 + 7.0;
Error: operator and operand don't agree [literal]
operator domain: int * int
operand:
int * real
in expression:
7 + 7.0
Strikte Auswertung
- fun cond(b,x,y) = if b then x else y;
- cond(true,1,1 div 0);
uncaught exception Div [divide by zero]
Entstehungsgeschichte | Der Lambda-Kalkül | Syntax und Semantik
Name: Philipp Westrich
MetaLanguage (ML)
13
Typen
Standardtypen:

•
•
Integer, Fließkommazahlen (real), boolesche Werte und Strings
Tupel, Records, Listen
•
•
Ähneln dem Typ Enum in Haskell
null- und mehrstellige Konstruktoren
Funktionen

•
•
•
In funktionalen Sprachen ein Objekt wie jedes andere auch.
Können als Argument und Resultat einer Funktion auftreten oder in
einer Datenstruktur gespeichert werden.
In rein funktionalen Sprachen ohne Nebeneffekte.
Entstehungsgeschichte | Der Lambda-Kalkül | Syntax und Semantik
Name: Philipp Westrich
Kapitel 1
Grundlagen der Sprache
Benutzerdefinierte Typen:

MetaLanguage (ML)
14
Funktionsdefinititon
Eine Funktion ist ein Tripel ‹Df, Wf, Rf›, bestehend aus einer
Definitionsmenge Df , einer Wertemenge Wf und einer Relation
Rf aus Df х Wf, die Funktionsgraph genannt wird.

Der Funktionsgraph muss linkseindeutig sein, d. h. es gibt keine
zwei Paare ‹a, b1› є Rf und ‹a, b2› є Rf mit b1 ≠ b2.
Kapitel 1
Grundlagen der Sprache

Entstehungsgeschichte | Der Lambda-Kalkül | Syntax und Semantik
Name: Philipp Westrich
MetaLanguage (ML)
15
Funktionen in ML
Definition angelehnt an λ-Notation:
•
•
•
Anonyme Deklaration:
Kurzschreibweise:
Pattern Matching:
fn(x) => …
fun foo(x) = …
fun fac 0 = 1
| fac(n)= n*fac(n-1);
Currying:

•
•
Erzeugung einer neuen Funktion durch partielle Applikation.
Der Übergang von der Tupelbildung zum Funktionspfeil bezeichnet
man als currying.
Entstehungsgeschichte | Der Lambda-Kalkül | Syntax und Semantik
Name: Philipp Westrich
Kapitel 1
Grundlagen der Sprache

MetaLanguage (ML)
16
Currying

Beispiel:
- fun abstractLine(a,b) x = a*x+b;
val abstractLine = fn : int * int -> int -> int
Kapitel 1
Grundlagen der Sprache
- val line = abstractLine(3,1);
val line = fn : int -> int
- line(5);
val it = 16 : int
Entstehungsgeschichte | Der Lambda-Kalkül | Syntax und Semantik
Name: Philipp Westrich
MetaLanguage (ML)
17
Programmieren mit Funktionen
•
•
•
Syntax begünstigt Implementierung von Lösungen
Elegante Lösungen möglich (Rekursion, higher-order functions)
Verzicht von Nebeneffekten begünstigt Validierung
Softwareprogramm aus funktionaler Sicht:

•
•
Nur eine (beliebig komplexe) Funktion
Referenzielle Transparenz erleichtert die Fehlersuche
Programmieren mit Funktionen | Modulare und zustandsbehaftete Programmierung | Typdeklarationen
Name: Philipp Westrich
Kapitel 2
Wichtige Konzepte der Sprache
Vorteile des funktionalen Aspekts:

MetaLanguage (ML)
18

engl: higher-order functions

Funktionen generieren Funktionen
•
•

spart Programmieraufwand
besondere Form der Generalisierung, die über das Konzept in Java
hinausgeht
Beispiel: Potenzfunktionen
Programmieren mit Funktionen | Modulare und zustandsbehaftete Programmierung | Typdeklarationen
Name: Philipp Westrich
Kapitel 2
Wichtige Konzepte der Sprache
Funktionen höherer Ordnung (1)
MetaLanguage (ML)
19
Funktionen höherer Ordnung (2)
Anstelle der mühsamen individuellen Definition…
fun
fun
|
fun
|
fun
|
...

plus (x,
times(_,
times(x,
power(_,
power(x,
super(_,
super(x,
y)
0)
y)
0)
y)
0)
y)
=
=
=
=
=
=
=
x + y;
0
plus(x, (times(x, (y-1))));
1
times(x, (power(x, (y-1))));
1
power(x, (super(x, (y-1))));
Erzeugung mittels Grundfunktion
- fun hyper (1) (x, y) = x + y
| hyper (2) (x, y) = x * y
| hyper (n) (x, y) = if y=0 then 1 else
hyper (n-1) (x , (hyper (n) (x, (y-1))));
Programmieren mit Funktionen | Modulare und zustandsbehaftete Programmierung | Typdeklarationen
Name: Philipp Westrich
Kapitel 2
Wichtige Konzepte der Sprache

MetaLanguage (ML)
20
Funktionen höherer Ordnung (3)
Setzt man die Argumente x und y mit n gleich, erhält man eine
vereinfache ACKERMANN-Funktion:
- fun ackermann(n) = hyper(n)(n,n);
- ackermann(3); (* Is equivalent to 3^3 *)

Sie wächst stärker als jede primitiv-rekusive Funktion,
ackermann(4) hat bereits 10153 Dezimalstellen!

Sie eignet sich somit als Benchmark (ackermann(3,11)):
http://shootout.alioth.debian.org/gp4/benchmark.php?
test=recursive&lang=all#about
Programmieren mit Funktionen | Modulare und zustandsbehaftete Programmierung | Typdeklarationen
Name: Philipp Westrich
Kapitel 2
Wichtige Konzepte der Sprache

MetaLanguage (ML)
21
Funktionen höherer Ordnung (4)
Laufzeit
C (GNU gcc)
2,36 sec
Java 1.4 (-server)
4,81 sec
SML (MLton)
7,97 sec
Haskell (GHC)
8,05 sec
Fortran (G95)
10.98 sec
Python (Psyco)
36.12 sec
Prolog (YAP)
111.65 sec
Ruby (JRuby)
11 min
PHP
14 min
Kapitel 2
Wichtige Konzepte der Sprache
Programmiersprache
Programmieren mit Funktionen | Modulare und zustandsbehaftete Programmierung | Typdeklarationen
Name: Philipp Westrich
MetaLanguage (ML)
22
Modularisierung (1)
•
•
Kapselung der Funktionalität und Beschränkung des Zugriffes nach
Außen.
Implementierung erfolgt versteckt.

Macht „Programmieren im Großen“ praktikabel.

Implementierung ähnelt dem Konzept der Interfaces in Java:
•
•

signature ist die Schnittstelle,
structure die Implementierung
SML ’97 kommt – ähnlich wie Java – mit vielen
vorimplementierten Bibliotheken.
Programmieren mit Funktionen | Modulare und zustandsbehaftete Programmierung | Typdeklarationen
Name: Philipp Westrich
Kapitel 2
Wichtige Konzepte der Sprache
Konzept zur Strukturierung und Abgrenzung von Funktionen und
Datentypen

MetaLanguage (ML)
23
Modularisierung (2)

Beispiel:
Kapitel 2
Wichtige Konzepte der Sprache
signature Order = sig
val eq : 'a * 'a -> bool
val le : 'a * 'a -> bool
end
signature OrderedSequence = sig
type 'a Seq
val smaller : 'a Seq * 'a Seq -> bool
end
structure OrderedCharacters : Order = struct
fun eq(a,b) = … (* Implementation *)
fun le(a,b) = … (* Implementation *)
end;
Programmieren mit Funktionen | Modulare und zustandsbehaftete Programmierung | Typdeklarationen
Name: Philipp Westrich
MetaLanguage (ML)
24

ML ist keine rein funktionale Sprache

Einbettung imperative Elemente:
•
•

erleichterte Implementierung graphischer Algorithmen
essentiell für Beweissysteme
Beispiel:
fun hanoiIter(n) =
let …
val i = ref 0
in while !i < limit do (
…
i := !i +1
);
!result
end;
Programmieren mit Funktionen | Modulare und zustandsbehaftete Programmierung | Typdeklarationen
Name: Philipp Westrich
Kapitel 2
Wichtige Konzepte der Sprache
Imperative Elemente
MetaLanguage (ML)
25
Typdeklaration
•
•
•
Ermöglicht abstraktere und allgemeingültigere Lösungen.
polymorphe Typen: Typdeklaration, die den Basistyp ihrer Elemente
als Parameter angibt.
polymorphe Funktion: mathematisch gesehen, eine Familie von
Funktionen
ML machte Polymorphie salonfähig:

•
•
•
keine strukturglobale Festlegung
individuell für Typen, Funktionen und Module
Lockerung des starren Typsystems
Programmieren mit Funktionen | Modulare und zustandsbehaftete Programmierung | Typdeklarationen
Name: Philipp Westrich
Kapitel 2
Wichtige Konzepte der Sprache
Polymorphie:

MetaLanguage (ML)
26
Polymorphe Deklaration (1)

Beispiel: polymorphe Typen:
Kapitel 2
Wichtige Konzepte der Sprache
- datatype 'a Pair = pair of ('a * 'a);
datatype 'a Pair = pair of 'a * 'a
- val intPair = pair(1,1);
val intPair = pair (1,1) : int Pair
- val boolPair = pair(true,false);
val boolPair = pair (true,false) : bool Pair
Programmieren mit Funktionen | Modulare und zustandsbehaftete Programmierung | Typdeklarationen
Name: Philipp Westrich
MetaLanguage (ML)
27
Polymorphe Deklaration (2)
polymorphe Module:
•
•
Funktor: ermöglicht Parametrisierung von Modulen
Beispiel:
- functor OrdSeq (OrderedElements:Order):OrderedSequence =
struct
datatype ‘a Seq
= … (* Implementation *)
fun smaller (S1, S2) = … (* Implementation *)
end;
- structure Words = OrdSeq (OrderedCharacters); (* Usage *)
Programmieren mit Funktionen | Modulare und zustandsbehaftete Programmierung | Typdeklarationen
Name: Philipp Westrich
Kapitel 2
Wichtige Konzepte der Sprache

MetaLanguage (ML)
28
Ambige Deklaration (1)
Standard Deklarationen:
•
•
Funktionen: monomorph oder polymorph
Variablen: monomorph, polymorph oder ambig
Ambige Deklaration

•
•
Behandelt freie Typvariablen monomorph, obwohl Polymorphie
möglich wäre.
Aufgrund der imperativen Elemente (Speicheroperationen)
benötigt
Programmieren mit Funktionen | Modulare und zustandsbehaftete Programmierung | Typdeklarationen
Name: Philipp Westrich
Kapitel 2
Wichtige Konzepte der Sprache

MetaLanguage (ML)
29
Ambige Deklaration (2)
Beispiel:
- let val r = ref (fn x => x)
in r := (fn() => ());
1 + (!r 4)
end;
• Deklaration von r ambig, da rechte Seite Applikation
• zweite Zeile fordert r vom Typ (unit  unit) ref
• dritte Zeile vom Typ
(int  int) ref
 Fehlermeldung!
Programmieren mit Funktionen | Modulare und zustandsbehaftete Programmierung | Typdeklarationen
Name: Philipp Westrich
Kapitel 2
Wichtige Konzepte der Sprache

MetaLanguage (ML)
30
Erweiterungen des ’97 Standards

Nach 1997 keine neue offizielle Erweiterung für SML

Forschungseinrichtungen modifizieren SML, bspw:
•
•
Princeton University, Bell Laboratories : SML/NJ
(Vektoren, OR Muster, higher-order modules)
Uni Saarland: Alice ML
(parallele, verteilte und bedingte Programmierung)
INRIA: OCaml
(ML-Derivat für Objektorientierung)
Kapitel 3
Verwendung der Sprache
•
Erweiterungen | ML in der Praxis
Name: Philipp Westrich
MetaLanguage (ML)
31
Potential durch neue Features (Alice ML)
•
•
•
Auswertung der Argumente einer Funktion erst wenn sie benötigt
werden.
In Alice ML durch eigenen Typ realisiert: lazy futures
Durch lazy evaluation lässt sich das Konzept der higher-order
functions erweitern: Verknüpfung von Programmen
Constraint Programming

•
•
Benutzer beschreibt das Problem durch Bedingungen oder
Einschränkungen
Computer löst es selbstständig
Erweiterungen | ML in der Praxis
Name: Philipp Westrich
Kapitel 3
Verwendung der Sprache
Lazy Evaluation

MetaLanguage (ML)
32

Programme als Funktionen  Argument oder Resultat

Mit lazy evaluation neue Möglichkeiten der Modularisierung und
Terminierung

Beispiel:
•
•
•
Programme foo und bar im Ausdruck foo( bar( input))
Dabei wird bar erst gestartet, wenn foo versucht sein Argument
zu lesen.
Wenn foo fertig  automatische Terminierung von bar
(von außen)
Erweiterungen | ML in der Praxis
Name: Philipp Westrich
Kapitel 3
Verwendung der Sprache
Lazy Evaluation
MetaLanguage (ML)
33

Benutzer gibt Constraints vor

Computer belegt sukzessive Variablen mit Werten, bis
•
•
Ein Constraint verletzt
 Abbruch der Suche
Alle Variablen (erfolgreich)
belegt  eine Lösung gefunden
Erweiterungen | ML in der Praxis
Name: Philipp Westrich
Kapitel 3
Verwendung der Sprache
Constraint Programming (1)
MetaLanguage (ML)
34
Constraint Programming (2)
Beispiel: SEND + MORE = MONEY
import …;
fun money sp =
let val letters as #[S,E,N,D,M,O,R,Y] =
fdtermVec (sp, 8, [0`#9])
in distinct (sp, letters, FD.BND);
post (sp, S `<> `0, FD.BND);
post (sp, M `<> `0, FD.BND);
post (sp,
`1000`*S `+ `100`*E `+ `10`*N `+ D
`+
`1000`*M `+ `100`*O `+ `10`*R `+ E
`= `10000`*M `+ `1000`*O `+ `100`*N `+ `10`*E `+ Y,
FD.BND);
branch (sp, letters, FD.B_SIZE_MIN, FD.B_MIN);
{S,E,N,D,M,O,R,Y}
end;
Explorer.exploreAll money;
Erweiterungen | ML in der Praxis
Name: Philipp Westrich
Kapitel 3
Verwendung der Sprache

MetaLanguage (ML)
35
ML in der Praxis
Einsatzgebiete:
•
Beweissystem, zB:
−
−
−
•
Milner: LCF
TU München & Uni Cambridge: Isabelle
Motorola UK: Validierung von Message Sequence Charts
Kapitel 3
Verwendung der Sprache

Compilerbau, zB:
−
−
−
Implementierung der Tools Lex & YACC
NY University & Bell Laboratories: MLRisc
MLton
Erweiterungen | ML in der Praxis
Name: Philipp Westrich
MetaLanguage (ML)
36

Funktionale Sprache mit imperativen Elementen

strikt (call-by-value)

starres Typsystem, dynamisch durch Polymorphie

hohe mathematische Ausdruckskraft

modular, erweiterbar

Einsatzgebiete:
•
•
Kapitel 4
Zusmmenfassung
Zusammenfassung
Beweissystem,
Compilerbau
Name: Philipp Westrich
Herunterladen