Programmiertechnik/Programmierparadigma

Aus SELFHTML-Wiki
Wechseln zu: Navigation, Suche

Ein Programmierparadigma ist eine Klassifizierung der Art bzw. Struktur der Programmierung. So gibt es Sprachen, in denen der Programmierer schreibt, WAS zu tun ist (deklarativ) und Sprachen, in denen das WIE beschrieben wird (imperativ). Dass dies grundlegende Unterschiede sind, leuchtet wohl ein. Trotzdem ist zu beachten, dass diese Klassifizierungen nicht immer eindeutig sind und viele Sprachen Elemente verschiedener Paradigmen aufweisen. Die Konzepte der unterschiedlichen Programmierparadigmen sollen hier kurz beschrieben werden, wobei es nicht das Ziel des Artikels sein soll, dem Leser genaue Vorstellungen von den Paradigmen zu verschaffen.

Deklarative Programmierung[Bearbeiten]

Deklarative Sprachen beschreiben lediglich das Ziel selbst. Die Realisierung wird vom so genannten Interpreter der Sprache übernommen. Dies hat den Vorteil, dass entsprechende Programme relativ klein sind und partielle Auswertung ermöglichen, wodurch theoretisch unendliche Datenstrukturen in ihnen enthalten sein können.

Im weiten Sinn zählen auch Transformationssprachen wie XSLT oder Abfragesprachen wie SQL zu den deklarativen Programmiersprachen. SQL ist hier wohl eines der bekanntesten Beispiele für deklarative Sprachen, obwohl auch hier zunehmend objektorientierte und prozedurale Elemente einfließen (PL/SQL und ähnliche Erweiterungen).

Der Begriff „deklarative Programmierung“ wird häufig als Überbegriff (unter anderem) für die logische, funktionale und prozedurale Programmierung vorgestellt.

Logische Programmierung[Bearbeiten]

Die logische Programmierung hat ihren Ursprung in der Forschung nach künstlicher Intelligenz. Entsprechende Programme sind aus Axiomen, also Regeln, und Fakten aufgebaut, welche, anders als bei deklarativen Programmiersprachen üblich, das Problem bzw. Ziel beschreiben, dessen Lösungsweg nicht vorgegeben ist. Als Beispiele bieten sich Verwandtschaftsbeziehungen an:

Fakten:

  • Paul ist Vater von Hans,
  • Louisa ist die Mutter von Hans,
  • Irene ist die Mutter von Louisa,

Regel:

  • Hans schenkt seiner Großmutter ein Bild.

Nun könnte die Frage sein: Wer bekommt das Bild von Hans?

Auch wenn dieses Beispiel wenig sinnvoll erscheint, gibt es doch eine Vorstellung von der Grundstruktur dieser Programme.

Das bekannteste und wohl auch beliebteste Beispiel einer logischen Sprache ist PROLOG, ein Programm, welches für die Forschung an künstlicher Intelligenz und der Entwicklung von Expertensystemen genutzt wird.

Funktionale Programmierung[Bearbeiten]

Unter funktionaler Programmierung versteht man die Strukturierung von Programmen als Reihe von Funktionen, die jeweils 0-n Ein- und Ausgaben haben. Besonders einfache Aufgaben kann man am leichtesten mit diesem Konzept bearbeiten.

Prozedurale Programmierung[Bearbeiten]

Prozedurale Programmierung bezeichnet die Programmierung von Algorithmen mittels einer sequentiellen Abfolge von Befehlen wobei im Gegensatz zur strukturierten Programmierung wiederverwendbare Teile in Funktionen (Prozeduren) ausgelagert werden.

Imperative Programmierung[Bearbeiten]

Imperative Sprachen beschäftigen sich mit dem tatsächlichen technischen Erreichen eines gewünschten Ziels. Beim Schreiben von imperativen Programmen werden also Befehle aneinandergereiht, wodurch bestimmte Funktionen erreicht werden. In dieses Paradigma sind zum Beispiel C, Pascal und weitere Sprachen einzuordnen.

Die imperative Programmierung ist wiederum ein Überbegriff für strukturierte, objektorientierte, prozedurale Programmierung und einige weniger bedeutende mehr.

