Grundlagen der Programmierung 2 (1.A)

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

Grundlagen der Programmierung 2 (1.A)

Grundlagen der Programmierung 2

Grundlagen der Programmierung 2 (1.A)

Grundlagen der Programmierung 2 (1.A)

Grundlagen der Programmierung 2. Operationale Semantik

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

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

Grundlagen der Programmierung 3 A

Einführung in die funktionale Programmierung

Einleitung Typsystem Typisierung Zusammenfassung Literatur. Typisierung. Effiziente Programmierung. Thomas Schnieders

Programmiersprachen: rekursives Programmieren in Haskell

Programmiersprachen: rekursives Programmieren in Haskell

ALP I Einführung in Haskell

12 Abstrakte Klassen, finale Klassen und Interfaces

Grundlegende Datentypen

Grundlegende Datentypen

Haskell for Hackers... or why functional programming matters

Funktionale Programmierung Grundlegende Datentypen

Programmiersprachen: rekursives Programmieren in Haskell

Repetitorium Informatik (Java)

Programmiersprachen: rekursives Programmieren in Haskell

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

Vorsemesterkurs Informatik

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

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

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

Einstieg in die Informatik mit Java

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

Listen und Listenfunktionen. Grundlagen der Programmierung 2 A (Listen) Listen und Listenfunktionen. Listen? Haskell: Listen

5.3 Auswertung von Ausdrücken

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

Stackmaschine; Speicheradressierung

Grundelemente objektorientierter Sprachen (1)

Grundelemente objektorientierter Sprachen (1)

1 Klassen und Objekte

II.1.1. Erste Schritte - 1 -

Grundlagen der Programmierung 2 A (Listen)

Vorlesung Datenstrukturen

Abschnitt 11: Korrektheit von imperativen Programmen

Grundlagen der Programmierung 2 (2.A)

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

Basiskonstrukte von Haskell

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

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

Übungs- und Praktikumsaufgaben zur Systemprogrammierung Dipl.-Ing. H. Büchter (Lehrbeauftragter) FH-Dortmund WS 2001/2002 / SS 2002

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

1 Funktionale vs. Imperative Programmierung

Neben der Verwendung von Klassen ist Vererbung ein wichtiges Merkmal objektorientierter

Java I Vorlesung Imperatives Programmieren

Typ-Polymorphismus. November 12, 2014

Klassen als Datenstrukturen

Einführung in Funktionale Programmierung. Klassifizierung von Programmierparadigmen und -sprachen. Einleitung & Motivation

Vorkurs Informatik WiSe 16/17

Programmieren I. Kapitel 5. Kontrollfluss

Haskell, Typen und Typberechnung

Ü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

Umsetzung einer Klassenkarte in einer Programmiersprache

1 Bedingte Anweisungen. 2 Vergleiche und logische Operatoren. 3 Fallunterscheidungen. 4 Zeichen und Zeichenketten. 5 Schleifen.

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

Einstieg in die Informatik mit Java

Grundlagen der Programmierung 2 (1.B)

II.1.1. Erste Schritte - 1 -

Übersicht. Vorstellung des OO-Paradigmas

Methoden und Wrapperklassen

14 Abstrakte Klassen, finale Klassen, Interfaces

Programmierung mit C Zeiger

3. Java - Sprachkonstrukte I

Objektorientierte Programmierung und Klassen

Einführung in die Funktionale Programmierung: Einleitung & Motivation

14 Abstrakte Klassen, finale Klassen, Interfaces. Auswertung von Ausdrücken. Beispiel. Abstrakte Methoden und Klassen

Welche Informatik-Kenntnisse bringen Sie mit?

Grundlagen der Informatik 0

2 Eine einfache Programmiersprache

Einführung IMP-Syntax Reduktionssemantik Maschinen-Semantik. Teil IV. Semantik imperativer Sprachen

14 Abstrakte Klassen, finale Klassen, Interfaces

