Paradigmen zur Algorithmenbeschreibung

Ähnliche Dokumente
Paradigmen zur Algorithmenbeschreibung

Paradigmen zur Algorithmenbeschreibung

Ausblick: Entwurfsmuster (Design Pattern) 12.1 Entwurfsmuster (Design Pattern) 12.2 Programmierparadigmen und -sprachen und Veranstaltungen

Ausblick: Entwurfsmuster (Design Pattern)

Ausblick: Entwurfsmuster (Design Pattern)

Ausblick: Entwurfsmuster (Design Pattern)

Ausblick: Entwurfsmuster (Design Pattern)

III.1 Prinzipien der funktionalen Programmierung - 1 -

Gliederung. n Teil I: Einleitung und Grundbegriffe. n Teil II: Imperative und objektorientierte Programmierung

Algorithmus Beispiele: Algorithmen als Programme Sind Programme korrekt? Gibt es Algorithmen? FAZIT

Programmieren für Fortgeschrittene

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

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

n 1. Der Begriff Informatik n 2. Syntax und Semantik von Programmiersprachen - 1 -

1. Der Begriff Informatik 2. Syntax und Semantik von Programmiersprachen - 1 -

1. Der Begriff Informatik 2. Syntax und Semantik von Programmiersprachen - 1 -

Java: Grundlagen der Sprache: Beispiele aus der Praxis. 3.6 Beispiele aus der Praxis 3-1

1.3 Geschichte der Programmiersprachen

Programmieren I. Methoden-Spezial Heusch --- Ratz 6.1, Institut für Angewandte Informatik

Programmieren I. Methoden-Special Heusch --- Ratz 6.1, Institut für Angewandte Informatik

1 Programmiersprachen 1.1 1

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

Vorlesung Programmieren

Vorlesung Programmieren. Programmiersprachen-Paradigmen. Programmierparadigmen. Eine Programmiersprache dient dem Aufschreiben von Algorithmen

Semantik von Programmiersprachen

Inhalt. n Algorithmus. n Euklidscher Algorithmus. n Sortieren. n Programmiersprachen. n Entwicklungsschritte eines Programms.

Einführung in die Programmierung mit Java

(Building) Flexible Functional Programming Interfaces. Von Amos Treiber

1. Einführung Programmieren / Algorithmen und Datenstrukturen 1 Prof. Dr. Bernhard Humm FB Informatik, Hochschule Darmstadt

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

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

Erste Schritte in Java

Martin Unold INFORMATIK. Geoinformatik und Vermessung

2. JAVA-Programmierung. Informatik II für Verkehrsingenieure

Programmiersprachen: Klassifizierung und Methoden. Programmier-Paradigmen. Grundlagen der Programmierung 2 (1.C) - 1 -

Javakurs für Anfänger

Informatik Vorkurs Sommersemester 2015

1 Funktionale vs. Imperative Programmierung

Gedächtnis. Während der Abarbeitung eines Algorithmus müssen sich Dinge gemerkt werden bzw. auf Dingen wird gerechnet. Zugriff.

Logik ist die Grundlage für viele Wissenschaften. Vorkurs Sommersemester 2018 Werner Struckmann 28. März 2018

Erste Schritte in Java

Erste Java-Programme (Scopes und Rekursion)

Intensivübung zu Algorithmen und Datenstrukturen

Grundlagen der Programmierung UE

Es gibt keinen Algorithmus zum Schreiben eines Programms bzw. Algorithmus.

2 Eine einfache Programmiersprache

2 Eine einfache Programmiersprache

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

Informatik 1. Sommersemester Helmut Seidl. Institut für Informatik TU München

2 Eine einfache Programmiersprache. Variablen. Operationen Zuweisung. Variablen

1. Einführung Einführung in die Programmierung (fbw) Sommersemester 2008 Prof. Dr. Bernhard Humm Hochschule Darmstadt, fbi

Institut für Programmierung und Reaktive Systeme. Java 1. Markus Reschke

2 Eine einfache Programmiersprache

Grundlagen der Programmierung UE

2 Eine einfache Programmiersprache

Programmieren für Fortgeschrittene

Vorkurs Informatik WiSe 17/18

