Du bist hier: Startseite > Wissenswertes > Programmierparadigma

Programmierparadigma

Ein Programmierparadigma ist ein fundamentaler Programmierstil

Der Programmierung liegen verschiedene Prinzipien zugrunde. Diese sollen den Entwickler bei der Erstellung von "gutem Code" unterstützen, in manchen Fällen sogar zu einer bestimmten Herangehensweise bei der Lösung von Problemen zwingen, im günstigsten Fall automatisch realisiert werden.

Programmierparadigmen unterscheiden sich durch ihre Konzepte für die Repräsentation von statischen (wie beispielsweise Objekte, Methoden, Variablen, Konstanten) und dynamischen (wie beispielsweise Zuweisungen, Kontrollfluss, Datenfluss) Programmelementen.


Aspektorientierte Programmierung
Aspektorientierte Programmierung (AOP) ist ein Programmierparadigma für die objektorientierte Programmierung, um generische Funktionalitäten über mehrere Klassen hinweg zu verwenden (Cross-Cutting Concern). Logische Aspekte eines Anwendungsprogramms werden dabei von der eigentlichen Geschäftslogik getrennt. Typische Anwendungsbeispiele sind Transaktionsverwaltung, Auditfähigkeit und Loggingverhalten.

Ausnahmebehandlung
Eine Ausnahme oder Ausnahmesituation (engl. exception) bezeichnet in der Computertechnik ein Verfahren, Informationen über bestimmte Programmzustände – meistens Fehlerzustände – an andere Programmebenen zur Weiterbehandlung weiterzureichen. Kann in einem Programm beispielsweise einer Speicheranforderung nicht stattgegeben werden, wird eine Speicheranforderungs-Ausnahme ausgelöst. Ein Computerprogramm kann zur Behandlung dieses Problems dafür definierte Algorithmen abarbeiten, die den Fehler beheben oder anzeigen.

Hybridsprache
Als Hybridsprache, auch hybride Programmiersprache, wird eine Programmiersprache bezeichnet, deren Sprachumfang sowohl das Programmierparadigma der prozeduralen als auch der objektorientierten Programmierung sinnvoll unterstützt. Gelegentlich wird der Begriff auch weiter gefasst und bezeichnet Sprachen, die mehrere andere sich wesentlich unterscheidende Programmierparadigmen unterstützten, wie beispielsweise der deklarativen und imperativen Programmierung. Heutige Hybridsprachen wurden oft nicht als solche konzipiert sondern sind dadurch entstanden, dass eine ursprünglich zur prozedualen Programmierung gedachte Sprache um die Unterstützung der Objektorientierung ergänzt wurde. Die bekannteste derartige Hybridsprache ist die objektorientierte Sprache C++, die aus der für die prozedurale Programmierung konzipierten Sprache C entstanden ist und zu dieser weitestgehend aufwärtskompatibel ist.

Constraintprogrammierung
Die Constraintprogrammierung (engl.: Constraint Programming) ist ein Programmierparadigma, das seit Mitte der 1980er Jahre entwickelt wird und sich als natürliche Weiterentwicklung der logischen Programmierung versteht. Logische und Constraintprogrammierung werden typischerweise in Kombination eingesetzt, was zu einer erheblichen Steigerung der Ausdrucksstärke, Flexibilität und Effektivität der Paradigmen führt.

Cross-Cutting Concern
Cross-Cutting Concern (CCC) ist ein Begriff der Informatik, der im Kontext des Teile-und-Herrsche-Prinzips so genannte querschnittliche Belange einer Software bezeichnet, die deshalb nicht einfach modularisiert werden können, weil herkömmliche Modularisierungsansätze (insbesondere die Objektorientierung) nicht greifen. Meist sind es nichtfunktionale Anforderungen an Software wie etwa Sicherheitsaspekte, die bei konventioneller Programmierung quer verstreut über den gesamten Code realisiert werden − beispielsweise immer wiederkehrende Prüfungen der Form „darf dieser Code gerade ausgeführt werden?“. Die Aspektorientierte Programmierung (AOP) bietet die Möglichkeit, solchen Code zentral zu formulieren. Gleichzeitig müssen Regeln dafür angegeben werden, wie dieser Code automatisch an den richtigen Stellen eingewoben oder ausgeführt werden kann.

