Sprunganweisung


Sprunganweisung

Eine Sprunganweisung oder ein Sprungbefehl dient in Programmiersprachen von Computerprogrammen dazu, die Ausführung an anderer Stelle fortzuführen, also Programmteile zu überspringen.

Bei einem Rücksprung wird das Programm an einer Stelle fortgesetzt, die vor der Stelle der Sprunganweisung liegt, sodass Teile des Programmcodes nochmal durchlaufen werden.

Die bekannteste Sprunganweisung ist das so genannte GOTO (von englisch go togehe zu oder gehe nach). Es ist in der Computerprogrammierung ein Befehl im Programmcode, der einen Sprung zu einer anderen Stelle im Programm bewirkt.

Inhaltsverzeichnis

Sprunganweisungen auf Maschinenebene

Im Unterschied zu den Hochsprachen spricht man hier häufiger von Sprungbefehlen als von Sprunganweisungen.

Mikroprozessoren kennen in der Regel sehr viele verschiedene Sprungbefehle. Diese kann man folgendermaßen unterscheiden:

  • bedingt/unbedingt: Der Sprung wird entweder immer ausgeführt oder nur wenn eine Bedingung erfüllt ist.
  • absolut/relativ: Im ersten Fall wird das Programm an der angegebenen Adresse fortgeführt, im zweiten Fall hingegen erfolgt der Sprung relativ zur aktuellen Position.

Eine besondere Form von Sprungbefehlen sind Unterprogramm-Aufrufe. Bei diesen wird zuerst die aktuelle Position auf dem Stack gespeichert und erst dann die Programmausführung an der neuen Adresse fortgeführt. Über Rücksprungbefehle kann später wieder an die ursprüngliche Position zurückgekehrt werden.

Sprunganweisungen auf Hochsprachenebene

In höheren Programmiersprachen ist eine Sprunganweisung eine Anweisung der Form

 goto markenname

oder

 if bedingung
   goto markenname

Im ersten Fall wird sie unbedingte Sprunganweisung, in zweiten bedingte Sprunganweisung genannt. Dabei steht markenname für den Namen einer Sprungmarke, die an einer anderen Stelle des Programms definiert ist. Bei der Abarbeitung des Programms wird an der Stelle fortgesetzt, an der die Sprungmarke steht.

Im Prinzip könnte man allein mit bedingten Sprunganweisungen und einigen Zusatzfunktionen für Datenein- und -ausgabe jeden Algorithmus programmieren. Die entstehenden Programme sind allerdings ab einer gewissen Größe unwartbar. In aktuellen Programmiersprachen werden explizit formulierte Sprunganweisungen deshalb selten verwendet. Stattdessen werden häufiger höherwertige Kontrollstrukturen (insbesondere Schleifen, Methodenaufrufe und bedingt ausgeführte Programmblöcke) eingesetzt.

GOTO-Varianten