Semantik von Programmiersprachen

Martin Unold INFORMATIK. Geoinformatik und Vermessung

Grundlagen der Modellierung und Programmierung, Übung

Einführung in die Programmierung

Funktionale Programmierung Einführung

Vorkurs Informatik WiSe 16/17

1. Der Begriff Informatik 2. Syntax und Semantik von Programmiersprachen. I.2. I.2. Grundlagen von von Programmiersprachen.

Programmieren in C. Eine Einführung in die Programmiersprache C. Prof. Dr. Nikolaus Wulff

Abschnitt 11: Korrektheit von imperativen Programmen

Kapitel 1: Einleitung. Gliederung. Zum Begriff Informatik Zum Begriff Algorithmus Zum Begriff Programmieren

Lösungsvorschlag Serie 2 Rekursion

Software-Entwicklung

Einführung in die Programmierung

Was kann ein Computer ausrechnen? Vorkurs Sommersemester 2018 Werner Struckmann 23. März 2018

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 16/17. Kapitel 1. Einführung und Grundbegriffe

Javakurs für Anfänger

12. Rekursion Grundlagen der Programmierung 1 (Java)

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 11/12. Kapitel 1. Einführung und Grundbegriffe

JAVA BASICS. 2. Primitive Datentypen. 1. Warum Java? a) Boolean (logische Werte wahr & falsch)

Höhere Programmiersprachen

Java 8. Elmar Fuchs Grundlagen Programmierung. 1. Ausgabe, Oktober 2014 JAV8

System.out.println("TEXT");

Einführung in die Programmierung Wintersemester 2016/17

ALP II Dynamische Datenmengen

Aufgabenblatt: Methoden - rekursiv

Institut für Programmierung und Reaktive Systeme 2. Februar Programmieren I. Übungsklausur

Martin Unold INFORMATIK. Geoinformatik und Vermessung

10. Programmierungs-Phase: Objektorientierung Software Engineering

2. Programmierung in C

9. Ausnahmebehandlung 10. Softwareentwicklung: Anforderungsanalyse und Problemdefinition - ein Beispiel Abstrakte Datentypen,

Empfehlenswerte Literatur

Einführung in C. EDV1-04C-Einführung 1

Vorkurs Informatik WiSe 17/18

2. Einführung. Informatik II für Verkehrsingenieure

Java 8. basierend auf Folien von Florian Erhard

JAVA BASICS. 2. Primitive Datentypen. 1. Warum Java? a) Boolean (logische Werte wahr & falsch)

Martin Unold INFORMATIK. Geoinformatik und Vermessung

Transkript:

Paradigmen zur Algorithmenbeschreibung In einem objektorientierten Algorithmus werden Datenstrukturen und Methoden zu einer Klasse zusammengefasst. Von jeder Klasse können Objekte gemäß der Datenstruktur erstellt und über die Methoden manipuliert werden. In einem imperativen Algorithmus gibt es Variable, die verschiedene Werte annehmen können. Die Menge aller Variablen und ihrer Werte sowie der Programmzähler beschreiben den Zustand zu einem bestimmten Zeitpunkt. Ein Algorithmus bewirkt eine Zustandstransformation. Ein Algorithmus heißt funktional, wenn die zugrunde liegende Berechnungsvorschrift mittels einer Sammlung von Funktionen definiert wird. Die Funktionsdefinitionen dürfen insbesondere Rekursionen und Funktionen höherer Ordnung enthalten. Rückblick und Ausblick A-1

Algorithmus von Euklid Der folgende, in einer imperativen Programmiersprache formulierte Algorithmus von Euklid berechnet den größten gemeinsamen Teiler der Zahlen x, y N mit x 0 und y > 0: a := x; b := y; while b # 0 do r := a mod b; a := b; b := r od Rückblick und Ausblick A-2

Algorithmus von Euklid Variable z 2 z 5 z 8 z 11 z 14 r 36 16 4 0 a 36 52 36 16 4 b 52 36 16 4 0 ggt(36, 52) = 4 Durchlaufene Zustände: z 0, z 1, z 2,..., z 14 Zustandstransformation: z 0 z 14 Rückblick und Ausblick A-3