Deklarative Programmierung
Die deklarative Programmierung ist ein Programmierparadigma, bei dem die Beschreibung des Problems im Vordergrund steht. Der Lösungsweg wird dann automatisch ermittelt. Im Gegensatz zur imperativen Programmierung, bei der das Wie im Vordergrund steht, fragt man in der deklarativen Programmierung nach dem Was, das berechnet werden soll.

Feature Oriented Programming
Feature-orientierte Programmierung (FOP, engl. feature-oriented programming) ist ein Programmierparadigma zur Entwicklung von Software-Produktlinien. Grundlage der Feature-orientieren Programmierung sind Softwaremerkmale (Features), die bei Design und Implementierung als Elemente erster Ebene berücksichtigt werden. Features stellen Erweiterungen von Programmfunktionalität dar. Dabei unterscheiden sich Features von Cross-Cutting Concerns dahingehend, dass sie Anforderungen von Programmnutzern direkt widerspiegeln.

Funktionale Programmierung
Funktionale Programmierung ist ein Programmierparadigma, bei dem Programme ausschließlich aus Funktionen bestehen. Dadurch werden die aus der imperativen Programmierung bekannten Nebenwirkungen vermieden.

Generative Programmierung
Die Generative Programmierung ist ein besonderes Programmierparadigma bei der methodischen Softwareentwicklung. Charakteristisch für die generative Programmierung ist die automatische Erzeugung von Programmcode durch einen Generator.

Generische Programmierung
Generische Programmierung ist ein Verfahren zur Entwicklung wiederverwendbarer Software-Bibliotheken. Dabei werden Funktionen möglichst allgemein entworfen, um für unterschiedliche Datentypen und Datenstrukturen verwendet werden zu können. Die Implementierung erfolgt bei einigen Programmiersprachen durch das Konzept generischer Typen bzw. Templates – so gestalten sich dynamische Programmiersprachen, bei denen sich der Typ einer Variable zur Laufzeit ändern darf, durch ihre verallgemeinerte Polymorphie generisch. Von Sprachen, die solche Mechanismen bieten, sagt man auch, dass sie Generik erlauben. Wesentlich bei der generischen Programmierung ist, dass die Algorithmen nicht für einen bestimmten Datentyp geschrieben werden, sondern nur bestimmte Anforderungen an die Typen stellen. Das Prinzip wird auch parametrische Polymorphie genannt.

Grafische Programmiersprache
Als Grafische Programmiersprache (englisch visual programming language, VPL) bezeichnet man eine Programmiersprache, in der ein Programm, Algorithmus oder Systemverhalten durch grafische Elemente und deren Anordnung definiert wird.

Imperative Programmierung
Imperative Programmierung ist ein Programmierparadigma. Danach werden Programme so entwickelt, dass ein Programm aus einer Folge von Anweisungen besteht, die vorgeben, in welcher Reihenfolge was vom Computer getan werden soll. Die Bezeichnung geht auf lateinisch 'imperare' = 'anordnen, befehlen' zurück. Die imperative Programmierung ist das am längsten bekannte Programmierparadigma. Abweichende Bezeichnungen: In der Literatur wird dieses Entwicklungskonzept zum Teil auch 'imperativ/prozedural', 'algorithmisch' oder auch 'zustandsorientiert' genannt. Auch die Bezeichnung 'prozedurale Programmierung' wird zum Teil synonym verwendet, was jedoch abweichend auch mit 'Verwendung von Prozeduren' definiert wird.