II.1.1. Erste Schritte - 1 -

3.2 Datentypen und Methoden

2. Unterprogramme und Methoden

2 Eine einfache Programmiersprache

Klausur "ADP" SS 2016

ALP I. Funktionale Programmierung

! 1. Rekursive Algorithmen.! 2. Rekursive (dynamische) Datenstrukturen. II.3.2 Rekursive Datenstrukturen - 1 -

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 12/13. Kapitel 3. Grunddatentypen, Ausdrücke und Variable

Haskell, Typen und Typberechnung

Praktische Informatik 1

7. Übung Informatik II - Objektorientierte Programmierung

Einführung in die funktionale Programmierung

Grundlagen der OO- Programmierung in C#

3. Java - Sprachkonstrukte I

Transkript:

Grundlagen der Programmierung 2 (1.A) Prof. Dr. Manfred Schmidt-Schauÿ Künstliche Intelligenz und Softwaretechnologie 20. April 2006

Grundlagen der Programmierung 2: Geplanter Inhalt der ersten Hälfte Programmiersprachen: Paradigmen rekursives Programmieren in Haskell Ströme als unendliche Listen in Haskell Operationale Semantik: Haskell Sortieren, Suchen und Bäume Polymorphe Typen und Typklassen Parallele Berechnungen Grundlagen der Programmierung 2 (1.A) - 2 -

Bücher, Literatur, URLs http://www.cs.uni-frankfurt.de/ prg2 www.haskell.org Haskell-Website Manuel Chakravarty und Gabriele Keller Einführung in die Programmierung mit Haskell Richard Bird: Introduction to Functional Programming Using Haskell Grundlagen der Programmierung 2 (1.A) - 3 -

Interpreter / Compiler Interpreter Compiler (Übersetzer) Ablaufumgebung führt ein Programm aus, (bzw. wertet ein Programm aus), Grundlage: Text des Programms Jeder Programmbefehl wird einzeln eingelesen und dann ausgeführt. erzeugt aus Programm einen ausführbaren Modul. Programmumstellungen, Optimierungen Effekt des Programms muss gleich bleiben. Hier erfolgt die Ausführung des Programms Grundlagen der Programmierung 2 (1.A) - 4 -

Laufzeit / Compilezeit Compilezeit: Laufzeit: Zeitraum der Analyse bzw. Übersetzung des Programms statische Typüberprüfung, Optimierung. Zeitraum der Ausführung des Programms Z.B. dynamische Typüberprüfung, Ein-Ausgabe. Grundlagen der Programmierung 2 (1.A) - 5 -

Programmiersprachen: wesentliche Merkmale Syntax Beschreibung der Programme als Texte Semantik Beschreibung der Aktionen / Bedeutung eines Programms Grundlagen der Programmierung 2 (1.A) - 6 -

Programmiersprachen: wesentliche Merkmale imperativ Programm ist Folge von Befehlen sukzessive Änderung des Speicherinhalts Ergebnis: letzter Zustand Ein imperatives Programm sagt präzise: was (welche Anweisung), wann (Reihenfolge der Anweisungen) womit (Speicherplatz/Variable) zu geschehen hat. prozedural: Strukturierung in (imperativen) Programmiersprachen Prozedur = Unterprogramm Aufruf mit Argumenten im Programm Ziel: Übersichtlichkeit; Wiederverwendbarkeit Grundlagen der Programmierung 2 (1.A) - 7 -

Programmiersprachen: Merkmale (2) funktional: Programm ist strukturiert in Funktionsdefinitionen Ausdrücke = Anwendung von Funktionen auf Argumente Berechnung = Auswertung von Ausdrücken Ergebnis = Nur der Return-Wert Varianten von funktionalen Programmiersprachen: nicht-strikt: Argumente werden so spät wie möglich ausgewertet strikt: Argumente werden vor Funktionsaufruf ausgewertet pur: Objekte haben nur einen Wert, keine Mutation möglich nicht-pur: Objekte veränderbar, Seiteneffekte möglich deklarativ: Idealfall: Spezifikation = deklaratives Programm Betonung auf Logik, weniger algorithmisch Beispiele: logische Programmierung, Prolog Grundlagen der Programmierung 2 (1.A) - 8 -