Imperatives Programmieren In einem imperativen Programm gibt es Variable, die Werte speichern können. Die Variablen und ihre Werte legen den Zustand des Programms fest. Der Zustand ändert sich mit dem Ablauf des Programms. Die Wertzuweisung gestattet es, den Zustand zu verändern. Mit einer Sequenz können Anweisungen nacheinander ausgeführt werden. Die Selektion erlaubt die Auswahl zwischen Anweisungen. Anweisungen können mit der Iteration wiederholt werden. Eingabe-Anweisungen ermöglichen es, den Zustand von außen zu beeinflussen. Ausgabe-Anweisungen erstellen einen Ausdruck des Zustands (oder eines Teils davon). Rückblick und Ausblick A-4

Imperatives Programmieren Prozeduren: Abstraktionen von Anweisungen Funktionen: Abstraktionen von Ausdrücken Datentypen: Primitive Datentypen: boolean, char, int, real Zusammengesetzte Datentypen: enumeration, array, record, pointer Typdeklarationen: Abstraktionen von Datentypen Typsysteme können unabhängig von Paradigmen und Sprachen definiert und untersucht werden. Rückblick und Ausblick A-5

Imperatives Programmieren Weitere Kontrollstrukturen Module Ausnahmebehandlung Parallelverarbeitung Rückblick und Ausblick A-6

Algorithmus von Euklid imperative/iterative Formulierung: while b # 0 do r := a mod b; a := b; b := r od funktionale/rekursive Formulierung: ggt(a,b) = { a b = 0 ggt(b, a mod b) b 0 Rückblick und Ausblick A-7

Algorithmus von Euklid (Scheme, funktional) (define (ggt a b) (if (= b 0) a (ggt b (remainder a b)))) (ggt 36 52) > 4 Rückblick und Ausblick A-8

Funktionales Programmieren Ein funktionaler Algorithmus formuliert die Berechnungsvorschrift durch eine Menge von Funktionen. Die Funktionen können wechselseitig-rekursiv oder auch von höherer Ordnung (Funktionale) sein. Rückblick und Ausblick A-9

(define (inc n) (+ n 1)) (define (square x) (* x x)) (define (cube x) (* x x x)) Funktionen höherer Ordnung (define (sum f a next b) (if (> a b) 0 (+ (f a) (sum f (next a) next b)))) Rückblick und Ausblick A-10

(define (sum-square a b) (sum square a inc b)) (define (sum-cube a b) (sum cube a inc b)) > (sum-square 1 4) 30 > (sum-cube 1 4) 100 Rückblick und Ausblick A-11

Deduktive Algorithmen Ein deduktiver (logischer) Algorithmus führt Berechnungen durch, indem er aus Fakten und Regeln weitere Fakten, sogenannte Anfragen (Ziele), beweist. Fakten: P Regeln: P if Q 1 and Q 2 and... and Q k Regeln dieser Form werden auch Horn-Klauseln genannt. Fakten können als Regeln mit k = 0 gesehen werden. Die folgenden Beispiele wurden in der deduktiven Programmiersprache Prolog geschrieben. Rückblick und Ausblick A-12

Beispiel: Eingabe der Fakten und Regeln vater(johann,heinrich). vater(johann,thomas). vater(heinrich,carla). vater(thomas,erika). vater(thomas,klaus). vater(thomas,golo). vater(thomas,monika). vater(thomas,elisabeth). vater(thomas,michael). verheiratet(johann,julia). verheiratet(heinrich,maria). verheiratet(thomas,katia). mutter(x,y) :- vater(z,y), verheiratet(z,x). geschwister(x,y) :- vater(z,x), vater(z,y), X \= Y. Rückblick und Ausblick A-13

Beispiel: Eingabe der Anfragen Nachdem das Programm eingelesen wurde, können Anfragen gestellt werden, die von einer Interferenzmaschine, zum Beispiel einem Prolog-Interpreter, beantwortet werden. Anfragen werden nach der Eingabeaufforderung?- gestellt:?- geschwister(thomas, heinrich). true? ; no?- geschwister(thomas, golo). no Die Ausgabe true bedeutet, dass die Anfrage positiv beantwortet wurde, das heißt, dass Thomas und Heinrich Geschwister sind. Nach einem Fragezeichen erwartet der Interpreter Anweisungen, wie fortzufahren ist. Ein Semikolon ist die Aufforderung, nach weiteren Lösungen zu suchen. Rückblick und Ausblick A-14