Iterative Programmierung
Die iterative Programmierung (englisch to iterate = wiederholen) verwendet im Gegensatz zur rekursiven Programmierung keine Selbstaufrufe, sondern Schleifen (Wiederholungen von Anweisungen oder Anweisungsfolgen). Dadurch werden die typischen Stapelüberläufe verhindert, und die Programme werden schneller abgearbeitet, da die Methodenaufrufe (mit Kontextsicherung) entfallen. Prinzipiell lassen sich rekursive Algorithmen auch iterativ implementieren und umgekehrt; die rekursive Programmierung ist jedoch einfacher und leichter verständlich.

Lazy Evaluation
Lazy Evaluation bezeichnet in der Informatik eine Art der Auswertung von Ausdrücken, bei der das Ergebnis des auszuwertenden Ausdrucks nur so weit berechnet wird, wie es gerade benötigt wird. Ein Vorteil einer solchen Auswertungsstrategie ist Zeitersparnis, da Funktionsaufrufe ganz vermieden oder zumindest teilweise eingespart werden können. Außerdem gibt Lazy Evaluation dem Programmierer die Möglichkeit, unendliche Datenstrukturen zu verwenden. Ein Nachteil ist die erschwerte Fehlerbereinigung in Programmen, die lazy evaluiert werden. Oft ist nicht auf den ersten Blick nachvollziehbar, ob ein Ausdruck zu einem bestimmten Zeitpunkt bereits ausgewertet wurde. Dies ist insbesondere dann problematisch, wenn Funktionsaufrufe eine Nebenwirkung haben können.

Literate programming
Mit literate programming (engl., näherungsweise mit literarisches Programmieren übersetzbar) bezeichnet man das Schreiben von Computerprogrammen in einer Form, so dass sie vor allem für Menschen lesbar sind. Literate programming bedeutet technisch gesehen, dass sowohl die Dokumentation als auch der Quelltext des Programms in einer gemeinsamen Datei vorhanden sind. Spezielle Werkzeuge sorgen dafür, dass sowohl der Quelltext als auch die Dokumentation aus dieser Datei extrahiert werden können. Da die für den Menschen geschriebene Dokumentation im Vordergrund steht, ist die Reihenfolge der Programmausdrücke so ausgelegt, dass diese verständlich dokumentiert werden können.

Logische Programmierung
Logische Programmierung (Prädikative Programmierung) ist ein Programmierparadigma, das auf der mathematischen Logik beruht. Anders als bei der imperativen Programmierung besteht ein Logik-Programm nicht aus einer Folge von Anweisungen, sondern aus einer Menge von Axiomen, welche hier als eine reine Ansammlung von Fakten oder Annahmen zu verstehen sind. Stellt der Benutzer eines Logik-Programms eine Anfrage, so versucht der Interpreter die Lösungsaussage allein aus den Axiomen zu berechnen.

Modulare Programmierung
Modulare Programmierung ist ein Programmierparadigma. Der Ansatz sieht vor, Computerprogramme systematisch in logische Teilblöcke aufzuspalten, die Module genannt werden. Praktisch alle aktuellen imperativen Programmiersprachen erlauben die Umsetzung des modularen Ansatzes. Modulare Programmierung soll größere Softwareprojekte kontrollierbar und übersichtlich halten. Module können einzeln geplant, programmiert und getestet werden. Universelle Module müssen nur einmal programmiert und können wiederverwendet werden. Insofern ist eine Ähnlichkeit zur serviceorientierten Architektur (SOA) vorhanden. Wenn alle Module erfolgreich getestet sind, können diese Einzelteile logisch miteinander verknüpft und zu einer größeren Anwendung zusammengesetzt werden. Erst dann ist die Anwendung als gesamtes einsatzbereit. Mit der modularen Programmierung wurde der prozedurale Ansatz erweitert, indem Prozeduren zusammen mit Daten in logischen Einheiten zusammengefasst werden. Klassen sind Module und Grundelemente in der objektorientierten Programmierung.

