Grundzüge der Informatik 1 Teil 1: Einführung 1.5 Programmierparadigmen Prof. Dr. Max Mühlhäuser FG Telekooperation TU-Darmstadt Agenda • Was sind Programmierparadigmen? • Die wichtigsten Programmiersprachentypen – – – – – – – – – – Maschinensprachen Maschinenorientierte Sprachen Imperative Programmiersprachen (Pascal, C) OOP (folgt in Teil 2) Funktionale Programmiersprachen (LISP) Logische Programmiersprachen (PROLOG) Domänenangepasste Programmiersprachen (COBOL, VHDL) Verteilte / Parallele Programmiersprachen (OCCAM) Skriptsprachen (Perl, Python, PHP) Strukturbeschreibende Sprachen (HTML, SGML als Obermenge) – Datenbank-Sprachen (Mengenbasierte Sprachen; SQL) 2003 © MM ... GdI1-1.5: Programmierparadigmen 2 Was sind eigentlich Programmierparadigmen? • Paradigma = Denkmuster, übergeordnetes Prinzip • Programmierparadigma = grundlegende Ansätze, wie man Computer durch Programmierung steuern kann • Beispiel 1: wie modelliert man einen Sachverhalt? – Durch Vererbung, Klassen, Attribute und Methoden (OOP) – Durch Datenhaltung, Funktionen und Befehle (imperativ) – Durch Regeln, Fakten und Schlussfolgerungen (logisch) • Beispiel 2: wie berechnet man eine Funktion? – Durch die Abarbeitung von Befehlen (imperativ, OOP) – Durch die Anwendung weiterer, komplexer oder primitiver Funktionen (funktional) – Durch die Anwendung von Schlussfolgerungen (logisch) 2003 © MM ... GdI1-1.5: Programmierparadigmen 3 Programmierparadigmen • Programmiersprachen werden in drei Paradigmen eingeteilt: – Imperativ mit den Unterformen • Klassisch prozedural • Objektorientiert – Funktional (applikativ) – Regelbasiert / Logisch • Im folgenden stellen wir die drei Grundparadigmen vor • Anschließend werden einige typische Vertreter der verschiedenen Programmiersprachentypen vorgestellt 2003 © MM ... GdI1-1.5: Programmierparadigmen 4 Imperatives Programmierparadigma • Auch „von-Neumann-Paradigma“ genannt • Hauptkonzepte: – Ein Programm ist eine Folge von elementaren Schritten – Ein typischer elementarer Schritt ist die Wertzuweisung – Die Speicherung von Daten erfolgt in Variablen • Die Reihenfolge der Schritte ergibt sich aus… – Kontrollstrukturen wie • • • • 2003 © MM ... Sequenzen (…; …;) Alternativen (if, switch) Schleifen (for, while, do…while) Sprünge und Unterprogrammaufrufe (goto, call / x() ) GdI1-1.5: Programmierparadigmen 5 Imperatives Programmierparadigma • Es gibt zwei wesentliche Unterformen der imperativen Programmierung • Klassische prozedurale Programmiersprachen sind stark vorgehensorientiert – Mache erst dies, dann jenes; rufe folgende Methode auf; … – Typische Vertreter: Pascal, C, Fortran, Maschinensprachen • Objektorientierte Programmiersprachen basieren auf kooperierenden und interagierenden Elementen – Jede Klasse bietet Dienste (Methoden) an – Jedes Objekt kann Dienste auf sich ausführen oder andere Objekte mit der Ausführung von Diensten beauftragen – Typische Vertreter: Simula 67, Smalltalk, C++, Java 2003 © MM ... GdI1-1.5: Programmierparadigmen 6 Maschinensprachen • Älteste Form der Programmierung der Großcomputer • Die Programmierung beruht auf der richtigen Anordnung der Nullen und Einsen zum „Füttern“ des Computers • Die Programme wurden in der Regel auf Lochstreifen codiert und entsprechend eingelesen • Schwer zu programmieren: exakte Kenntnis der Bitcodes erforderlich! • Extrem fehleranfällig – ein einziger Bitfehler kann das Programm nicht lauffähig machen oder „ruinieren“ 2003 © MM ... GdI1-1.5: Programmierparadigmen 7 Maschinenorientierte Sprachen • Maschinenorientierte Sprachen vereinfachen die Programmierung gegenüber der Maschinensprache • Statt Bitmustern werden Textbefehle verwendet – meist abgekürzt, z.B. auf 3-5 Zeichen („Mnemonics“) – Speicher via Bezeichner (statt Adresse) benennbar (~Variablen?) • Ein „Assembler“ übersetzt die Textbefehle in entsprechende Bitfolgen • Wesentlich komfortabler als Maschinensprache • Dennoch wird weiterhin direkt der Prozessor („Maschine“) programmiert • Für verschiedene Prozessortypen gibt es verschiedene Assembler – z.B. Intel x86-Linie versus Motorola G4 2003 © MM ... GdI1-1.5: Programmierparadigmen 8 Maschinenorientierte Sprachen • Vorteile: – Maschinensprachennah – daher optimierbar – Nur sehr geringer Abstraktionsgrad Ablauf unmittelbar erfassbar • Nachteile: – Abhängig vom Prozessor verschiedene Sprachnotation, daher sind Programme nicht auf andere Prozessoren übertragbar – Geringer Abstraktionsgrad erfordert viel „Handarbeit“ – Aufwändiges Testen der Programme erforderlich • Beispielbefehle (Motorola MC680x0): – MOVE – ADD 2003 © MM ... &15, %d0 # Wert 15 in Datenregister 0 schreiben &45, %d0 # Wert 45 zu Datenregister 0 addieren GdI1-1.5: Programmierparadigmen 9 Imperative Programmiersprachen • Standardvertreter: Pascal, C, diverse BASICs • Ein Programm besteht aus – Variablendeklarationen, – Funktionen (Ergebnis[-typ]) und/oder Prozeduren – und einem „Hauptprogramm“, das die Bearbeitung startet • Vorteil: sehr einfach zu lernen für Anfänger • Nachteile: – keine gute Modellierung „unserer Welt“ – oft geringe Wiederverwendbarkeit • Daher wurden imperative Programmiersprachen seit den 90ern von Objektorientierung weitgehend verdrängt 2003 © MM ... GdI1-1.5: Programmierparadigmen 10 Objektorientierte Sprachen • Betrachten wir in Teil 2 genauer anhand von Java! • Andere gängige Vertreter: – C++ • • • • Objektorientierte Erweiterung von C Mehrfachvererbung, Generische Datentypen (Templates) Teilweise schneller als Java Geringere Sicherheit: Beliebige Umwandlungen von Datentypen und direkter Speicherzugriff möglich • Speicher muss von Hand angefordert und freigegeben werden • Große Teile von MS Windows und KDE sind in C++ programmiert – Smalltalk • • • • hier gibt es keine primitiven Datentypen; alles ist ein Objekt! die Typisierung von Objekten bei Deklaration entfällt Dynamische Erzeugung von Klassendefinitionen zur Laufzeit Sehr guter Debugger erlaubt auch Codeänderung zur Laufzeit – Eiffel • Sehr saubere Spezifikationen, unter anderem von Schleifeninvarianten 2003 © MM ... GdI1-1.5: Programmierparadigmen 11 Funktionales Programmierparadigma • Ein Programm ist eine Menge von Funktionen • Funktionen bilden Eingabewerte in Ausgabewerte ab • Eine Funktion entsteht durch die Zusammensetzung anderer Funktionen – Eine Menge an Grundfunktionen ist bereits vorgegeben • Ein Programm wird „ausgeführt“, indem eine Funktion auf Eingabewerte angewendet wird – Diese Funktion ruft in der Regel weitere Funktionen auf • Die gängigste Datenstruktur ist die Liste • Typische Vertreter: LISP, ML, Haskell, HOPE – Auch der Editor XEmacs verwendet einen LISP-Dialekt („E-LISP“) – Mit E-LISP ist der Editor weitreichend umprogrammierbar – LISP-Dialekte finden sich auch in anderen Umgebungen, etwa dem Open-Source Projekt GIMP („GNU Image Manipulation Program“) 2003 © MM ... GdI1-1.5: Programmierparadigmen 12 Funktionale Programmiersprachen • Beispiel aus E-LISP: (defun faculty (n)) (cond ((< n 0) -1) ; Fallunterscheidung ((= n 0) 1) ; 0! = 1 t (* n faculty (- n 1)) ; n! = n*(n-1)! ) ; Ergebnis = Letzter berechneter Wert ) sind vordefinierte Funktionen • Es gibt im wesentlichen nur zwei Aspekte: • *, <, =, -, t – Funktionsdefinitionen (Abstraktion) – Funktionsanwendung (Applikation) 2003 © MM ... GdI1-1.5: Programmierparadigmen 13 Regelbasiertes Programmierparadigma • Ein Programm besteht aus einer Menge von Regeln • Eine Regel ist in einem bestimmten Zustand anwendbar • Die Daten liegen in einer „Datenbasis“ vor – – Anfangs enthält die Datenbasis die Eingabedaten Zum Schluss enthält die Datenbasis die Ergebnisdaten • Jeder „Programmschritt“ ist eine Regelanwendung: 1. 2. 3. 4. Suche Regel(n), die im aktuellen Zustand anwendbar Falls keine Regel anwendbar ist, beende das Programm Wähle eine der Regeln und wende sie an Weiter bei 1. • Anzutreffen meist in Produktionssystemen 2003 © MM ... GdI1-1.5: Programmierparadigmen 14 Logisches Programmierparadigma • Das Logische Paradigma ist eine Unterform des Regelbasierten Paradigmas • Ein Programm besteht hier aus zwei Elementen: – Fakten (gesichertes Wissen oder Startwerte) – Regeln (um von Fakten auf neue Fakten zu schließen) • • • • Ein Programmschritt ist die Anwendung einer Regel Eine Programmausführung ist die Beantwortung einer Anfrage Zur Abarbeitung ist die aktuell passende Regel zu finden Durch Ersetzungen von Platzhaltern werden die Werte bestimmt • Typischer Vertreter: PROLOG (Programming in Logic) – Fakten: Prädikate – Regeln haben die Form Prädikat <- Prädikat1, Prädikat2 2003 © MM ... GdI1-1.5: Programmierparadigmen 15 Logisches Programmiersprachen • Ein Beispiel aus PROLOG (Programming in Logic): Mutter (Annika, Fabian). Fakt: Annika ist Mutter von Fabian Mutter (Sabine, Annika). Fakt: Sabine ist Mutter von Annika Ahne(X, Y) <- Mutter(X, Y). Regel 1: Ist X Mutter von Y, ist X auch eine Ahne von Y Ahne(X, Y) <- Ahne(X, Z), Mutter(Z, Y). Regel 2: Ist X eine Ahne von Z und Z Mutter von Y, so ist auch X eine Ahne von Y. • Die Anfrage „?Ahne(X, Fabian)“ liefert – True: X = Annika, X = Sabine • Bitte beachten: die Regel „Ahne“ ist rekursiv und findet daher auch die Ur-Ur-Ur-Ur-Urgroßmutter – Jedenfalls wenn genügend Fakten vorhanden sind! 2003 © MM ... GdI1-1.5: Programmierparadigmen 16 Domänenangepasste Programmiersprachen • Diese Sprachen wurden für eine bestimmte Aufgabe oder Anwendungsgebiet entwickelt • Beispiele: – COBOL (Wirtschaftswesen inkl. Zinsrechnung) – VHDL (Hardwarebeschreibungssprache zum Entwurf von Mikrochips und elektronischen Schaltungen) – FORTRAN (Mathematisch präzise Berechnungen mit allen Finessen wie komplexen Zahlen oder mehr als 100 Stellen) • In der Regel lassen sich die Sprachen einem bestimmten Programmierparadigma zuteilen – Meistens Imperativ / Prozedural 2003 © MM ... GdI1-1.5: Programmierparadigmen 17 Verteilte / Parallele Programmiersprachen • Vereinfachung der Entwicklung von verteilten oder parallel laufenden Programmen oder Methoden • Vertreter sind beispielsweise – OCCAM (gängig auch in der Hardwarebeschreibung) – PVM („Parallel Virtual Machine“) • Programme: kooperierenden Prozesse (Prozess-Netz) – einfachster Fall: ein Prozess pro Prozessor / Rechnernetzknoten – auch mehrere Prozesse pro Prozessor erlaubt • Zu den Aufgabengebieten zählt die Spezifikation – – – – – Welche und wie viele Prozesse auf den Daten arbeiten Welcher Prozess wann welche Daten sehen soll Woher und wohin Eingabe- bzw. Ausgabedaten fließen Wie die Arbeit auf die Prozesse zu verteilen ist Wie das Gesamtergebnis aus Einzelergebnissen entsteht 2003 © MM ... GdI1-1.5: Programmierparadigmen 18 Skriptsprachen • Meist kompakte, einfach zu lernende Sprachen • Oftmals können die Programme in andere Kontexte eingebettet werden, z.B. in HTML-Seiten • In vielen Kontexten anzutreffen – teilweise „versteckt“ • Einige Vertreter: – – – – Perl und Python (mit „Tausenden von Methoden“) PHP (eingebettet, aber versteckt auf WWW-Seiten) JavaScript (eingebettet, aber sichtbar auf WWW-Seiten) AnimalScript (Beschreibung von Animationsinhalten, siehe http://www.animal.ahrgr.de) • Die TK-WebSeiten nutzen PHP z.B. bei „Publikationen“ – Im Hintergrund wird eine Datenbank abgefragt – Aus den Abfrageergebnissen entsteht dynamisch die WWW-Seite 2003 © MM ... GdI1-1.5: Programmierparadigmen 19 Strukturbeschreibende Sprachen • Ursprung in elektronischer Textverarbeitung: – „Markups“: Ergänzungen von Text um Struktur-, LayoutInformation • Primär: Erfassung der logischen Struktur der Inhalte – Layout sollte separiert werden (Ziel: Bildschirm? Buch? …) • Beispiele: – SGML (Standard Generalized Markup Language) – HTML (Layout von WWW-Seiten; „Dokumenttyp“ von SGML) – XML (Strukturierung von Daten; Vereinfachung von SGML) • Bemerkungen zu HTML: – ursprünglich „wilde“ Mischung von Struktur- und Layout-Befehlen – Bp.: „emphasis“ (hervorheben, bitte), „italic“ (kursiv schreiben!) – neuere Versionen besser (Verhalten der Autoren nicht immer ☺ ) 2003 © MM ... GdI1-1.5: Programmierparadigmen 20 Datenbank-Sprachen • • • • Sprachen zur Abfrage / Änderung von Datenbankinhalten Gängigster Vertreter ist SQL (Structured Query Language) Befehle sind in der Regel mengenorientiert Beispiel: SELECT Autor, Titel, Jahr FROM Publikationen WHERE Titel LIKE '%rithm%'; • Ergebnis: Autor, Titel und Jahr aller Publikationen mit „rithm“ im Titel – „C. Chaplin“, „Der Algorithmusbegriff im Wandel der Zeiten“, 1912 – „G. Rößling“, „Algorithm Visualization“, 2003 – … 2003 © MM ... GdI1-1.5: Programmierparadigmen 21