Beispiel: Eingabe der Anfragen Falls eine Anfrage eine Variable enthält, werden alle Belegungen für die Variablen ermittelt, die die Aussage wahr werden lassen. Wenn wir die Geschwister von Golo suchen, stellen wir die folgende Anfrage.?- geschwister(x,golo). X = erika? ; X = klaus? ; X = monika? ; X = elisabeth? ; X = michael? ; no Erika, Klaus, Monika, Elisabeth und Michael sind also die Geschwister von Golo. Rückblick und Ausblick A-15

Beispiel: Eingabe der Anfragen Eine Anfrage kann mehr als eine Variable enthalten. Durch?- geschwister(x,y). werden insgesamt 32 Geschwisterpaare ermittelt, da Paare wegen der Symmetrie der Relation doppelt ausgegeben werden. Rückblick und Ausblick A-16

Algorithmus von Euklid (Prolog, deduktiv) ggt(a,0,a). ggt(a,b,z) :- U is A mod B, ggt(b,u,z).?- ggt(36,52,z). Z = 4? Rückblick und Ausblick A-17

Funktionen und Relationen Eine Funktion f : X Y ordnet jedem Element der Menge X (Definitionsbereich) genau ein Element der Menge Y (Wertebereich) zu: x f (x) Eine Relation R X Y besteht aus Paaren (x, y) X Y. Dabei kann es zu einem x X mehrere Elemente y Y mit geben. (x, y) R Rückblick und Ausblick A-18

Deduktives Programmieren Deduktives Programmieren beschäftigt sich mit Relationen und nicht mit Funktionen. Fakten und Regeln können als Eingabe von Relationen bzw. als Konstruktionsvorschriften für Relationen angesehen werden. Anfragen überprüfen, ob Paare in einer bestimmten Relation stehen oder ermitteln solche Paare: Eine Anfrage der Form P(x, y) überprüft, ob x und y bezüglich P in Relation stehen. Die Anfrage P(X, y) berechnet alle x mit (x, y) P. Anfragen der Form P(X, Y ) führen zur Ausgabe aller Paare (x, y) mit (x, y) P. Rückblick und Ausblick A-19

Deklaratives Programmieren In deklarativen Programmiersprachen wird aus einer nach bestimmten Regeln gebildeten mathematischen Formulierung eines Problems automatisch ein Programm erzeugt. Die formale Problembeschreibung kann z. B. auf der Prädikatenlogik (logische Programmiersprachen) oder dem λ-kalkül (funktionale Programmiersprachen) basieren. Deklarative Programmiersprachen haben sich vom Konzept der ausführenden Maschine gelöst. Rückblick und Ausblick A-20

.. Entwicklung der Programmiersprachen 2000 C#. Programmiersprachen in der Informatikausbildung 1995 JAVA 1990 1985 1980 1975 1970 1965 1960 1955 SCHEME (standard) C++ OCCAM CSP ADA SMALLTALK80 MODULA 2 SCHEME C PROLOG PASCAL LOGO ALGOL68 SIMULA PL/I BASIC COBOL ALGOL LISP FORTRAN Algol Algol68 Modula-2 Scheme Java Rückblick und Ausblick A-21

Programmiersprachen Imperative Programmiersprachen: Cobol, Fortran, PL/I, Basic, Algol, Algol68, Pascal, Modula-2, C, Ada Funktionale Programmiersprachen: Lisp, Scheme, ML, Haskell, Scala. Die Sprache Scala ist eine Erweiterung von Java. Objektorientierte Programmiersprachen: C++, Eiffel, Smalltalk, Java, C#, Oberon Logische Programmiersprachen: Prolog Skriptsprachen, Spezialsprachen Rückblick und Ausblick A-22