Objektbasierte Programmierung
Unter objektbasierter Programmierung versteht man die Nutzung von Objekten, die durch die Programmierumgebung bereits definiert worden sind. In objektbasierten Programmierumgebungen stehen nicht unbedingt alle Möglichkeiten der objektorientierten Programmierung zur Verfügung. So gibt es in Microsoft Dynamics NAV unter der Programmiersprache C/AL z.B. keine Vererbung und keinen Polymorphismus - um nur einige der nicht unterstützten Merkmale objektorientierter Programmierung zu nennen.

Objektorientierte Programmierung
Die objektorientierte Programmierung (kurz OOP) ist ein auf dem Konzept der Objektorientierung basierendes Programmierparadigma. Die Grundidee besteht darin, die Architektur einer Software an den Grundstrukturen desjenigen Bereichs der Wirklichkeit auszurichten, der die gegebene Anwendung betrifft. Ein Modell dieser Strukturen wird in der Entwurfsphase aufgestellt. Es enthält Informationen über die auftretenden Objekte und deren Abstraktionen, ihre Typen. Die Umsetzung dieser Denkweise erfordert die Einführung verschiedener Konzepte, insbesondere Klassen, Vererbung, Polymorphie und spätes Binden.

Parallele Programmierung
Parallele Programmierung ist ein Programmierparadigma. Es umfasst zum einen Methoden, ein Computerprogramm in einzelne Teilstücke aufzuteilen, die nebenläufig ausgeführt werden können, zum anderen Methoden, nebenläufige Programmabschnitte zu synchronisieren. Dies steht im Gegensatz zur klassischen, sequentiellen (oder seriellen) Programmierung. Ein Vorteil der parallelen Programmierung ist neben möglicher Effizienzsteigerung (bspw. bei Nutzung mehrerer Prozessorkerne) die Möglichkeit, das typische Alltagsphänomen Nebenläufigkeit direkt in Programmen abzubilden, was zu einfacherem, verständlicherem Quelltext führen kann. Ein Nachteil ist, dass das Laufzeitverhalten paralleler Algorithmen schwieriger nachvollziehbar sein kann als das eines äquivalenten sequentiellen Algorithmus.

Prototypenbasierte Programmierung
Prototypenbasierte Programmierung, auch als klassenlose Objektorientierung bekannt, ist eine Form der Objektorientierten Programmierung, die auf das Sprachelement der Klasse verzichtet. Objekte werden nicht bei der Kompilation, sondern erst zur Laufzeit durch Klonen bereits existierender Objekte erzeugt. Bei diesem Klonen werden alle Eigenschaften (Attribute und Methoden) des Prototyp-Objektes kopiert, sie können aber überschrieben werden, und das neue Objekt kann mit neuen Eigenschaften versehen werden.

Prozedurale Programmierung
Prozedurale Programmierung ist ein Programmierparadigma, nach dem Computerprogramme entwickelt werden können. Die Bezeichnung ist nicht eindeutig; in der Literatur wird sie für verschiedene Bedeutungen verwendet:

  • als Erweiterung des imperativen Paradigmas um den Ansatz, Algorithmen in überschaubare Teile zu zerlegen, die anhand einer definierten Schnittstelle aufrufbar sind
  • innerhalb des imperativen Paradigmas als Gegenstück zur objektorientierten Programmierung


Referenzparameter
Referenzparameter (englisch call by reference oder pass by reference) sind Parameter von Unterprogrammen in Programmiersprachen, mittels derer ein Unterprogramm die übergebenen Argumente wie dessen übergeordnetes Programm verwenden und ändern kann. Jede Veränderung bleibt auch nach Verlassen des Unterprogramms erhalten, da keine Kopien für das Unterprogramm erzeugt werden. Der Nachteil hierbei besteht darin, dass eine ungewollte Beeinflussung von Hauptprogrammvariablen im Unterprogramm möglich ist. Der Name kommt daher, dass der Compiler in den meisten Programmiersprachen die Adresse des Speicherbereichs einer Variablen oder eines Feldelements übergibt (also einen Zeiger auf die Variable oder das Feldelement), die als Referenz (Verweis, Alias) aufgefasst werden kann.