Programmiersprachen: Merkmale (3) objektorientiert: Verwendung in imperativen Programmiersprachen Strukturierung des Programm in Klassen. Ziel: Übersichtlichkeit, Wiederverwendung Ausführung eines Programms: Erzeugung von Objekten Austausch von Nachrichten zwischen Objekten Grundlagen der Programmierung 2 (1.A) - 9 -

Programmiersprachen: Merkmale (4) typisiert Alle Programmiersprachen haben eine Typisierung statische Typisierung: Programmtext dynamische Typisierung: Ausführungszeit des Programms schwache Typisierung: Typfehler zur Laufzeit sind möglich starke Typisierung: Typfehler zur Laufzeit sind nicht möglich Grundlagen der Programmierung 2 (1.A) - 10 -

Beispiele für Programmiersprachen Haskell: Eine funktionale Programmiersprache funktional, nicht-strikt, hat ein polymorphes und starkes Typsystem, flexible Datenstrukturen, gute Abstraktionseigenschaften, Ziele: pures Programmieren, Auswerten von Ausdrücken rekursives Programmieren, Typsystem Python: Eine prozedurale Programmiersprache prozedural; schwaches, dynamisches Typsystem, flexible Datenstrukturen, Objektorientierung. Grundlagen der Programmierung 2 (1.A) - 11 -

Java zentrale Idee der Objektorientierten Programmiersprachen (OOP) : Objekt als Strukturierungskonzept. Objekte Kommunikation zusammengesetzte (Daten-)Einheit belegt Speicherplatz haben eine Identität. sind gekapselt. Veränderungen von Objekten werden stets mittels der definierten Methoden durchgeführt. gehören zu einer Klasse (Instanz einer Klasse) durch Senden/Empfangen von Nachrichten. Grundlagen der Programmierung 2 (1.A) - 12 -

