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.
Imperativ:
Imperative Sprachen haben folgende grundlegende Eigenschaft gemeinsam:
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