Programmierparadigma

fundamentaler Programmierstil
Dies ist eine alte Version dieser Seite, zuletzt bearbeitet am 20. Februar 2006 um 22:04 Uhr durch 141.35.17.32 (Diskussion). Sie kann sich erheblich von der aktuellen Version unterscheiden.

Ein Programmierparadigma ist das einer Programmiersprache oder Programmiertechnik zugrundeliegende Prinzip.

Grundlegend für den Entwurf von Programmiersprachen sind die Paradigmen der imperativen Programmierung und der deklarativen Programmierung. Beim letzteren sind als wichtige Ausprägungen die Paradigmen der funktionalen Programmierung und der logischen Programmierung zu nennen. Alle weiteren Programmierparadigmen sind Verfeinerungen dieser Prinzipien.

Zum Beispiel folgt die Programmiersprache Java dem Paradigma der objektorientierten, die Programmiersprache C++ ermöglicht objektorientierte Programmierung und prozedurale Programmierung, beide Sprachen entsprechen dem Paradigma der imperativen Programmierung und ermöglichen generische Programmierung.

Hybridsprachen wurden entwickelt um dediziert in mehreren Paradigmen zugleich zu programmieren.

Neben den Programmierparadigmen gibt es noch eine Reihe weiterer Kriterien für die Entwicklung einer möglichst fehlerfreien und wartbaren Software wie z. B. Lesbarkeit des Programmcodes, Redundanzfreiheit, Modularität und Nebenwirkungsfreiheit. Diese sollten unter jedem Paradigma soweit wie möglich eingehalten werden. Die besondere Leistung der Programmierparadigmen besteht gerade darin, die Einhaltung dieser Basiskriterien zu vereinfachen, nahezulegen oder mehr oder weniger zu erzwingen - im günstigsten Fall automatisch zu realisieren.

Oft kann an den „Bürgern erster Klasse“ („First Class Citizens“ – FCCs) einer Programmiersprache – also den Formen von Daten, die direkt verwendet werden können – erkannt werden, welchem Paradigma die Sprache gehorcht. In Java (objektorientiert) zum Beispiel sind Objekte FCCs, in LISP (funktional) ist jedes Stück Programm FCC, in Perl sind es Zeichenketten, Arrays und Hashes.

Die Aufgabenstellung wird als lineare bzw. sequentielle Befehlsabfolge formuliert, wobei der Kontrollfluss mit bedingten Sprüngen gesteuert werden kann. Die Befehle manipulieren dabei den Zustand der Speicherbereiche oder Speichermedien, die die zu verarbeitenden und die auszugebenden Daten enthalten. Daher kann man sie auch als Zustandsorientierte Programmierung bezeichnen.

Die Programmierung mit abstrakten Datentypen behandelt Daten und Funktionen zur Behandlung dieser Daten als Einheit.

Bei der modularen Programmierung wird die Software in logische Teilblöcke zerlegt, die einzeln geplant, programmiert und getestet werden können. Praktisch alle Programmierparadigmen verwirklichen implizit oder explizit das Prinzip, neben anderen Prinzipien, des modularen Programmierens. Sie unterscheiden sich gerade darin, nach welchem Grundprinzip (Paradigma) das Gesamtprogramm in Module aufzuteilen ist, wie die Module aufgebaut sind und wie sie miteinander kommunizieren.

Die normierte Programmierung beschreibt den Versuch einer standardisierte Ablaufsteuerung eines Datenverarbeitungsprogramms. Normierte Programmierung ist eine verallgemeinerte Programmablaufsteuerung, die die Teilaufgaben eines Stapelprogrammes wie Dateneingabe, Gruppenkontrolle, Verarbeitung, Ausgabe in ein einheitliches, logisch klares, funktionelles Schema gliedert. Dieses Schema lässt sich unabhängig von der Aufgabenstellung und unabhängig von der Programmiersprache für alle kommerziellen Computerprogramme anwenden.

Bei der objektorientierten Programmierung (OOP) wird ein Computerprogramm als eine Menge interagierender Objekte realisiert.

Die Aufgabenstellung wird in kleinere Teilaufgaben, "Prozeduren", zerlegt, die dann einzeln im Kalkül der imperativen Programmierung (s.o.) implementiert werden.

Strukturierte Programmiersprachen zeichnen sich durch den Verzicht oder zumindest die Einschränkung absoluter Sprunganweisungen (Goto) und durch zusätzliche Kontrollstrukturen wie z.B. do...while, while, repeat...until aus.

Die Idee einer deklarativen Programmierung ist ursprünglich als Gegensatz zur imperativen Programmierung hervorgegangen. Die Grundidee besteht darin, nicht mehr wie beim imperativen Paradigma zu beschreiben, wie etwas zu geschehen hat bzw. was zu tun ist, sondern nur noch welches Ergebnis gewünscht ist. Es sollte also nicht mehr der Lösungsweg programmiert werden, sondern nur noch angegeben werden, welches Ergebnis gewünscht wird. Aus diesem Grundgedanken sind die funktionale Programmierung und die logische Programmierung entstanden.

Bei der Constraintprogrammierung werden sog. Constraints (math. Gleichungen, Bedingungen) definiert. Sie wird als natürliche Weiterentwicklung der logischen Programmierung verstanden. Logische und Constraintprogrammierung werden typischerweise in Kombination eingesetzt.

Die Aufgabenstellung und die bekannten Prämissen werden hier als funktionaler Ausdruck formuliert. Das selbstständige Anwenden von Funktionsersetzung und Auswertung seitens des Interpreters oder Compilers lösen dann die Aufgabenstellung. Das Programm kann als Abbildung der Eingabe auf die Ausgabe aufgefasst werden.

Die Aufgabenstellung und ihre Prämissen werden als logische Aussagen (Regeln) formuliert (vgl. funktionale Programmierung, s.o.). Der Interpreter versucht dann, die gewünschte Lösungsaussage mit Hilfe des Horn-Verfahrens herzuleiten. (Siehe auch Horn-Klauseln) z.B. Prolog Bei anderen regelbasierte Sprachen wie OPS-5, XSLT oder Prolog werden Regeln gegen eine Datenmenge auf ihre Instanziierbarkeit geprüft. Aus allen Regelinstanziierungen wird eine (mehrere, alle) ausgewählt und die zur Regel gehörenden Anweisungen werden ausgeführt.

Sonstiges

Bei der agentenorientierten Programmierung steht der Begriff des autonomen und planenden Agenten im Vordergrund, der selbstständig und in Kooperation mit anderen Agenten Probleme löst.

Bei der aspektorientierten Programmierung wird der objektorientierte Begriff der Klasse zum Aspekt erweitert und ermöglicht so orthogonale Programmierung.

Generative Programmierung ist ein Überbegriff für die programmatische Erzeugung von Sourcecode (Siehe Buch , Generative Programming , Krzysztof Czarnecki, W.Eisenecker)

In der generischen Programmierung wird versucht die Algorithmen für mehrere Datentypen verwendbar zu gestalten.

Die Subjektorientierte Programmierung ist eine Erweiterung der objektorientierten Programmierung. Sie soll vor allem die Schwächen der objektorientierten Programmierung bei der Entwicklung großer Anwendungen und der Integration unabhängig entwickelter Anwendungen ausgleichen.

Es wird von einem kontinuierlichen Datenfluss ausgegangen (meist Audio- oder Videodaten), der (oft in Echtzeit) verändert und ausgegeben wird.