In der maschinennahen Programmierung dient der GOTO-Befehl dazu, Unterprogramme aufzurufen; an eine Bedingung geknüpfte GOTO-Befehle ermöglichen Verzweigungen. In manchen Assemblersprachen heißt der entsprechende GOTO-Befehl jmp (als Abkürzung für englisch jumpSprung) oder BR (als Abkürzung für englisch to branchverzweigen').

In höheren Programmiersprachen (die ggf. auch eine Kleinschreibung erlauben) wird durch einen GOTO-Befehl entweder eine Code-Zeilennummer (zum Beispiel in alten BASIC-Dialekten) oder eine definierte Sprungmarke (Label, zum Beispiel in C oder Pascal) angesprochen.

Beispiel eines einfachen Programms mit GOTO in Pascal:

PROGRAM beispiel;
LABEL 10;
BEGIN
  10:
  writeln('Endlosschleife');
  GOTO 10;
END.

Das folgende Programmbeispiel (aus dem Essay Coding Style von Linus Torvalds[1]) zeigt die Verwendung eines GOTO-Befehls (goto out) in C:

int fun(int a)
{
     int result = 0;
     char *buffer = kmalloc(SIZE);
 
     if (buffer == NULL)
             return -ENOMEM;
 
     if (condition1) {
             while (loop1) {
                     ...
             }
             result = 1;
             goto out;
     }
     ...
out:
     kfree(buffer);
     return result;
}

In frühen Varianten älterer Programmiersprachen wie Fortran oder BASIC stellten GOTO-Befehle noch die wichtigste, wenn nicht die einzige Möglichkeit zur Programmierung von Verzweigungen dar; diese wurden deshalb auch zur Realisierung von Schleifen und Wenn-Dann-Bedingungen verwendet. Dies führte zu unübersichtlichem „Spaghetticode“.

Die Programmiersprache ALGOL führte 1960 [?] eigene Befehle wie while, for, if-else zur Programmierung von Schleifen und Wenn-Dann-Bedingungen ein. Diese Neuerungen wurden bald in andere Programmiersprachen übernommen und machten in den meisten Situationen GOTO-Befehle überflüssig (while als Ersatz für Rücksprünge und if als Ersatz für Vorwärtssprünge machen bei geeigneter Umstrukturierung eines jeden Programms die GOTO-Anweisung theoretisch überflüssig).

Die „strukturierte“ und die GOTO-Programmierung sind jedoch aus Sicht der theoretischen Informatik äquivalent; alle solchen Programme fallen in die Kategorie GOTO-Programme.

Auch in anderer Hinsicht sind die Befehle der strukturierten Programmierung mit dem GOTO äquivalent: Der Befehlssatz eines Prozessors enthält in der Regel keine explizite Unterstützung von Konstrukten wie while, repeat, for, if-else etc. Daher werden diese bei der Kompilierung eines Programms vom Compiler mittels GOTO-Befehlen nachgebildet. Die genannten Konstrukte bieten also keine neuen Möglichkeiten, sie sind jedoch sinnvoll, um menschenverständlichen und damit wartungsfreundlichen Code zu forcieren.

Umstrittene Verwendung von GOTO

1968 sprach sich Edsger W. Dijkstra in seinem Aufsatz Go To Statement Considered Harmful (der Titel geht allerdings auf N. Wirth zurück), für eine Abschaffung des GOTO-Befehls in allen höheren Programmiersprachen aus.[2] Das ist ohne weiteres möglich, da jedes GOTO-Programm durch ein While-Programm simuliert werden kann. Diese Meinung wurde in der Programmierausbildung bald zum Dogma erhoben; in einigen Sprachen wie Java wurde bewusst überhaupt kein GOTO-Befehl eingeführt (abgesehen von einem „gelabelten“ break – Schlüsselwort). Und dennoch behält man sich eine spätere Implementierung vor – GOTO ist als Schlüsselwort auch in Java reserviert. Andererseits unterstützen zahlreiche alte und neue imperative Programmiersprachen, z. B. Pascal, C, C++ und selbst das 2000 entwickelte C# sowie das 2007 publizierte D, noch GOTO. 2009 wurde GOTO nachträglich auch in die Skriptsprache PHP eingeführt (unter der Bezeichnung Jump Label).

Eine weniger kritisierte Variante des GOTO-Befehls ist das vorzeitige Verlassen eines Unterprogramms durch einen return-Befehl, das Abbrechen einer Schleife durch einen break-Befehl oder Abbrechen eines bestimmten Schleifendurchlaufs durch eine continue-Anweisung. Trotzdem gilt es in einigen Programmiersprachen als guter Programmierstil, wenn ein Block genau einen Einsprungpunkt und genau einen Ausstiegspunkt hat. In Sprachen, welche Ausnahmenbehandlung erlauben, wird dagegen die „Ein-Ausstiegspunkt“-Regel als obsolet angesehen, da throw-Anweisungen die Argumentation hinter dieser Regel ad absurdum führen.

In der Praxis hat sich jedoch gezeigt, dass der Verzicht auf GOTO zwar möglich ist, jedoch in einigen Fällen zu sehr aufwändigen Konstrukten führt.[3] Besonders in zeitkritischen Programmteilen ist ein goto deutlich effizienter als am Ende von mehreren geschachtelten Schleifen jeweils eine Abbruchprüfung durchzuführen.

Von einigen Entwicklern wurde auf der Linux-Kernel-Mailing-Liste die häufige Verwendung von GOTO im Quellcode von Linux diskutiert. Linus Torvalds sagte dabei, dass die Verwendung von GOTO die Lesbarkeit des Quellcodes in vielen Fällen sogar deutlich erhöhen könne.[4]

Siehe auch

Wartbarkeit, Kontrollstruktur, Spaghetticode

Weblinks

Einzelnachweise

  1. Linux kernel coding style, Chapter 7: Centralized exiting of functions (englisch)
  2. Edsger W. Dijkstra: Letters to the editor: Go To Statement Considered Harmful.. In: ACM (Hrsg.): Communications of the ACM. 11, Nr. 3, März 1968, S. 147–148. doi:10.1145/362929.362947.
  3. Frank Rubin: "GOTO Considered Harmful" Considered Harmful. In: ACM (Hrsg.): Communications of the ACM. 30, Nr. 3, März 1987, S. 195–196, doi:10.1145/214748.315722 (http://www.ecn.purdue.edu/ParaMount/papers/rubin87goto.pdf, abgerufen am 21. September 2010).
  4. „Linux: Using goto In Kernel Code“. Abgerufen am 21. September 2010 (englisch, auf kerneltrap.org).

Wikimedia Foundation.

Schlagen Sie auch in anderen Wörterbüchern nach:

  • GOTO — Eine Sprunganweisung oder ein Sprungbefehl dient in Programmiersprachen von Computerprogrammen dazu, die Ausführung an anderer Stelle fortzuführen, also Programmteile zu überspringen. Bei einem Rücksprung wird das Programm an einer Stelle… …   Deutsch Wikipedia

  • Rücksprung — Eine Sprunganweisung oder ein Sprungbefehl dient in Programmiersprachen von Computerprogrammen dazu, die Ausführung an anderer Stelle fortzuführen, also Programmteile zu überspringen. Bei einem Rücksprung wird das Programm an einer Stelle… …   Deutsch Wikipedia

  • Sprungbefehl — Eine Sprunganweisung oder ein Sprungbefehl dient in Programmiersprachen von Computerprogrammen dazu, die Ausführung an anderer Stelle fortzuführen, also Programmteile zu überspringen. Bei einem Rücksprung wird das Programm an einer Stelle… …   Deutsch Wikipedia

  • Sprungbefehle — Eine Sprunganweisung oder ein Sprungbefehl dient in Programmiersprachen von Computerprogrammen dazu, die Ausführung an anderer Stelle fortzuführen, also Programmteile zu überspringen. Bei einem Rücksprung wird das Programm an einer Stelle… …   Deutsch Wikipedia

  • GoTo-Programm — GOTO Programme sind spezielle Programme mit einer sehr einfachen Syntax. Dennoch spielen sie in Zusammenhang mit Berechenbarkeit eine große Rolle für die theoretische Informatik, insbesondere weil sich zeigen lässt, dass jede Turing berechenbare… …   Deutsch Wikipedia

  • Goto-Berechenbarkeit — GOTO Programme sind spezielle Programme mit einer sehr einfachen Syntax. Dennoch spielen sie in Zusammenhang mit Berechenbarkeit eine große Rolle für die theoretische Informatik, insbesondere weil sich zeigen lässt, dass jede Turing berechenbare… …   Deutsch Wikipedia

  • Goto-Programm — GOTO Programme sind spezielle Programme mit einer sehr einfachen Syntax. Dennoch spielen sie in Zusammenhang mit Berechenbarkeit eine große Rolle für die theoretische Informatik, insbesondere weil sich zeigen lässt, dass jede Turing berechenbare… …   Deutsch Wikipedia

  • Nassi-Schneiderman-Diagramm — DIN 66261 Bereich Programmierung Regelt Informationsverarbeitung; Sinnbilder für Struktogramme nach Nassi Shneiderman Kurzbe …   Deutsch Wikipedia

  • Nassi-Schneidermann-Diagramm — DIN 66261 Bereich Programmierung Regelt Informationsverarbeitung; Sinnbilder für Struktogramme nach Nassi Shneiderman Kurzbe …   Deutsch Wikipedia

  • Nassi-Schneidermann-Struktogramm — DIN 66261 Bereich Programmierung Regelt Informationsverarbeitung; Sinnbilder für Struktogramme nach Nassi Shneiderman Kurzbe …   Deutsch Wikipedia