Wikipedia · einfach zusammengefasst · Stand
Imperative Programmierung
Imperative Programmierung (lateinisch imperare ‚anordnen', ‚befehlen') ist ein Programmierparadigma, nach dem „ein Programm aus einer Folge von Anweisungen …
Inhalt5 Abschnitte
Grundidee und Bedeutung
Imperative Programmierung ist ein Programmierparadigma, bei dem ein Programm aus einer Folge von Anweisungen besteht. Diese Anweisungen legen fest, in welcher Reihenfolge was vom Computer getan werden soll. Der Entwickler beschreibt also Schritt für Schritt, wie eine Aufgabe ausgeführt wird.
Dieses Paradigma ist das am längsten bekannte Programmierparadigma und war wegen des begrenzten Sprachumfangs früher Programmiersprachen lange die klassische Art des Programmierens. Es liegt vielen Programmiersprachen zugrunde, zum Beispiel ALGOL, BASIC, Fortran, Pascal, Ada, PL/I, Cobol, C und allen Assemblersprachen.
In der Literatur gibt es abweichende Bezeichnungen: Das Konzept wird zum Teil „imperativ/prozedural“, „algorithmisch“ oder „zustandsorientiert“ genannt. „Prozedurale Programmierung“ wird manchmal synonym verwendet, kann aber auch enger als „Verwendung von Prozeduren“ verstanden werden.
Merkmale und Ausführungsmodell
Ein zentrales Merkmal imperativer Programmierung ist, dass im Quellcode festgelegt wird, was in welcher Reihenfolge und wie zu tun ist. Die Ausführung schreitet schrittweise von Befehl zu Befehl fort, etwa nach dem Prinzip: zuerst dies tun, danach jenes tun.
Zur Steuerung der Ausführung nutzt der Entwickler Kontrollstrukturen. Dazu gehören die Sequenz, also die normale Abfolge von Anweisungen, Schleifen zur wiederholten Ausführung und bedingte Verzweigungen, bei denen Anweisungen nur unter bestimmten Bedingungen ausgeführt werden.
Das abstrakte Ausführungsmodell ist eng an die Ausführung von Maschinencode auf Computern mit Von-Neumann-Architektur angelehnt. Der Programmzustand ergibt sich aus Daten im Arbeitsspeicher und aus Systemvariablen wie Registern oder Befehlszählern. Viele imperative Sprachen sind Abstraktionen der Assemblersprache.
Zustand, Variablen und Kontrollfluss
In imperativen Programmen spielt der Zustand des Programms eine wichtige Rolle. Aus einfacher Sicht wird dieser Zustand durch den Inhalt des Speichers bestimmt. Zuweisungen führen Operationen auf Informationen im Speicher aus und speichern Ergebnisse dort zur späteren Verwendung.
Höhere imperative Sprachen erlauben komplexere Ausdrücke, die zum Beispiel arithmetische Operationen und Funktionsauswertungen kombinieren können. Das Ergebnis eines solchen Ausdrucks kann wieder einer Speicherstelle, meist über eine Variable, zugeordnet werden.
Schleifen wie While-Schleifen, Do-while-Schleifen und For-Schleifen führen eine Folge von Anweisungen mehrmals aus. Sie können eine festgelegte Anweisungsfolge wiederholen oder so lange laufen, bis sich eine Bedingung ändert. Bedingte Verzweigungen führen Anweisungen nur aus, wenn eine Bedingung erfüllt ist; sonst werden sie übersprungen. Unbedingte Verzweigungen übertragen die Ausführung an eine andere Stelle im Programm. Dazu gehören Sprunganweisungen, Switch sowie Unterprogramme, Unterroutinen oder Prozeduraufrufe, die normalerweise nach dem Aufruf zur nächsten Anweisung zurückkehren.
Blöcke ermöglichten in höheren Programmiersprachen, mehrere Anweisungen und Deklarationen wie eine einzige Anweisung zu behandeln. Zusammen mit Unterprogrammen konnten dadurch komplexe Programme hierarchisch in einfachere prozedurale Strukturen zerlegt werden.
Abgrenzung zu deklarativer Programmierung
Der wichtigste Gegenentwurf zur imperativen Programmierung ist die deklarative Programmierung. Bei deklarativer Programmierung wird im Quellcode beschrieben, was das Programm machen soll, aber nicht im Detail, wie es dies tun soll.
Für die Einordnung als imperativ reicht es nicht aus, dass ein Prozessor Maschinenbefehle physisch Befehl für Befehl ausführt, denn das geschieht unabhängig vom verwendeten Paradigma. Entscheidend ist vielmehr, dass ein Entwickler Code schreibt, der die einzelnen Schritte beschreibt, die der Computer zur Lösung der Aufgabe ausführen muss.
Deklarativ formulierte Anweisungen können von übergeordneten oder eingebundenen Systemkomponenten in ausführbare Maschinenbefehle umgeformt werden. Als Beispiel nennt der Artikel SQL-Kommandos: Komponenten eines Datenbankmanagementsystems interpretieren sie, erzeugen daraus Maschinencode und lassen diesen ausführen.
Viele Programmiersprachen unterstützen vor allem auch imperative Programmierung, darunter objektorientierte Sprachen wie C#, Visual Basic .NET, C++ und Java. Datenkapselung, also information hiding, wird in imperativen Sprachen häufig dadurch umgesetzt, dass Prozeduren, die eine logische Einheit bilden, in Modulen oder Paketen zusammengefasst werden.
Typisches Beispiel
Der Artikel vergleicht die Ausgabe der Quadratzahlen ungerader Zahlen von 3 bis 11 in imperativer und funktionaler Programmierung.
In C, einer imperativen Sprache, wird eine For-Schleife verwendet: Sie beginnt bei 3, erhöht die Variable i jeweils um 2 und läuft, solange i kleiner als 12 ist. In jedem Schleifendurchlauf wird i * i berechnet und ausgegeben. Die einzelnen Schritte, nämlich Startwert setzen, Bedingung prüfen, Quadrat berechnen, ausgeben und Zählvariable erhöhen, sind ausdrücklich im Programm angegeben.
Als funktionales Gegenbeispiel in Haskell steht: mapM_ print [ i^2 | i <- [3,5..11] ]. Hier wird stärker beschrieben, welche Werte verarbeitet werden sollen: die Quadrate der Zahlen aus der Liste 3, 5, ..., 11.