Übersicht. Einführung in die Funktionale Programmierung: Einleitung & Motivation. Klassifizierung von Programmiersprachen (1)

Ähnliche Dokumente
Einführung in die Funktionale Programmierung: Einleitung & Motivation

Übersicht. Einführung in die Funktionale Programmierung: Einleitung & Motivation. Klassifizierung von Programmiersprachen (1)

Beispiel: Hamming-Folge Erzeuge eine Folge X = x 0,x 2,... mit folgenden Eigenschaften: 1. x i+1 > x i für alle i

Programmiersprachen Proseminar

Vorsemesterkurs Informatik

Haskell, Typen, und Typberechnung. Grundlagen der Programmierung 3 A. Einige andere Programmiersprachen. Typisierung in Haskell

Einführung in die funktionale Programmierung

Grundlagen der Programmierung 3 A

Haskell, Typen, und Typberechnung. Grundlagen der Programmierung 3 A. Überladung und Konversion in Haskell. Typisierung in Haskell

Adressen. Praktikum Funktionale Programmierung Organisation und Überblick. Termine WWW

Haskell und Python. pures Programmieren, Auswerten von Ausdrücken rekursives Programmieren, Typsystem. Python: Eine prozedurale Programmiersprache

Einführung in die funktionale Programmierung

Funktionale Programmierung

1. Typen 1.1 Typsicherheit 1.2 Typprüfung

Imperative vs. Funktionale Programmierung

Funktionale Programmiersprachen

1 Funktionale vs. Imperative Programmierung

Programmierparadigmen: Funktionale Programmierung

1. Grundkonzepte der logischen Programmierung 2. Syntax von Prolog 3. Rechnen in Prolog. IV.1 Grundkonzepte der logischen Programmierung - 1 -

Funktionale Programmierung (in Clojure)

Multiparadigmen- Programmiersprachen

Einführung in die funktionale Programmierung, Wintersemester 2006/07

Vorlesung Programmieren

Programmiersprachen. Organisation und Einführung. Berthold Hoffmann. Studiengang Informatik Universität Bremen

Objekt-Funktionale Programmierung. am Beispiel von SCALA. Thorsten Jolitz

Outline. 1 Einleitung. 2 Einführung in C. 3 Fortgeschrittenes in C. 4 Einführung in Emacs Lisp. 5 Einführung in Prolog. 6 Formale Semantik

Adressen. Praktikum Funktionale Programmierung Organisation und Überblick. Termine. Studienleistung

Organisatorisches/Einstieg

Modellierung und Programmierung 1

4.4 Imperative Algorithmen Prozeduren

Deklarative Programmierung

Prof. Dr. Jürgen Giesl Lehr- und Forschungsgebiet Informatik 2. Proseminar - 1 -

Computergrundlagen Programmiersprachen, Interpreter, Compiler, Linker

Einführung in die objektorientierte Programmierung. mit Squeak

Kapitel 1: Einführung

Methoden zur Interpretation LISPähnlicher. Programmiersprachen. Seminarvortrag / 53 FH AACHEN FACHBEREICH 9 TOBIAS STUMM MATR.-NR.

DieÜbersetzung funktionaler Programmiersprachen

Funktionale Programmierung Einführung

Computergrundlagen Programmiersprachen, Interpreter, Compiler, Linker

Einführung in die Informatik

Programmiersprachen. Wintersemester 2005/2006. Alexandru Berlea. Lehrstuhl Prof. Seidl Institut für Informatik TU München

Kapitel 8. Programmierkurs. Methoden. 8.1 Methoden

Grundlagen der Informatik 0

Basiskonstrukte von Haskell

EIDI 1 Einführung in die Informatik 1. PGdP Praktikum Grundlagen der Programmierung. Harald Räcke 2/217

Praktische Informatik 3

Polymorphie/Späte Bindung Abstrakte Klassen Interfaces. Polymorphie/Späte Bindung Abstrakte Klassen Interfaces

Praktische Informatik 3: Funktionale Programmierung Vorlesung 1 vom : Einführung

Haskell, Typen und Typberechnung

Crashkurs C++ - Teil 1

Java: Der Einstieg. Algorithmen und Datenstrukturen II 1

12 Abstrakte Klassen, finale Klassen und Interfaces

Vorlesung Programmieren

Objektorientiertes Programmieren

Allgemeines. Verschiedene Sprachkonzepte C-Sprachfamilie C-ähnliche Programmiersprachen Allgemeines zu C. #include <stdio.h>

