Gliederung Literatur Programmierung Herbert Kuchen Universität Münster Mo + Do 14:15 - 15:45, M1 Wintersemester 2010/2011 1 Gliederung Literatur Gliederung I. Einführung II. Objektorientierte Programmierung (in Java) III. Deklarative Programmierung (in Haskell/Curry) IV. Semantik von Programmiersprachen 2 Gliederung Literatur Literatur • Java: • G. Krüger, T. Stark: Handbuch der Java-Programmierung, Addison-Wesley, 2009. • Haskell: • M. Chakravarty, G. Keller: Einführung in die Programmierung mit Haskell, Pearson, 2004. • P. Pepper, P. Hofstedt: Funktionale Programmierung, Springer, 2006. • R. Bird: Introduction to Functional Programming using Haskell, Prentice Hall, 1998. • Semantik: • G. Winskel: The Formal Semantics of Programming Languages, MIT Press, 1993. 3 Einführung Teil I: Einführung Programmiersprache: “zur Festlegung der Arbeitsabläufe eines Rechners” Klassifikation nach Programmierniveau 1) Maschinensprachen (1. Generation) 2) Assemblersprachen (2. Generation) 3) Höhere Programmiersprachen (3. Generation) 4) 4GL-Sprachen (anwendungsbezogen, oft DB-Abfragen integriert) 4 Einführung von-Neumann-Rechnermodell Inhalt Adresse Programmzähler 0 27 42 1 03 01 2 18 42 ... ... 02 ... ... ... 00 Programm Speicher 42 Daten ... n-1 n laden CPU speichern Akku/Register verarbeiten 5 Einführung Maschinensprachen Programm: Folge von elementaren Befehlen bestehend aus Operationscode und Argument(en) Befehle für: • Transport zwischen Speicher und CPU (Laden, Speichern, . . . ) • arithmetische und logische Befehle (Addition, Konjunktion, . . . ) auf CPU-Registern • Sprungbefehle (bedingt/unbedingt, absolut/relativ) • ... 6 Einführung Beispiel: Maschinencode 27 |{z} 42 |{z} 03 |{z} 01 |{z} Zahl 1 inAkku Inhalt von addiere zu laden Adresse 42 Akku − Inhalt 18 |{z} 42 |{z} speichere Adresse 42 ... Akku − Inhalt beachte: verschiedene “Adressierungsarten” (abh. von Op.-Code) Eigenschaften: • sehr niedriges Programmierniveau • aufwändig, fehleranfällig, schwer modifizierbar • rechnerabhängig, nicht portierbar • in Praxis zur Programmierung nicht verwendet 7 Einführung Assemblersprachen • wie Maschinensprache, jedoch symbolische Namen für Op-Codes, Speicherplätze, Sprungmarken, . . . DEFINE x 42 Beispiel: LOAD x ADD 1 STORE x Eigenschaften: • sehr niedriges Programmierniveau • aufwändig, fehleranfällig, rechnerabhängig • leicht in Maschinensprache übersetzbar (nur die “versteht” der Rechner; → Assembler) • nur in Ausnahmefällen zur Programmierung verwendet 8 Einführung Höhere Programmiersprachen • heute in Praxis üblich Klassifikation nach Paradigmen a) imperative Programmiersprachen z.B. Pascal, C, Fortran, Modula, Ada, Basic, Algol, Cobol, PL/I, . . . ⊃ objektorientierte PS: z.B. Java, C++, C#, Eiffel, Smalltalk, Ada95, . . . • Grundidee: Programm bewirkt Speichertransformation (→ von-Neumann-Modell) • oft effizienter Bsp.: x := x + 1 9 Einführung Höhere Programmiersprachen (Fortsetzung) b) deklarative Programmiersprachen % funktionale PS: z.B. Haskell, Miranda, ML, Lisp, Scheme, Erlang, ... & logische PS: z.B. Prolog • Grundidee: ausführbare Spezifikation, “was statt wie” • höheres Programmierniveau, z.T. weniger effizient 10 Einführung Ziele der Programmierung • Korrektheit, Robustheit • leichte Wartbarkeit, Verständlichkeit, Testbarkeit durch geeignete Programmierkonzepte, Modularisierung, Strukturierung, geeignetes Layout, sprechende Namen (z.B. Variable “Gehalt” statt “x”), Kommentare,. . . • Effizienz durch geignete Datenstrukturen und Algorithmen(→ Informatik II) 11