Bisherige Entwicklung von Java 1992 1995 Java-Vorläufer, zuerst unter dem Namen Oak. Neu: Applets (little applications) Jan. 1996 JDK 1.0 (Java Development Kit) Anfang 1997 JDK 1.1 Dez. 1998 JDK 1.2, wurde Jan. 1999 umbenannt in Java 2 Plattform Mai 2000 Java 2, JDK 1.3 Februar 2002 Java 2, JDK 1.4 Ende 2004 Java 2, JDK 5.0 (interne Versionsnummer: 1.5.0) Tiger Dezember 2006 Java Standard Edition 6 ( Mustang ) Juli 2011 Java Standard Edition 7 ( Dolphin ) Rückblick und Ausblick A-23

Java 8 Eigentlich sollte Java 8 im September 2013 veröffentlicht werden. Den genauen Termin hat der verantworliche Ingenieur Mark Reinhold bei Oracle jetzt auf den 18. März 2014 festgelegt. Die folgenden Aussagen zu Java 8 erfolgen ohne Garantie. Rückblick und Ausblick A-24

Fragestellung: Statischer/dynamischer Scope Wie lautet die Ausgabe des folgenden Programms? public class Test { static int x=7; static void p() {x=0;} // x ist eine globale Variable. public static void main(string[] args) { int x=5; p(); System.out.println(x); } } Statischer Scope: Ausgabe: 5, Dynamischer Scope: Ausgabe: 0. Die Semantik der Methode p hängt also davon ab, wie die globale Variable x genommen wird. Wir wissen: Java gibt die 5 aus. Rückblick und Ausblick A-25

Java 8 Die wichtigste Erweiterung ist das Projekt Lambda. Das Ziel dieses Projektes ist die Einführung von Closures. Damit wird die Bedeutung von globalen Variablen definiert. Globale Variable können vielfältiger als das obige Beispiel sein. Funktionale Schnittstellen sind Schnittstellen, die genau eine abstrakte Methode enthalten. Abstrakte Klassen mit einer abstrakten Methode zählt man nicht zu den funktionalen Schnittstellen. Schnittstellen sollen auch statische Methoden enthalten können. Eine wichtige Erweiterung sind Lambda-Ausdrücke. Ein Lambda-Ausdruck ist ein Literal, das eine funktionale Schnittstelle implementiert, ohne der Funktion einen Namen zu geben. Die API muss erweitert werden: Lambda, Java Collections Framework,... Rückblick und Ausblick A-26

Closures Friedrich Esser: Ein Closure ist ein Block (bzw. eine Einheit) von Code, der freie Variable aus der Umgebung, genauer dem umgebenden Scope zur Berechnung des Ergebnisses mit einbezieht. Abhängig von der Art der freien Variablen, gibt es Closures, deren Ergebnisse nur von ihren Argumenten abhängen, da die freien Variablen immutable sind. Ergebnisse mit den mutablen Werten der freien Variablen variieren. Leider wird Closure je nach Autor oder Sprache ein wenig anders interpretiert. Rückblick und Ausblick A-27

Scala Scala ist eine hybride Sprache: imperativ, objektorientiert, funktional. SCAlable LAnguage Scala wird in der Schweiz entwickelt. Leiter: Martin Odersky. Scala-Programme können Java-Archive (jars) verwenden und umgekehrt. Rückblick und Ausblick A-28

Ist Java 8 der Todesstoß für Scala? Will Java 8 kill Scala? Wir erinnern uns alle noch zu gut: Als Scala damals vorgestellt wurde und die Entwickler-Gemeinde Gefallen an der Sprache fand, unkte man schon, Scala würde Java bald beerben. Und dabei war Scala nicht die einzige JVM-Sprache, die als»java-killer«bezeichnet wurde (siehe z.b. Ceylon). Jetzt scheint sich der Spieß allerdings umzudrehen, denn mit Java 8 hat die Programmiersprache dank Lambda-Expressions, Methodenreferenzen, Functional Interfaces und Co. einen enormen Sprung in Richtung mehr Produktivität und Leistungsfähigkeit gemacht. Und schon fragen sich Entwickler wie Ahmed Soliman in seinem Blog: Will Java 8 kill Scala? Oder rücken die beiden Sprachen nicht eher näher zusammen? (Claudia Fröhling, 27. März 2014) Rückblick und Ausblick A-29