7. Programmierungs- Phase Software Engineering (FB EIT) Wintersemester 2007 / 2008 Prof. Dr. Bernhard Humm Hochschule Darmstadt, FB Informatik

Konzepte der Programmiersprachen

FORTRAN77. eine höllische Programmiersprache. Christian Sternecker. Sommersemester TU-München

Grundlagen der OO- Programmierung in C#

Programmieren in Lua

Inhaltsverzeichnis 1. Objektorientierung: Ein Einstieg 2. Objekte, Klassen, Kapselung

Übung zur Vorlesung Wissenschaftliches Rechnen Sommersemester 2012 Auffrischung zur Programmierung in C++, 1. Teil

Funktionale Programmierung

6. Funktionen, Parameterübergabe

Guile Die Erweiterungssprache des GNU-Projekts

Kommerzielle Softwareentwicklung mit Haskell

Repetitorium Informatik (Java)

Haskell, Typen und Typberechnung

Einführung in Haskell und seine Werkzeuge

Workshop Einführung in die Sprache Haskell

EIGENSCHAFTEN VON SPRACHEN

Informationsverarbeitung im Bauwesen

Objektorientierte Programmierung. Kapitel 22: Aufzählungstypen (Enumeration Types)

Beispiele für Ausdrücke. Der imperative Kern. Der imperative Kern. Imperativer Kern - Kontrollstrukturen. Deklarationen mit Initialisierung

Just-In-Time-Compiler (2)

10. Programmierungs-Phase: Objektorientierung Software Engineering

Familienpolymorphismus

Einführung in die Programmiertechnik

Werkzeuge zur Programmentwicklung

Probeklausur: Programmierung WS04/05

1.3 Geschichte der Programmiersprachen

Objektorientierte Programmierung. Agenda für heute, 26. März, Eines der drei wichtigsten Programmierparadigmen

Programmierkurs Python I

Programmieren in Haskell Debugging

Softwaretechnik. Funktionale Programmierung. Christian Lindig. 23. Januar Lehrstuhl für Softwaretechnik Universität des Saarlandes

Übergang von funktionaler zu OOP. Algorithmen und Datenstrukturen II 1

13. Funktionale Konzepte in Java

Objective-C Anwendungen entwickeln für Mac und iphone (Apple Software) Click here if your download doesn"t start automatically

Kapitel 4: Klassen und Unterklassen

Anwendungen der Logik: Deklarative bzw. Logik-Programmierung in PROLOG

FACHHOCHSCHULE MANNHEIM

Just-In-Time-Compiler (2)

Early first draft Höllische Programmiersprachen Seminar im WS 2014/15 Speichermanagement

Kapitel 9. Programmierkurs. Attribute von Klassen, Methoden und Variablen. 9.1 Attribute von Klassen, Methoden und Variablen

Formale Methoden der Softwaretechnik 1 Vorlesung vom : Grundlage von Isabelle

Google s JavaScript Engine: V8

Einführung in die funktionale Programmierung

Java I Vorlesung 1 Einführung in Java

Einstieg in die Informatik mit Java

Transkript:

Stand der Folien: 18. Oktober 2010 Motivation Funktionale Programmiersprachen Haskell Übersicht Einführung in die Funktionale Programmierung: Einleitung & Motivation Dr. David Sabel 1 Motivation Übersicht Programmierparadigmen Vorteile funktionaler Programmierung 2 Funktionale Programmiersprachen Eigenschaften von funktionale Programmiersprachen Überblick über verschiedene funktionale Programmiersprachen 3 Haskell WS 2010/11 EFP (02) Einleitung & Motivation WS 2010/11 D. Sabel 2/27 Klassifizierung von Programmiersprachen (1) Imperative Programmiersprachen: lat. imperare = befehlen Klassifizierung von Programmierparadigmen und -sprachen Insbesondere: Was unterscheidet Funktionale Programmiersprachen von anderen? Programm = Folge von Anweisungen (Befehlen) Ausführung = Sequentielle Abarbeitung der Befehle, Befehle ändern den Zustand des Speichers X:=10; while X < 100 do X:=X+1; Passend zur von-neumann Rechnerarchitektur Programm beschreibt WIE der Zustand modifiziert werden soll Prozedurale Programmiersprachen: Strukturierung des imperativen Codes durch Prozeduren EFP (02) Einleitung & Motivation WS 2010/11 D. Sabel 3/27 EFP (02) Einleitung & Motivation WS 2010/11 D. Sabel 4/27

