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