Strukturierte Programmierung[Bearbeiten]

Strukturierte Programmierung ist die einfachste Art der imperativen Programmierung. Hier werden Befehle sequentiell ausgeführt und Algorithmen durch Kontrollstrukturen wie Schleifen oder bedingte Verzweigungen umgesetzt.

Objektorientierte Programmierung[Bearbeiten]

Gerade bei großen Projekten ist die objektorientierte Programmierung ein geeignetes Mittel, um einzelne Programmteile sauber zu verarbeiten. Dabei wird alles als Objekt angesehen. Jedes Objekt kann eigene Attribute (Eigenschaften) und Methoden haben. Attribute sind sozusagen Merkmale eines Objekts, etwa der Radius eines Kreises, während Methoden Funktionen sind, die an das Objekt gebunden sind, bspw. die Darstellung des Kreises. Oftmals werden Attribute als privat gekapselt, d. h. sie können nur durch Methoden des Objekts manipuliert werden.

Kreis = Objekt{
  radius,
  liniendicke,
  position = Objekt{
    x, y
  },
  darstellen(),
  schnittmenge(objekt)
}
meinKreis = new Kreis();

Von außen kann man bpsw. auf meinKreis.radius zugreifen, während innerhalb des meinKreis-Objekts this.radius (manchmal auch self.radius, je nach Sprache) diesen Wert zurückgibt.

Manche Sprachen bringen syntaktische Abkürzungen für das Konzept der Objektorientierung mit – aber auch ohne diese Abkürzungen kann man das Konzept umsetzen (was jedoch mehr Aufwand bedeutet).

Programmiersprachen[Bearbeiten]

Es gibt eine ganze Menge unterschiedlicher Programmiersprachen, die anhand bestimmter Kriterien eingeordnet werden können. Das in den meisten Fällen primäre Kriterium ist die Frage, ob ein Programm erst in Binärcode übersetzt (kompiliert) werden muss, bevor es ausgeführt werden kann oder im laufenden Betrieb interpretiert wird. Kompilierte Programme laufen, sofern sie erst einmal fertiggestellt sind, schneller; die Entwicklung hingegen wird jedoch normalerweise mit interpretierbaren Sprachen beschleunigt. Des Weiteren gibt es Systeme, die den für Menschen besser lesbaren Programmcode in einen Zwischencode übersetzen, der erst zur Laufzeit für das jeweilige System / den jeweiligen Prozessor übersetzt wird. Damit kombiniert man den Vorteil der Portierbarkeit (auch über Systemgrenzen hinaus) mit einem auf das ausführende System exakt abstimmbaren Laufzeit-Code. So erhält man unter Umständen einen noch schneller laufenden Code als dies mit einer direkten Kompilierung möglich ist, da diese mit Rücksicht auf die Lauffähigkeit auf älteren Modellen der selben Prozessorfamilie nicht immer alle neueren Optimierungen nutzen kann.

Das nächste Kriterium ist die Nähe bzw. Abstraktion zur eigentlichen Maschinensprache. Das nächste nach dem manuellen Bearbeiten der Binärdaten im Hex-Editor ist Assembler, bei dem jeder Prozessor-Befehl als kurze Buchstabenkombination aufgeführt ist. Das hat den Nachteil, dass das Programm an den Befehlssatz der jeweiligen CPU ausgerichtet ist, aber auch den Vorteil, dass es darauf optimal läuft. Kurz darauf folgt die Sprache C, Sprachen wie Forth über Java bis hin zu Scriptsprachen wie PHP, Python, Ruby, Lua und JavaScript oder Makrosprachen, die oftmals in Anwendungen eingebettet sind.

Weitere Kriterien sind die Hilfsmittel zur Objektorientierung, die eine Sprache erlaubt, sowie die Typen und der Grad der Typenfestlegung sowie die Systeme, die sie unterstützt.

All das tritt jedoch zurück hinter einen ganz wichtigen Punkt: der Umfang der mitgelieferten Funktionalität, sei es innerhalb der Syntax, interner oder externer APIs oder Bibliotheken, die ein System bereitstellt.