Einleitung / Kontext


... [Informatikseminar 2002] ... [Thema Paradigmenvergleich] ... [Beispiele in Haskell und Java]

Übersicht:


Der Begriff Paradigma stammt vom griechischen Wort paradeigma (Beispiel, Muster) und wird heutzutage im meist wissenschaftlichen Kontext für Regelsysteme und (grundl.) Modelle verwendet. Hier betrachten wir Berechnungsparadigmen moderner Programmiersprachen, also das grundlegende Modell, das die Berechnung in der jeweiligen Programmiersprache beschreibt.


Grundsätzlich unterscheiden wir das imperative, funktionale (applikative) und logische Paradigma (siehe Skizze). Eine Untermenge der imperativen Sprachen bilden die Objekt-Orientierten Sprachen, zu denen auch Suns Java gehört. Das ebenfalls hier betrachtete Haskell lässt sich den (rein) funktionalen Sprachen zuordnen. Ein Beispiel für logische Programmierung ist die Sprache Prolog, wird hier aber nicht weiter betrachtet.

Kurzcharakterisierung:

Imperativ:

Imperative Sprachen haben folgende grundlegende Eigenschaft gemeinsam:

  1. Sequentielle Ausführung von Instruktionen
  2. Verwendung von Variablen zur Darstellung von Speicherwerten
  3. Verwendung von Zuweisungen zum Ändern des Wertes einer Variablen

Oft werden Programmiersprachen von der ihnen zugrundeliegenden Computerarchitektur beeinflusst. Bei der imperativen Programmierung schlägt sich der sog. von-Neumann-Flaschenhals nieder, der ein Problem insbesondere im Hinblick auf parallele/nichtdeterministische Berechnungen darstellt.

Charakteristisch für imperative Sprachen ist die Beschreibung der Berechnung durch das "wie", also wie der Computer das gegebene Problem durch Anwenden der einzelnen Instruktionen das Problem löst. Später dazu mehr.

Beispiele: Pascal, C, alle objektorientierten Sprachen

Funktional:

Funktional Programme stützen sich auf den mathematischen Begriff der Funktion. Ein Programm besteht vollständig aus Funktionen, die u.U. andere Funktionen aufrufen. Hier steht das "Was" im Vordergrund, also was das Programm berechnen soll, eine präzise Spezifikation des Problems.
Das funktionale Paradigma kennt keine Zuweisungen. Variablen, einmal zugewiesen, ändern ihren Wert nicht. Somit sind sie in gewisserweise 'konstant', weshalb der Begriff 'Bezeichner' hier besser zu verwenden ist. Variablen stellen also keine Speicherplätze dar, sondern stehen immer ausschliesslich für ihren Wert, ähnlich den Bezeichnern in der Mathematik. Sie haben also eine Wertsemantik, im Gegensatz zur Speichersemantik imperativer Berechnungsmodelle.
Eine Funktion kann somit nie einen anderen Effekt haben, als ihr Ergebniss zu berechnen. Dadurch dass die keine Zustandstransformationen auf dem globalen Speichermodell durchführt, kann sie keine Seiteneffekte haben, was einen grossen Teil der Programmierfehler von vornerein ausschliesst. Eine Funktion ist so, relativ zu ihren Parametern, konstant und deterministisch. Daraus ergibt sich auch, dass die Reihenfolge der Auswertung von Funktionen nicht relevant ist.
Das Programm schreitet durch das Anwenden von Funktionen voran ('applikativ').

Beispiele: Haskell, Lisp, Miranda

Logisch:

Das logische Paradigma stützt sich auf den Begriff der symbolischen Logik. Ein Programm ist eine Menge von Anweisungen, die beschreiben, was über ein bestimmtes Ergebniss war ist. Logische Programmiersprachen bezeichnet man auch als 'sehr hohe' Programmiersprachen. Sie werden hier nicht weiter betrachtet.

Beispiel: Prolog.

Objekt-Orientiert:

Objektorientierte Sprachen (OO-Sprachen) zählen zu den imperativen Sprachen. Sie stützen sich auf den Begriff des Objekts, als Konstrukt zum Zusammenfassen von Speicherplätzen und den zugehörigen Operationen (Methoden) darüber. Information Hiding ist das Prinzip: Einfachstes Beipiel ist eine Variable mit Get/Set-Methoden.
Das Programm schreitet im Prinzip durch Transormation des Zustands von Objekten voran. Das macht sie quasi zum 'Gegenteil' der funktionalen Programmierung.

Beispiele: Java, Smalltalk, Eiffel.

weiter mit Beispielen in Haskell und Java


... [Informatikseminar 2002] ... [Thema Paradigmenvergleich] ... [Beispiele in Haskell und Java]