Rekursive Programmierung
Bei der rekursiven Programmierung ruft sich eine Prozedur, Funktion oder Methode in einem Computerprogramm selbst wieder auf. Auch der gegenseitige Aufruf stellt eine Rekursion dar. Wichtig bei der rekursiven Programmierung ist eine Abbruchbedingung in dieser Funktion, weil sich das rekursive Programm sonst (theoretisch) unendlich oft selbst aufrufen würde. Rekursive Programmierung kann unter anderem in prozeduralen und objektorientierten Programmiersprachen angewandt werden. Obwohl diese Sprachen in ihrem Sprachstandard die Rekursion ausdrücklich zulassen, stellen Selbstaufrufe und gegenseitige Aufrufe hier (aufgrund der verwendeten Programmierparadigmen) jedoch eher die Ausnahme dar. Auch wenn in der Praxis zur Verbesserung des Programmierstils (Lesbarkeit / einfachere Implementierung) auch hier durchaus häufig auf Rekursion zurückgegriffen wird, sind die meisten Funktionen in diesen Sprachen doch rein iterativ.

Single-Responsibility-Prinzip
Das Single-Responsibility-Prinzip (SRP, dt. Eine-Verantwortlichkeit-Prinzip) ist eine Entwurfsrichtlinie in der Softwarearchitektur. In der objektorientierten Programmierung sagt das SRP aus, dass jede Klasse nur eine fest definierte Aufgabe zu erfüllen hat. In einer Klasse sollten lediglich Funktionen vorhanden sein, die direkt zur Erfüllung dieser Aufgabe beitragen.

Strukturierte Programmierung
Strukturierte Programmierung ist ein programmiersprachenübergreifendes Programmierparadigma, das Anfang der 1970er Jahre auch aufgrund der Softwarekrise populär wurde. Es beinhaltet zum einen die baumartige Zerlegung eines Programms in Teilprogramme (Prozeduren) und enthält somit das Paradigma der prozeduralen Programmierung. Zudem verlangt die strukturierte Programmierung auf der untersten Ebene die Beschränkung auf lediglich drei Kontrollstrukturen:

  • Sequenz (hintereinander auszuführende Programmanweisungen)
  • Auswahl (Verzweigung)
  • Wiederholung (Schleifen)

Die bekannteste Konsequenz dieses Prinzips ist die Vermeidung oder – abhängig von der Programmiersprache – der eingeschränkte und standardisierte Einsatz der Sprunganweisung, des GOTO. Das Ergebnis der häufigen Verwendung dieser Anweisungen wird häufig abfällig als Spaghetticode bezeichnet. Durch die konsequente Implementierung von Teilprogrammen und von Kontrollstrukturen vermeiden strukturierte Programme Codewiederholungen, was Vorteile bei der Suche von Programmfehlern mit sich bringt, die Programme kürzer und übersichtlicher macht und daher die Wartung von Software vereinfacht.

Typbibliothek
Eine Typbibliothek (engl.: type library) im Sinne der elektronischen Datenverarbeitung ist ein standardisierter Kommunikationsschlüssel (eine Schnittstellenbeschreibung) zum Zugriff auf die öffentlich zugänglichen Datenstrukturen und Unterprogramme eines fremden Dienstprogramms (Server), welche so durch viele andere Programme (Clients) anonym mitbenutzt werden können. Beispiele für das Verwenden von Typbibliotheken finden sich bei COM, dynamischen Laufzeitbibliotheken und den Metadatenbeschreibungen moderner Laufzeitsysteme.

Wertparameter
Wertparameter (engl. call by value oder pass by value) sind Parameter von Unterprogrammen, die Kopien der beim Aufruf übergebenen Argumente speichern. Neben Wertparametern stellen Programmiersprachen oft auch Referenzparameter zur Verfügung, die nur einen anderen Namen (Alias) für die übergebenen Argumente bilden und die Veränderung dieser erlauben können.