Imperative Programmierung: Das älteste Programmierparadigma im Überblick
Ob bei der App-Entwicklung, der Programmierung von Maschinen oder der Entwicklung von Unternehmens-Software: Bevor die erste Zeile Code geschrieben wird, muss der Entwickler die Entscheidung treffen, welche Programmiersprache zum Einsatz kommen soll. Die Auswahl möglicher Programmiersprachen ist groß. Doch jede von ihnen lässt sich zwei grundlegend verschiedenen Programmierparadigmen zuordnen: der imperativen Programmierung und der deklarativen Programmierung. Beide Herangehensweisen haben Vor- und Nachteile.
Was zeichnet imperative Programmiersprachen aus? Welche Schwächen müssen Entwickler berücksichtigen? Wir beantworten die wichtigsten Fragen zum imperativen Paradigma in diesem Artikel.
Was ist imperative Programmierung?
Die imperative Programmierung (von lateinisch imperare = befehlen) ist das älteste Programmierparadigma. Gemäß diesem Paradigma besteht ein Programm aus einer klar definierten Abfolge von Handlungsanweisungen an einen Computer.
Der Quellcode imperativer Sprachen reiht also Befehle aneinander, die festlegen, was wann vom Computer zu tun ist, um ein gewünschtes Ergebnis zu erzielen. In Variablen eingesetzte Werte werden dabei zur Laufzeit des Programms verändert. Um die Befehle zu steuern, werden Kontrollstrukturen wie Schleifen oder Verzweigungen in den Code integriert.
Die imperativen Programmiersprachen sind sehr konkret und arbeiten nah am System. Der Code ist damit einerseits leicht verständlich, andererseits werden viele Zeilen Quelltext benötigt, um zu beschreiben, was sich in Sprachen der deklarativen Programmierung mit einem Bruchteil der Befehle erreichen lässt.
Die bekanntesten imperativen Programmiersprachen:
- Fortran
- Java
- Pascal
- ALGOL
- C
- C#
- C++
- Assembler
- BASIC
- COBOL
- Python
- Ruby
Die verschiedenen imperativen Programmiersprachen lassen sich wiederum drei weiteren, untergeordneten Programmierstilen zuordnen: dem strukturierten, dem prozeduralen und dem modularen Programmierstil.
Der strukturierte Programmierstil erweitert das imperative Grundprinzip um die konkreten Kontrollstrukturen Sequenzen, Selektion (Auswahl) und Iteration (Wiederholung). Hintergrund ist die Eindämmung bzw. komplette Vermeidung von Sprunganweisungen, die imperativ konzipierten Code unnötig kompliziert machen.
Der prozedurale Ansatz unterteilt die Aufgabe, die ein Programm übernehmen soll, in kleinere Teilaufgaben, die im Code einzeln beschrieben werden. So entstehen Programmierbausteine, die auch in anderen Programmen weiterverwendet werden können. Einen Schritt weiter geht das modulare Programmiermodell, bei dem die einzelnen Programmkomponenten gänzlich unabhängig voneinander entworfen, entwickelt und getestet werden. Erst abschließend bilden die einzelnen Module in Kombination die eigentliche Software.
Deklarative vs. imperative Programmierung
Imperative Programmiersprachen unterscheiden sich von deklarativen Sprachen in einem grundlegenden Aspekt. In einem Satz zusammengefasst: Imperative Programmierung fokussiert sich auf das WIE, deklarative Programmierung auf das WAS.
Was ist damit gemeint? Imperative Programmiersprachen sind wie eine Schritt-für-Schritt-Anleitung (Wie) für den Computer verfasst. Sie beschreiben explizit, welche Schritte in welcher Reihenfolge ausgeführt werden sollen, damit am Ende die gewünschte Lösung steht. In der deklarativen Programmierung wird dagegen direkt das gewünschte Endergebnis (Was) beschrieben. Zur Anschaulichkeit auf die Küche übertragen: Imperative Sprachen liefern Rezepte, deklarative Sprachen Fotos vom fertigen Gericht.
In deklarativen Sprachen bleibt der Quellcode sehr abstrakt bezüglich des konkreten Vorgehens. Um zur Lösung zu gelangen, wird ein Algorithmus eingesetzt, der passende Methoden automatisch findet und anwendet. Diese Vorgehensweise hat zahlreiche Vorteile: Programme lassen sich so nicht nur deutlich schneller schreiben, die Anwendungen sind auch sehr einfach zu optimieren. Denn wird in Zukunft eine neue Methode entwickelt, kann der Algorithmus aufgrund der abstrakten Anweisung im Quellcode einfach auf die neuere Methode zugreifen.
Imperative Programmierung – ein Beispiel
Imperative Programmiersprachen zeichnen sich durch ihren anleitenden Charakter aus und benötigen damit in der Regel wesentlich mehr Zeilen Code, um das auszudrücken, was sich in deklarativen Stil mit wenigen Anweisungen beschreiben lässt. Im folgenden Beispiel soll eine Liste mit Vornamen ausgegeben werden:
Imperative Programmierung (PHP)
$teilnehmerListe = [1 => 'Peter', 2 => 'Hans', 3 => 'Sarah'];
$vornamen = [];
foreach ($teilnehmerListe as $id => $name) {
$vornamen[] = $name;
}
Deklarative Programmierung (PHP)
$vornamen = array_values($teilnehmerListe);
Vor- und Nachteile imperativer Programmiersprachen
Heute werden viele Programmiersprachen eingesetzt, die auf dem Paradigma der imperativen Programmierung basieren.
Das ist einerseits der Tatsache geschuldet, dass diese Herangehensweise die ursprüngliche Form des Programmierens ist. Andererseits hat das imperative Paradigma trotz alternativer Modelle immer noch praktische Vorteile.
Die Sprachen sind verhältnismäßig leicht zu lernen, da der Code wie eine Schritt-für-Schritt-Anleitung zu lesen ist. Programmierer lernen in ihrer Ausbildung daher in der Regel zunächst eine imperative Sprache.
Die leichte Lesbarkeit ist im Unternehmensalltag ein entscheidender Faktor: Schließlich sollen Wartung und Optimierung von Anwendungen nicht personenabhängig sein, sondern unkompliziert von unterschiedlichen Mitarbeitern übernommen werden können, selbst wenn sie den Code nicht von Grund auf geschrieben haben.
Nachteil der prozeduralen Programmierung: Sollen komplexere Probleme gelöst werden, wächst der Code sehr schnell an. Er bleibt zwar gut lesbar, wird jedoch aufgrund seiner Größe unübersichtlich.
Da die Ausführung nicht wie im deklarativen Stil klar von der Programmierung getrennt ist, können beim nachträglichen Eingreifen leicht unerwünschte Nebeneffekte bzw. Fehler produziert werden. Auch Erweiterungen lassen sich im rein imperativen Code schwieriger implementieren – anders als im deklarativen Paradigma, in dem diese über Methoden getrennt hinzugefügt werden.
Vorteile | Nachteile |
---|---|
Leicht lesbar | Code wird schnell sehr umfangreich und damit unübersichtlich |
Verhältnismäßig leicht zu erlernen | Risiko von Fehlern bei der Bearbeitung ist höher |
Für Einsteiger leicht nachvollziehbares Denkmodell (Lösungsweg) | Wartung blockiert Anwendungsentwicklung, da die Programmierung systemnah stattfindet |
Charakteristika von speziellen Anwendungsfällen können berücksichtigt werden | Optimierung und Erweiterung ist schwieriger |
In der Praxis kommen heute meist Mischformen der Paradigmen zum Einsatz, da sowohl imperative als auch deklarative Programmierstile Vor- und Nachteile mit sich bringen. Zunehmend setzt sich dabei allerdings der deklarativen Programmierstil durch, der um imperative Methoden ergänzt wird.