Klassifizierung von Programmiersprachen (2) Klassifizierung von Programmiersprachen (3) Objektorientierte Programmiersprachen: Programm: Definition von Klassen (Klassen = Methoden + Attribute), Strukturierung durch Vererbung Ausführung=veränderliche Objekte (Instanzen von Klassen) versenden Nachrichten untereinander Fahrzeug auto = new Fahrzeug(); auto.setspeed(180); Zustandsänderung des Speichers durch Veränderung der Objekte werden oft zu den imperativen Sprachen gezählt Deklarative Programmiersprachen lat. declarare = erklären Programm = Beschreibt nicht WIE, sondern eher WAS berechnet werden soll. Ausführung= I.A. keine Manipulation des Zustands, sondern Wertberechnung von Ausdrücken Lassen sich grob in funktionale Programmiersprachen und logische Programmiersprachen aufteilen. EFP (02) Einleitung & Motivation WS 2010/11 D. Sabel 5/27 EFP (02) Einleitung & Motivation WS 2010/11 D. Sabel 6/27 Klassifizierung von Programmiersprachen (4) Klassifizierung von Programmiersprachen (5) Logische Programmiersprachen Prominentes Beispiel: Prolog Programm = Menge von logischen Formeln (in Prolog: Hornklauseln der Prädikatenlogik) bruder(x,y):- istsohn(x,z), istsohn(y,z), X/=Y. Ausführung = Herleitung neuer Fakten mittels logischer Schlüsse (z.b. Resolution) Funktionale Programmiersprachen Programm = Funktionsdefinitionen + ausg. Ausdruck (main) quadrat x = x * x main = quadrat 5 Ausführung = Auswerten des ausgez. Ausdrucks (main). Resultat der Auswertung: Ein einziger Wert EFP (02) Einleitung & Motivation WS 2010/11 D. Sabel 7/27 EFP (02) Einleitung & Motivation WS 2010/11 D. Sabel 8/27

Klassifizierung von Programmiersprachen (5) Funktionale Programmiersprachen (Forts.) In reinen funktionalen Programmiersprachen: Keine (sichtbare) Manipulation des Zustands D.h. keine Seiteneffekte, es gilt referentielle Transparenz Variablen stellen keine Speicherplätze dar, sondern unveränderliche Werte Warum Funktionale Programmierung Welche Motivation gibt es, sich diese Sprachen anzuschauen? Welche Vorteile bieten diese Sprachen? Referentielle Transparenz Gleiche Funktion auf gleiche Argumente liefert stets das gleiche Resultat EFP (02) Einleitung & Motivation WS 2010/11 D. Sabel 9/27 EFP (02) Einleitung & Motivation WS 2010/11 D. Sabel 10/27 Warum Funktionale Programmierung? (1) Warum Funktionale Programmierung? (2) Andere Sichtweise der Problemlösung: abstraktere Lösungsformulierung, auch hilfreich beim imperativen Programmieren Elegantere Problemlösung: Funktionale Programme sind meistens kürzer und verständlicher, da mathematischer Mathematisch einfacher handhabbar: Aussagen wie mein Programm funktioniert korrekt oder Programm A und Programm B verhalten sich gleich relativ einfach nachweisbar Weniger Laufzeitfehler bei starker und statischer Typisierung: Fehlerentdeckung zur Compilezeit Debuggen einfach: Fehler können unabhängig vom Speicherzustand reproduziert werden Testen einfach: Unit-Test einfach möglich: Funktionen können unabhängig getestet werden Wiederverwendbarkeit: Funktionen höherer Ordnung haben hohen Abstraktionsgrad. Funktion höherer Ordnung Eingabeparameter (und Ausgabe) dürfen selbst Funktionen sein EFP (02) Einleitung & Motivation WS 2010/11 D. Sabel 11/27 EFP (02) Einleitung & Motivation WS 2010/11 D. Sabel 12/27