Fahrzeugbeispiel: (1) class Fahrzeug { public double Hoechstgeschwindigkeit; private String Eigentuemer; private static long Anzahl; static { Anzahl = 0; } public static long Anzahl() { return Anzahl; } public Fahrzeug() { // Konstruktor: Anzahl = Anzahl + 1; } Grundlagen der Programmierung 2 (1.A) - 13 -

Java: Fahrzeugbeispiel } public Fahrzeug(double Hoechstgeschwindigkeit, String Eigentuemer) { Anzahl = Anzahl +1; this.eigentuemer = Eigentuemer; this.hoechstgeschwindigkeit = Hoechstgeschwindigkeit; } public double Hoechstgeschwindigkeit () { return Hoechstgeschwindigkeit ; } public void loesche_fahrzeug() { Anzahl = Anzahl - 1; } public String Eigentuemer () { return Eigentuemer; } Grundlagen der Programmierung 2 (1.A) - 14 -

Java: Fahrzeugbeispiel Grundlagen der Programmierung 2 (1.A) - 15 -

Java: Fahrzeugbeispiel class Auto extends Fahrzeug { public String Autokennzeichen; public Auto(double Hoechstgeschwindigkeit, String Eigentuemer, String kennzeichen) { super(hoechstgeschwindigkeit, Eigentuemer); this.hoechstgeschwindigkeit = Hoechstgeschwindigkeit; this.autokennzeichen = kennzeichen; } } Grundlagen der Programmierung 2 (1.A) - 16 -

OO: Klassen Klassen entsprechen Typschablonen werden in der OO-Programmiersprache definiert. enthalten die Definition der Struktur der zugehörigen Objekte und der Methoden, die auf Objekte dieser Klasse anwendbar sind. entsprechen einer Menge von Objekten mit gleichem Verhalten. i.a. eine Realisierung eines abstrakten Datentyps entsprechen einem Typ zur Compilezeit sind in einer (Baum-)Hierarchie angeordnet (Ober- ; Unterklasse) Die Klassenhierarchie wird verwendet, um allgemeine Aspekte von Objekten in einer Oberklasse zu definieren und zu implementieren, und dann in Unterklassen die spezielleren Eigenschaften zu implementieren. Elementare Datentypen (Zahlen,... ) sind keine Objekte können zu Objekten gemacht werden, falls nötig Vereinfachte Handhabung in Java 5 Grundlagen der Programmierung 2 (1.A) - 17 -

Vergleich mit Haskell Java Haskell Klasse entspricht Typ bzw. einer Typklasse Methode entspricht Funktion (bzw. Prozedur) Objekt entspricht konstruiertem Datenobjekt. Senden von Nachrichten entspricht Funktionsaufruf Seiteneffekte Nur Kopieren möglich Aliasing unproblematisch: keine Seiteneffekte Grundlagen der Programmierung 2 (1.A) - 18 -

Objekte und Methoden: Genauer Objekt Objekt besteht aus Daten; bzw. Attributen das Innere eines Objektes ist nicht direkt sichtbar. Attribute sind nur über erlaubte Methodenaufrufe änderbar das Innere des Objektes (seine Attribute) sichtbar und änderbar. gehören zu einer Klasse: ( Instanz einer Klasse) analog zu einem Record, bei dem die einzelnen Attribute mit Attributnamen ansprechbar sind. Satz (Verbund) in einer Datenbank, bestehend aus Attributen. n-tupel in Haskell mit Attributnamen Grundlagen der Programmierung 2 (1.A) - 19 -

Methoden Methoden: Methodenaufruf: Nachrichten: auf Objekten ausführbare Operationen, analog zu Prozeduren. Senden einer Nachricht Methode kann per Dot-Notation an ein Objekt gekoppelt sein bzw. wird auf ein Objekt angewendet. Argumente der Prozedur. Grundlagen der Programmierung 2 (1.A) - 20 -

Spezifische Aufgaben von Methoden: Konstruktion: Destruktion: Selektion: Modifikation: Andere Verarbeitung Erzeugen und Initialisieren eines Objekts Abschlussarbeiten und Löschen eines Objekts Lesen von internen Daten des Objekts Ändern der internen Daten des Objekts allgemeine Prozedur Grundlagen der Programmierung 2 (1.A) - 21 -

Logische Programmierung Grundlegende Idee: Genauer: Verwendung der Prädikatenlogik Hornlogik Programm besteht nur aus Formeln x 1,... x n.a 1... A n B (Hornklauseln) Schreibweise: B : A 1,... A n Grundlagen der Programmierung 2 (1.A) - 22 -

Logische Programmierung: Programmausführung Ausführung = Anfrage ist eine Formel: Antwort Ausführung: Beantwortung von Anfragen an das Programm y 1,... y m.c 1... C m entspricht einer negativen Hornklausel die möglichen Tupel y 1,... y m bzw Ja / Nein Schlussfolgern Grundlagen der Programmierung 2 (1.A) - 23 -

Logische Programmierung: Beispiel vater(peter,maria). mutter(susanne,maria). vater(peter,monika). frau(maria). frau(susanne). frau(monika). mann(peter). eltern(x,y) :- vater(x,y). eltern(x,y) :- mutter(x,y). Anfrage: Antwort: Anfrage: Antwort 1: Antwort 2: eltern(peter,maria)? Ja eltern(peter,x)? X = maria X = monika Grundlagen der Programmierung 2 (1.A) - 24 -

Haskell rekursive Programmierung mit der streng typisierten, funktionalen Programmiersprache Haskell Grundlagen der Programmierung 2 (1.A) - 25 -

Haskell Wichtige Eigenschaften funktionaler Programmiersprachen Referentielle Transparenz Gleiche Funktion, gleiche Argumente = gleicher (Rückgabe-)Wert Keine Seiteneffekte! D.h. keine Änderung von Objekten Verzögerte Auswertung Nur die für das Resultat notwendigen Unterausdrücke werden (so spät wie möglich) ausgewertet. Polymorphes Typsystem Nur Ausdrücke mit Typ sind erlaubt es gibt Typvariablen. Das Typsystem garantiert: keine dynamischen Typfehler. Automatische Speicherverwaltung Anforderung und Freigabe von Speicher Funktionen sind Datenobjekte mögliche Verwendung: in Datenobjekten, als Argument, als Resultat. Grundlagen der Programmierung 2 (1.A) - 26 -

Programmierung in Haskell Interpreter Hugs 98 und GHCi Grundprinzipien: Definition von Funktionen quadrat x = x*x Aufbau von Ausdrücken: Anwendung der Funktion auf Argumente, die wieder Ausdrücke sein können. 3*(quadrat 5) Nur der Wert von Ausdrücken wird bei der Auswertung zurückgegeben. 75 Grundlagen der Programmierung 2 (1.A) - 27 -

Umgang mit dem Interpreter Aufruf: ghci (im richtigen Fenster) Online-Report http://www.haskell.org/onlinereport >:h Hilfe >:t Ausdruck druckt den Typ des Ausdrucks >:set +t... Optionen ändern Module im Interpreter verwenden: :m +Char +Numeric... Grundlagen der Programmierung 2 (1.A) - 28 -

Einfache Daten und Operatoren ganze Zahlen Typ Int mit n 2 31 1 = 2147483647 beliebig lange ganze Zahlen (vom Typ Integer), rationale Zahlen 3%7 (Rational) Gleitkommazahlen 3.456e+10 (Float) Zeichen a Char Datenkonstruktoren True, False; Typ Bool Arithmetische Operatoren: +,,, /, Arithmetische Vergleiche: ==, <=, <... Logische Operatoren: &&,, not Grundlagen der Programmierung 2 (1.A) - 29 -

Beispiel Definition eines Polynoms x 2 + y 2 : quadratsumme x y = quadrat x + quadrat y Auswertung:... Main> quadratsumme 3 4 25 Grundlagen der Programmierung 2 (1.A) - 30 -

Typen in Haskell Typ Konstanten, Funktionen Int 1,2,3,4,... Integer 1,2,3,4,... Float 1.23e45 Double 1.23e45 Integer -> Integer -> Integer (+) Integer -> Integer quadrat Integer -> Integer -> Integer quadratsumme Grundlagen der Programmierung 2 (1.A) - 31 -

Typen in Haskell Beispiel Die Ausgabe des Interpreters für die Addition (+) ist komplizierter: (+) :: forall a. (Num a) => a -> a -> a D.h.: Für alle Typen a, die man als numerisch klassifiziert hat, d.h. die in der Typklasse Num sind, hat (+) den Typ a -> a -> a Z.B. gilt: (+)::Integer -> Integer -> Integer (+)::Double -> Double -> Double Grundlagen der Programmierung 2 (1.A) - 32 -

(vereinfachte) Haskell-Syntax FunktionsDefinition ::= Funktionsname Parameter = Ausdruck Ausdruck ::= Bezeichner Zahl ( Ausdruck Ausdruck ) ( Ausdruck ) ( Ausdruck BinInfixOp Ausdruck ) Bezeichner ::= Funktionsname Datenkonstruktorname Parameter BinInfixOp BinInfixOp ::= + / Argumente einer Funktion: Anzahl der Argumente: formale Parameter. Stelligkeit der Funktion: (ar(f)) Grundlagen der Programmierung 2 (1.A) - 33 -

Beispiel zur Grammatik quadratsumme x y = (quadrat x) + (quadrat y) quadratsumme Funktionsname x,y formale Parameter = gleiches Zeichen wie in Grammatik (quadrat x) + (quadrat y) Ausdruck der Form Ausdruck + Ausdruck + binärer Infix-Operator quadrat x Anwendung: quadrat ist ein Ausdruck und x ist ein Ausdruck Grundlagen der Programmierung 2 (1.A) - 34 -

Haskell: Verschiedenes... Prelude: vordefinierte Funktionen, Typen und Datenkonstruktoren Präfix, Infix, Prioritäten ist möglich für Operatoren Konventionen zur Klammerung: s 1 s 2... s n ((... (s 1 s 2 ) s 3...) s n ) Kontextbedingungen in Funktionsdefinitionen: formale Parameter müssen verschiedenen sein; Keine undefinierten Variablen im Rumpf! Weitere Trennzeichen: {, } Semikolon ; Layout-sensibel: bewirkt Klammerung mit {, }. Grundlagen der Programmierung 2 (1.A) - 35 -

Fallunterscheidung Syntax: if Ausdruck then Ausdruck else Ausdruck if, then, else sind reservierte (Schlüsselworte) und dürfen nicht als Funktionsnamen bzw. Parameternamen verwendet werden. Der erste Ausdruck ist eine Bedingung. Diese muss Typ Bool haben. Typisierung: if Bool... then typ else typ (if 1 then 1 else 2) ergibt einen Fehler Grundlagen der Programmierung 2 (1.A) - 36 -

Bedingungen, Arithmetische Vergleiche Die Infixoperatoren ==, <, >, <=, >=, /= haben den Typ: Integer -> Integer -> Bool Achtung: = ist reserviert für Funktionsdefinitionen, und let Boolesche Ausdrücke sind kombinierbar mit not,, && (nicht, oder, und) Konstanten sind True, False. Eine kompliziertere Bedingung: 3.0 <= x && x < 5.0 Grundlagen der Programmierung 2 (1.A) - 37 -

Darstellungen eines Programms Benutzer-Syntax: vom Programmierer benutzt Interne Syntax: Linearisierung ; entzuckerte Version; voll geklammert; alle Operatoren sind Präfix; kein Layout Ableitungsbaum (Herleitungsbaum): Vom Kompiler erzeugt Syntaxbaum: Eindeutige Darstellung des Programms in einem markierten Baum. Hierauf lässt sich eindeutig die Ausführung des Programms definieren. Grundlagen der Programmierung 2 (1.A) - 38 -

Syntaxbaum: Beispiele if x <= 0 then 1 else x*(quadrat (x-1)) ifthenelse <= 1 x 0 x app quadrat x 1 Grundlagen der Programmierung 2 (1.A) - 39 -

Syntaxbaum: Beispiele Zwei Syntaxbäume zu 1*2: 1 2 app app 2 1 Grundlagen der Programmierung 2 (1.A) - 40 -

Aufrufhierarchie und Rekursive Definitionen f, g, f i seien Haskell-definierte Funktionen. f referenziert g direkt, f referenziert g (indirekt), f ist direkt rekursiv, f ist rekursiv, Verschränkte Rekursion: wenn g im Rumpf von f vorkommt. wenn es Funktionen f 1,..., f n gibt, so dass gilt: f referenziert direkt f 1, f 1 referenziert direkt f 2,..., f n referenziert direkt g. wenn f sich selbst direkt referenziert. wenn f sich selbst (indirekt) referenziert. wenn f die Funktion g referenziert und g die Funktion f auch für allgemeinere Fälle Grundlagen der Programmierung 2 (1.A) - 41 -

Beispiel: Aufrufhierarchie quadrat x = x*x quadratsumme x y = (quadrat x) + (quadrat y) quadratsumme ruft direkt die Funktion quadrat auf, quadratsumme ruft direkt die (eingebaute) Funktion auf Die Funktion quadratsumme ist somit nicht rekursiv Grundlagen der Programmierung 2 (1.A) - 42 -