Warum Funktionale Programmierung? (3) Warum Funktionale Programmierung? (4) Beispiel: Summe und Produkt der Elemente einer Liste summe liste = if leer(liste) then 0 else erstes Element der Liste + (summe Liste ohne erstes Element ) produkt liste = if leer(liste) then 1 else erstes Element der Liste * (produkt Liste ohne erstes Element ) Besser abstrahiert: reduce e f liste = if leer(liste) then e else f erstes Element der Liste (reduce e f Liste ohne erstes Element ) summe und produkt sind dann nur Spezialfälle: summe liste = reduce 0 (+) liste produkt liste = reduce 1 (*) liste Einfache Syntax: I.A. haben funktionale Programmiersprachen wenige syntaktische Konstrukte / Schlüsselwörter Modularität: Die meisten FP bieten Modulsysteme zur Strukturierung und Kapselung des Codes. Kompositionalität: Funktionskomposition erlaubt strukturiertes Zusammensetzen großer Funktionalitäten Parallelisierbarkeit: Reihenfolge der Auswertung von funkt. Programmen oft irrelevant, daher gut parallelisierbar. EFP (02) Einleitung & Motivation WS 2010/11 D. Sabel 13/27 EFP (02) Einleitung & Motivation WS 2010/11 D. Sabel 14/27 Warum Funktionale Programmierung? (5) Multi-Core Architekturen: FP im Trend : Seiteneffektfreiheit impliziert Race Conditions oder Deadlocks können oft gar nicht auftreten, da diese direkt mit Speicherzugriffen zusammenhängen. Große Forschergemeinde, neueste Entwicklungen Auch moderne imperative Programmiersprachen übernehmen FP-Konzepte, z.b. Java Generics, etc. Klassifizierung Funktionaler Programmiersprachen Anhand welcher Eigenschaften lassen sich FP unterscheiden? EFP (02) Einleitung & Motivation WS 2010/11 D. Sabel 15/27 EFP (02) Einleitung & Motivation WS 2010/11 D. Sabel 16/27

Wesentliche Eigenschaften von FP (1) Pure vs. Impure: Pure FP: Keine Seiteneffekte erlaubt Impure FP: Seiteneffekte möglich Daumenregel: Pure FP = nicht-strikte Auswertung Impure FP= strikte Auswertung Wesentliche Eigenschaften von FP (2) strikte vs. nicht-strikte Auswertung Strikte Auswertung (auch call-by-value oder applikative Reihenfolge): Definitionseinsetzung nach Argumentauswertung Nicht-strikte Auswertung (auch call-by-name, call-by-need, lazy, verzögert, Normalordnung): Definitionseinsetzung ohne Argumentauswertung. Beispiel: quadrat x = x x Strikte Auswertung von quadrat (1 + 2): quadrat (1 + 2) quadrat 3 3 3 9 Nicht-Strikte Auswertung von quadrat (1 + 2) quadrat (1 + 2) (1 + 2) (1 + 2) 3 (1 + 2) 3 3 9 EFP (02) Einleitung & Motivation WS 2010/11 D. Sabel 17/27 EFP (02) Einleitung & Motivation WS 2010/11 D. Sabel 18/27 Wesentliche Eigenschaften von FP (3) Wesentliche Eigenschaften von FP (4) Eigenschaften des Typsystems stark vs. schwach: stark: Alle Ausdrücken müssen getypt sein schwach: (Manche) Typfehler werden vom Compiler akzeptiert bzw. manche Ausdrücke dürfen ungetypt sein dynamisch vs. statisch: statisch: Typ des Programms muss zur Compilezeit feststehen. Konsequenzen: Keine Typfehler zur Laufzeit, Typinformation zur Laufzeit unnötig dynamisch: Typermittlung zur Laufzeit Konsequenzen: Typfehler zur Laufzeit möglich, Typinformation zur Laufzeit nötig. monomorph vs. polymorph: monomorph:: Funktionen / Ausdrücke haben festen Typ polymorph: Schematische Typen (mit Typvariablen) erlaubt. First-Order vs. Higher-Order Funktionen first-order: Argumente von Funktionen müssen Datenobjekte sein higher-order: Auch Funktionen als Argumente erlaubt Speicherverwaltung automatische Speicherbereinigung (Garbage Collector): Benutzter Speicher wird automatisch freigegeben. EFP (02) Einleitung & Motivation WS 2010/11 D. Sabel 19/27 EFP (02) Einleitung & Motivation WS 2010/11 D. Sabel 20/27

Überblick Funktionale Programmiersprachen (1) Überblick Funktionale Programmiersprachen Eine (unvollständige) Aufzählung von verschiedenen funktionalen Programmiersprachen Lisp: Sprachfamilie, List processing, Ende 1950er Jahre, von John McCarthy). Sprache in Anlehnung an den Lambda-Kalkül, ungetypt, strikt. Common Lisp: Lisp-Dialekt, erste Ausgabe 1984, endgültiger Standard 1994, dynamisch typisiert, auch OO- und prozedurale Anteile, Seiteneffekte erlaubt, strikt, Scheme: Lisp-Dialekt, streng und dynamisch getypt, call-by-value, Seiteneffekte erlaubt, eingeführt im Zeitraum 1975-1980, letzter Standard aus dem Jahr 2007, Clojure: relativ neue Sprache, Lisp-Dialekt, der direkt in Java-Bytecode compiliert wird, dynamisch getypt, spezielle Konstrukte für multi-threaded Programmierung (software transactional memory system, reactive agent system) EFP (02) Einleitung & Motivation WS 2010/11 D. Sabel 21/27 EFP (02) Einleitung & Motivation WS 2010/11 D. Sabel 22/27 Überblick Funktionale Programmiersprachen (2) ML: Sprachfamilie, Meta Language, statische Typisierung, Polymorphismus, automatische Speicherbereinigung, i.a. call-by-value Auswertung, Seiteneffekte erlaubt, entwickelt von R. Milner 1973 SML: Standard ML, ML-Variante: call-by-value, entwickelt 1990, letzte Standardisierung 1997, Sprache ist vollständig formal definiert, Referenz-Implementierung: Standard ML of New Jersey OCaml: Objective Caml, Weiterentwicklung von Caml (Categorically Abstract Machine Language), ML-Dialekt, call-by-value, stark und statische Typisierung, polymorphes Typsystem, automatische Speicherbereinigung, nicht Seiteneffekt-frei, unterstützt auch Objektorientierung, entwickelt: 1996 Alice ML: ML Variante, die sich als Erweiterung von SML versteht, mit Unterstützung für Nebenläufigkeit durch sogenannte Futures, call-by-value Auswertung, stark und statisch typisiert, polymorphes Typsystem, entwickelt an der Uni Saarbrücken 2000-2007 F#: Funktionale Programmiersprache entwickelt von Microsoft ab 2002, sehr angelehnt an OCaml, streng typisiert, auch objektorientierte und imperative Konstrukte, call-by-value, Seiteneffekte möglich, im Visual Studio 2010 offiziell integriert Überblick Funktionale Programmiersprachen (3) Haskell: Pure funktionale Programmiersprache, keine Seiteneffekte, strenges und statisches Typsystem, call-by-need Auswertung, Polymorphismus, Komitee-Sprache, erster Standard 1990, Haskell 98: 1999 und nochmal 2003 leichte Revision, neuer Standard Haskell 2010 (veröffentlicht Juli 2010), Clean: Nicht-strikte funktionale Programmiersprache, stark und statisch getypt, polymorphe Typen, higher-order, pure EFP (02) Einleitung & Motivation WS 2010/11 D. Sabel 23/27 EFP (02) Einleitung & Motivation WS 2010/11 D. Sabel 24/27

Überblick Funktionale Programmiersprachen (4) Motivation Funktionale Programmiersprachen Haskell In der Vorlesung verwenden wir Haskell Erlang: Strikte funktionale Programmiersprache, dynamisch typisiert, entwickelt von Ericsson für Telefonnetze, sehr gute Unterstützung zur parallelen und verteilten Programmierung, Ressourcen schonende Prozesse, entwickelt ab 1986, open source 1998, hot swapping (Code Austausch zur Laufzeit), Zuverlässigkeit nine nines = 99,9999999 % Scala: Multiparadigmen Sprache: funktional, objektorientiert, imperativ, 2003 entwickelt, läuft auf der Java VM, funktionaler Anteil: Funktionen höherer Ordnung, Anonyme Funktionen, Currying, call-by-value Auswertung, statische Typisierung Haskell Webseite: http://haskell.org Interpreter / Compiler: GHCi bzw. GHC: http://haskell.org/ghc Am besten installieren: Haskell Platform: http://hackage.haskell.org/platform enthält GHC, GHCi, Bibliotheken, weitere Tools Dokumentation der Standardbibliotheken: http://www.haskell.org/ghc/docs/latest/html/libraries/index.html EFP (02) Einleitung & Motivation WS 2010/11 D. Sabel 25/27 EFP (02) Einleitung & Motivation WS 2010/11 D. Sabel 26/27 Motivation Funktionale Programmiersprachen Haskell Ziele der Vorlesung Haskell gut kennen lernen Konzepte von Haskell verstehen Dazu gehören: Syntax, Semantik, Typsystem Wir betrachten insbesondere: Kernsprachen als Modelle für Haskell Aber auch: Grundlagen aller FP verstehen EFP (02) Einleitung & Motivation WS 2010/11 D. Sabel 27/27