Gehe zu

"GEHE ZU"Schlüssel zum 1982 Sinclair ZX -Spektrum Heimcomputer, implementiert mit nativ BASIC (Ein-Key-Befehlseintrag).

Gehe zu (gehe zu, GEHE ZU, GEHE ZU oder andere Fallkombinationen, abhängig von der Programmiersprache) ist a Aussage auf vielen Computer gefunden Programmiersprachen. Es führt a Einweg-Übertragung der Kontrolle zu einer anderen Codezeile; im Gegensatz a Funktionsaufruf Normalerweise gibt es die Kontrolle zurück. Die gesprungenen Standorte werden normalerweise mit Verwendung identifiziert Etiketten, obwohl einige Sprachen verwenden Linien Nummern. Bei der Maschinensprache Ebene, a gehe zu ist eine Form von Zweig- oder Sprungerklärungin einigen Fällen kombiniert mit einer Stapelanpassung. Viele Sprachen unterstützen die gehe zu Aussage und viele nicht (siehe § Sprachunterstützung).

Das Strukturierter Programm Theorem bewies, dass die gehe zu Aussage ist nicht erforderlich, um Programme zu schreiben, die ausgedrückt werden können Flussdiagramme; Eine Kombination der drei Programmierkonstrukte von Sequenz, Auswahl/Auswahl und Wiederholung/Iteration reichen für jede Berechnung aus, die von einem durchgeführt werden kann Turing Maschinemit der Einschränkung das Code -Duplikation und zusätzliche Variablen müssen möglicherweise eingeführt werden.[1]

In der Vergangenheit gab es eine beträchtliche Debatte in der Wissenschaft und Industrie über die Verdienste der Verwendung von gehe zu Aussagen. Die Verwendung von GOTO war früher häufig, aber seit dem Aufkommen strukturierter Programmierung in den 1960er und 1970er Jahren ist die Verwendung erheblich zurückgegangen. Die primäre Kritik Ist dieser Code, der GOTO -Anweisungen verwendet, ist schwerer zu verstehen als alternative Konstruktionen. Goto bleibt in sicherem Gebrauch Gemeinsame Verwendungsmuster, aber Alternativen werden im Allgemeinen verwendet, wenn verfügbar. Debatten über seine (limitierteren) Verwendungszwecke werden in den Kreisen der akademischen und Softwareindustrücke fortgesetzt.

Verwendungszweck

Goto -Label

Das gehe zu Aussage wird oft mit dem kombiniert wenn Anweisung eine bedingte Kontrollübertragung verursachen.

Wenn Bedingung dann Goto Label

Programmiersprachen verhängen unterschiedliche Einschränkungen in Bezug auf das Ziel von a gehe zu Aussage. Zum Beispiel die C Programmiersprache erlaubt keinen Sprung zu einer Etikett, die in einer anderen Funktion enthalten ist,[2] Springen innerhalb einer einzelnen Anrufkette sind jedoch mit der möglich setjmp/longjmp Funktionen.

Kritik

Bei der Voralgol-Sitzung 1959 abgehalten Heinz Zemanek Ausdrücklich Zweifel an der Notwendigkeit von GOTO -Aussagen warf; Zu der Zeit achtete niemand auf seine Bemerkung, einschließlich Edsger W. Dijkstra, der später der legendäre Gegner von Goto wurde.[3] Die 1970er und 1980er Jahre verzeichneten einen Rückgang der Verwendung von GOTO -Aussagen zugunsten des "Strukturierte Programmierung" Paradigma, mit goto kritisiert zu "unbemerabel Spaghetti -Code"(siehe unten). Einige Programmierstil Codierungsstandards, zum Beispiel die GNU -Pascal -Codierungsstandards, empfehlen für die Verwendung von GOTO -Aussagen.[4] Das Böhm -Jakopini -Beweis (1966) haben nicht die Frage gefragt, ob eine strukturierte Programmierung für die Softwareentwicklung angenommen werden soll, teilweise, weil die Konstruktion ein Programm eher verschleiert als die Verbesserung, da seine Anwendung die Einführung zusätzlicher lokaler Variablen erfordert.[5] Es löste jedoch eine herausragende Debatte zwischen Informatikern, Pädagogen, Sprachdesigner und Anwendungsprogrammierern aus, die sich langsam, aber stetig von der früher allgegenwärtigen Verwendung des GOTO abweichen. Wahrscheinlich ist die berühmteste Kritik an Goto ein Brief von Edsger Dijkstra 1968 namens "Gehen Sie zu einer schädlichen Aussage als schädlich".[3] In diesem Brief argumentierte Dijkstra, dass uneingeschränkte GOTO-Aussagen von Sprachen auf höherer Ebene abgeschafft werden sollten, da sie die Aufgabe, die Richtigkeit von Programmen (insbesondere diejenigen mit Schleifen zu beteiligen) zu analysieren und zu überprüfen.[6] Der Brief selbst löste eine Debatte aus, einschließlich eines von "schädlich als schädlichen" als schädlich angesehenen Briefes[7] gesendet an Kommunikation der ACM (CACM) im März 1987 sowie weitere Antworten anderer Personen, einschließlich Dijkstra's Auf einer etwas enttäuschenden Korrespondenz.[8]

Ein alternativer Standpunkt wird in dargestellt Donald Knuth's Strukturierte Programmierung mit GO to Aussagen, der viele häufige Programmieraufgaben analysiert und feststellt, dass in einigen von ihnen GOTO optimal ist Sprachkonstrukt benutzen.[9] Im Die C -Programmiersprache, Brian Kernighan und Dennis Ritchie Warnen Sie das gehe zu ist "unendlich missbillig", schlägt aber auch vor, dass es für Fehlerhandler des Funktionsfunktionsfehlers und für mehrstufige Pausen aus Schleifen verwendet werden könnte.[10] Diese beiden Muster sind in zahlreichen nachfolgenden Büchern zu C von anderen Autoren zu finden;[11][12] [13][14] Ein Einführungslehrbuch aus dem Jahr 2007 stellt fest, dass das Fehlerbehandlungsmuster eine Möglichkeit ist, die "mangelnde integrierte Ausnahmebehandlung innerhalb der C-Sprache" zu bearbeiten.[11] Andere Programmierer, einschließlich Linux Kernel -Designer und Kodierer Linus Torvalds oder Software -Ingenieur und Buchautor Steve McConnell, auch Objekt gegen Dijkstra's Sichtweise, die besagt, dass Gotos eine nützliche Sprachfunktion sein kann, die Programmgeschwindigkeit, Größe und Code -Klarheit verbessert, jedoch nur, wenn sie von einem vergleichsweise vernünftigen Programmierer vernünftig verwendet werden.[15][16] Nach Angaben des Informatikprofessors John RegehrIm Jahr 2013 gab es im Linux -Kernel -Code ungefähr 100.000 Fälle von GOTO.[17]

Andere Akademiker nahmen einen extremeren Standpunkt an und argumentierten, dass selbst Anweisungen wie Unterbrechung und Rückkehr Aus der Mitte der Schleifen sind schlechte Praxis, da sie im Ergebnis von Böhm -Jacopini nicht benötigt werden, und somit befürwortete, dass Schleifen einen einzigen Ausstiegspunkt haben sollten.[18] Zum Beispiel, Bertrand Meyer schrieb in seinem Lehrbuch 2009, das Anweisungen mögen Unterbrechung und fortsetzen "Sind nur die alten gehe zu in Schafkleidung ".[19] Eine leicht modifizierte Form des Böhm-Jacopini-Ergebnisses ermöglicht jedoch die Vermeidung zusätzlicher Variablen in der strukturierten Programmierung, solange mehrstufige Bruchs von Schleifen zulässig sind.[20] Weil einige Sprachen wie C keine mehrstufigen Pausen über ihre erlauben Unterbrechung Schlüsselwort, einige Lehrbücher raten dem Programmierer zur Verwendung gehe zu unter solchen Umständen.[14] Das Misra c 2004 Standardverbote gehe zu, fortsetzensowie mehrere Rückkehr und Unterbrechung Aussagen.[21] Die Ausgabe 2012 des Misra C -Standards stufte das Verbot an herab herab, wenn gehe zu von "erforderlich" zum "Beratungs" Status; Die 2012 -Ausgabe hat eine zusätzliche, obligatorische Regel, die nur rückwärts, aber keine Vorwärtssprung mit gehe zu.[22][23]

Forran Einführte strukturierte Programmierkonstrukte 1978 und in aufeinanderfolgenden Überarbeitungen wurden die relativ losen semantischen Regeln für die zulässige Verwendung von GOTO verschärft. Der "erweiterte Bereich", in dem ein Programmierer mit einem GOTO eine noch ausgeführte Do-Loop eingeben und hinterlassen konnte, wurde 1978 aus der Sprache entfernt.[24] Und bis 1995 waren verschiedene Formen von Forran Goto, einschließlich des berechneten Goto und dem zugewiesenen Goto, gelöscht.[25] Einige verwendete moderne Programmiersprachen wie z. Java und Python fehlt die Goto -Aussage - siehe Sprachunterstützung - Obwohl die meisten einige Mittel bieten, um aus einer Auswahl auszubrechen, oder entweder Brechen aus oder ziehen um auf den nächsten Schritt einer Iteration. Der Standpunkt, dass das Stören des Kontrollflusss im Code unerwünscht ist Ada[26] betont visuell Etikettendefinitionen mithilfe Winkelklammern.

Eintrag 17.10 in comp.lang.c FAQ -Liste[27] befasst sich mit dem Problem der GOTO -Verwendung direkt an, die Angabe

Der Programmierstil ist wie das Schreibstil eine Art Kunst und kann nicht durch unflexible Regeln kodifiziert werden, obwohl die Diskussionen über Stil oft ausschließlich um solche Regeln zu drehen scheinen. Im Falle der GOTO -Erklärung wurde seit langem beobachtet, dass der uneingeschränkte Gebrauch von GOTO schnell zu nicht wachbarem Spaghetti -Code führt. Ein einfaches, unüberlegtes Verbot der GOTO-Aussage führt jedoch nicht unbedingt sofort zu einer schönen Programmierung: Ein unstrukturierter Programmierer kann genauso in der Lage sein, ein byzantinisches Gewirr zu bauen, ohne dass GOTOs seltsam benachteiligte Schleifen und stattdessen boolesche Kontrollvariablen ersetzen) . Viele Programmierer nehmen eine mäßige Haltung ein: GOTOs sind normalerweise zu vermeiden, sind jedoch in einigen gut eingeschränkten Situationen, falls erforderlich Eine Funktion mit mehreren Fehlerrenditen. (...) Wenn Sie blind bestimmte Konstrukte vermeiden oder Regeln befolgen, ohne sie zu verstehen, kann dies zu genauso vielen Problemen führen, wie es die Regeln abwenden sollten. Darüber hinaus sind viele Meinungen zum Programmierstil genau das: Meinungen. Sie mögen stark argumentiert und stark gefühlt werden, sie können durch solide auftretende Beweise und Argumente unterstützt werden, aber die entgegengesetzten Meinungen können genauso stark empfunden, unterstützt und argumentiert sein. Normalerweise ist es sinnlos, in "Stilkriege" hineingezogen zu werden, da die Gegner in bestimmten Fragen niemals zustimmen oder zustimmen können, nicht zuzustimmen oder nicht mehr zu streiten.

Gemeinsame Verwendungsmuster

Während die allgemeine Nutzung von Gotos sinkt, gibt es in einigen Sprachen immer noch Situationen, in denen ein GOTO die kürzeste und einfachste Möglichkeit bietet, die Logik eines Programms auszudrücken (während es möglich ist, dieselbe Logik ohne Gotos auszudrücken, wird der äquivalente Code länger sein und oft schwieriger zu verstehen). In anderen Sprachen gibt es strukturierte Alternativen, insbesondere Ausnahmen und Schwanzaufrufe.

Situationen, in denen GOTO oft nützlich ist, umfassen:

  • Um den Code lesbarer und einfacher zu befolgen[15][28]
  • Kleinere Programme zu machen und Code -Duplikation loszuwerden[15][28]
  • Implementieren a Finite-State-Maschine, Verwendung einer Zustandsübergangstabelle und goto zu wechseln zwischen den Zuständen (in Abwesenheit von Schwanzanruf Eliminierung), insbesondere im automatisch generierten C -Code.[29] Zum Beispiel, Goto im kanonischen LR -Parser.
  • Implementierung von Multi-Level-Pausen und weiterhin direkt unterstützt, wenn sie in der Sprache direkt unterstützt werden; Dies ist eine gemeinsame Idiom in C.[14] Obwohl Java das GOTO -Keyword behält, implementiert es es nicht. Stattdessen implementiert Java mit der Bezeichnung Pause und markierten Fortsetzungsanweisungen.[30] Laut der Java-Dokumentation war die Verwendung von Gotos für mehrstufige Pausen die häufigste (90%) Verwendung von Gotos in C.[31] Java war nicht die erste Sprache, die diesen Ansatz verfolgte-um Goto zu bieten, sondern mehrstufige Pausen bereitzustellen-die WONNE Die Programmiersprache (genauer gesagt die Bliss-11-Version davon) ging diesbezüglich voraus.[32]
  • Surrogate für einstufige Break- oder Fortsetzung (Wiederholung) Anweisungen, wenn die mögliche Einführung zusätzlicher Schleifen den Kontrollfluss falsch beeinflussen könnte. Diese Praxis wurde in beobachtet Netbsd Code.[33]
  • Fehlerbehandlung (ohne Ausnahmen), insbesondere Reinigungscode wie Ressourcenverkleidung.[11][14][33][29][34] C ++ bietet eine Alternative zu GOTO -Anweisung für diesen Anwendungsfall, nämlich: Ressourcenerwerb ist die Initialisierung (Raii) Durch die Verwendung von Zerstörern oder die Verwendung von Versuch, Ausnahmen zu fangen, die in verwendet werden Ausnahmebehandlung.[35] setjmp und LongJMP sind eine andere Alternative und haben den Vorteil, einen Teil der zu entspannen Rufen Sie Stack an.
  • Das Stapel in z. B. Algol, pl/i.
  • Spezialisierte Skriptsprachen, die linear funktionieren, wie ein Dialogsystem für Videospiele.[36]

Diese Verwendungen sind in C relativ häufig, aber in C ++ oder anderen Sprachen mit höheren Merkmalen viel seltener.[34] Das Werfen und Fangen einer Ausnahme innerhalb einer Funktion kann in einigen Sprachen jedoch außerordentlich ineffizient sein. Ein Paradebeispiel ist Ziel c, wo ein Goto eine viel schnellere Alternative ist.[37]

Eine weitere Verwendung von GOTO -Aussagen besteht darin, schlecht berücksichtigte Änderungen zu ändern Legacy -Code, wo das Vermeiden eines Goto umfangreich erforderlich wäre Refactoring oder Code -Duplikation. Bei einer großen Funktion, bei der nur ein bestimmter Code von Interesse ist, ermöglicht eine GOTO -Anweisung es, zu oder von nur dem entsprechenden Code zu springen, ohne die Funktion anders zu ändern. Diese Verwendung wird berücksichtigt Code -Geruch,[38] findet aber gelegentlich Gebrauch.

Alternativen

Strukturierte Programmierung

Der moderne Begriff von Subroutine wurde erfunden von David Wheeler beim Programmieren der Edsac. Um einen Anruf zu implementieren und auf einen Computer ohne Unterroutine-Anrufanweisung zurückzukehren, verwendete er ein spezielles Muster selbstmodifizierender Code, das als a bekannt ist Wheelersprung.[39] Dies führte zu der Fähigkeit, Programme mit gut benachteilten Ausführungen von Routinen aus einer Bibliothek zu strukturieren. Dies hätte nicht nur verwendet gewesen gehe zuDa der Zielcode, der aus der Bibliothek gezogen wurde, nicht wissen würde, wohin er zurückspringen soll.

Später hochrangige Sprachen wie z. Pascal wurden um Unterstützung für die Unterstützung für Strukturierte Programmierung, was verallgemeinert aus Unterroutinen (auch als Verfahren oder Funktionen bezeichnet) in Richtung weiter Kontrollstrukturen wie zum Beispiel:

Diese neuen Sprachmechanismen ersetzten äquivalente Flüsse gehe zus und wenns. Die Mehrzweig-Verzweigung ersetzt das "berechnete Goto", in dem der Anweisungen dynamisch (bedingt) bestimmt wird.

Unter bestimmten Bedingungen ist es möglich, die lokalen GO -Aussagen zu Erlternsprogrammen zu beseitigen, indem sie durch mehrstufige Schleifen -Exit -Anweisungen ersetzt werden.[40]

Ausnahmen

In der Praxis liefert eine strikte Einhaltung der grundlegenden dreistrukturellen Vorlage der strukturierten Programmiervorlagen einen stark verschachtelten Code, da es nicht in der Lage ist, eine strukturierte Einheit vorzeitig zu verlassen, und a Kombinatorische Explosion mit recht komplexen Programmstatusdaten, um alle möglichen Bedingungen zu bewältigen.

Es wurden im Allgemeinen zwei Lösungen übernommen: eine Möglichkeit, eine strukturierte Einheit vorzeitig und allgemeiner zu verlassen Ausnahmen - In beiden Fällen gehen diese hoch Die Struktur, die Steuerung in Blöcke oder Funktionen zurückgibt, springt jedoch nicht an willkürliche Codepositionen. Diese sind analog zur Verwendung einer Rückgaberklärung in nicht terminaler Position-aufgrund des frühen Ausstiegs nicht streng strukturiert, sondern eine leichte Entspannung der Strenge der strukturierten Programmierung. In c, Unterbrechung und fortsetzen Erlauben Sie einen zu eine Schleife beenden oder Fahren Sie mit der nächsten Iteration fort, ohne ein Extra zu benötigen während oder wenn Aussage. In einigen Sprachen sind auch mehrstufige Pausen möglich. Für die Behandlung von außergewöhnlichen Situationen, spezialisiert Ausnahmebehandlung Konstrukte wurden hinzugefügt, wie z. Versuchen/Fang/endlich in Java.

Die Mechanismen zur Ausnahme von Wurf-Catch-Ausnahmen können auch leicht missbraucht werden, um nicht transparente Kontrollstrukturen zu erstellen, genau wie Goto missbraucht werden kann.[41]

Schwanzaufrufe

In einer Zeitung, die 1977 an die ACM -Konferenz in Seattle geliefert wurde, Guy L. Steele Zusammenfassend fasste die Debatte über die GOTO- und strukturierte Programmierung zusammen und stellte fest, dass Verfahrensaufrufe in der Heckposition eines Verfahrens am optimalsten als direkte Kontrollübertragung in das aufgerufene Verfahren behandelt werden können, wodurch unnötige Stapelmanipulationsvorgänge beseitigt werden.[42] Da solche "Schwanzaufrufe" in sehr häufig sind LispelnEine Sprache, in der Prozeduraufrufe allgegenwärtig sind, reduziert diese Form der Optimierung die Kosten eines Verfahrensaufrufs im Vergleich zu den in anderen Sprachen verwendeten GOTO erheblich. Steele argumentierte, dass schlecht implementierte Verfahrensanrufe zu einer künstlichen Wahrnehmung geführt hätten, dass die GOTO im Vergleich zum Verfahrensanruf billig sei. Steele argumentierte ferner, dass "im Allgemeinen Verfahren Anrufe nützlich als GOTO -Aussagen betrachtet werden können, die auch Parameter übergeben und gleichmäßig codiert werden können als Maschinensprache Sprunganweisungen "mit dem Maschinencode -Stapel -Manipulationsanweisungen" als Optimierung (anstatt umgekehrt!) "[42] Steele zitierte Beweise dafür, dass gut optimierte numerische Algorithmen in LISP schneller ausgeführt werden könnten als der Code, der von den damals verfügbaren kommerziellen FORTRAN-Compilern erzeugt wurde, da die Kosten für einen Verfahrensanruf in LiSP viel niedriger waren. Im Planen, ein Lisp -Dialekt, der von Steele mit entwickelt wurde Gerald Jay SussmanDie Schwanzanrufoptimierung ist obligatorisch.[43]

Obwohl Steeles Papier nicht viel in der Informatik neu einführte, zumindest wie es am MIT praktiziert wurde, brachte es den Umfang der Verfahrensanrufoptimierung ans Licht, was die Modularitätsqualitäten von Verfahren zu einer glaubwürdigeren Alternative zu der machte Die damaligen Kodierungsgewohnheiten großer monolithischer Verfahren mit komplexen internen Kontrollstrukturen und umfangreichen Zustandsdaten. Insbesondere die von Steele diskutierten Schwanzaufrufoptimierungen verwandelten das Verfahren in eine glaubwürdige Art der Implementierung der Iteration durch Single Schwanzrekursion (Schwanzreursion aufruft dieselbe Funktion). Darüber hinaus erlaubt die Schwanzaufrufoptimierung gegenseitige Rekursion von unbegrenzter Tiefe unter der Annahme von Schwanzaufrufen - dies ermöglicht die Übertragung von Kontrolle wie in endliche Staatsmaschinen, was ansonsten im Allgemeinen mit GOTO -Aussagen erreicht wird.

Coroutinen

Coroutinen sind eine radikalere Entspannung der strukturierten Programmierung, die nicht nur mehrere Ausstiegspunkte (wie in Renditen in der Nichtschwanzposition), sondern auch mehrere Einstiegspunkte ermöglichen, ähnlich wie bei GOTO-Anweisungen. Coroutinen sind eingeschränkter als Goto, wie sie nur können fortsetzen Eine derzeit laufende Coroutine an bestimmten Punkten - fortgesetzt nach einer Rendite -, anstatt zu einem willkürlichen Punkt im Code zu springen. Eine begrenzte Form von Coroutinen sind Generatoren, die für einige Zwecke ausreichen. Noch begrenzter sind Schließungen - Unterprogramme, die den Zustand (via "aufrechterhalten Statische Variablen), aber keine Ausführungsposition. Eine Kombination von Zustandsvariablen und strukturierten Steuerung, insbesondere eine Gesamtschalteranweisung, kann es einer Unterroutine ermöglichen, die Ausführung an einem willkürlichen Punkt auf nachfolgenden Aufrufen wieder aufzunehmen, und ist eine strukturierte Alternative zu GOTO -Aussagen in Abwesenheit von Coroutinen. Dies ist beispielsweise eine gemeinsame Idiom in C.

Kontinuationen

A Fortsetzung ähnelt einem Goto, in dem es die Kontrolle von einem willkürlichen Punkt im Programm an einen zuvor ausgeprägten Punkt überträgt. Eine Fortsetzung ist in den Sprachen, die sie unterstützen, flexibler als GOTO, da sie die Kontrolle aus der aktuellen Funktion übertragen kann, was ein Goto in den meisten strukturierten Programmiersprachen nicht tun kann. In jenen Sprachimplementierungen, die Stapelrahmen für die Speicherung lokaler Variablen und Funktionsargumente verwalten, wird die Ausführung einer Fortsetzung der Anpassung des Programms durchgeführt Rufen Sie Stack an Zusätzlich zu einem Sprung. Das longjmp Funktion des C Programmiersprache ist ein Beispiel für eine Fluchtdauer, die verwendet werden kann, um dem aktuellen Kontext zu einem umgebenden zu entkommen. Das Common Lisp Go -Betreiber hat auch dieses Stapelunternehmen, trotz des Konstrukts lexikalisch abgebildet, wie das zu springensbezeichnete Etikett aus a referenziert werden kann Schließung.

Im PlanenFortsetzung können sogar die Kontrolle von einem äußeren Kontext in einen inneren Überblick übertragen, falls gewünscht. Diese nahezu unbegrenzte Kontrolle darüber, welcher Code als nächstes ausgeführt wird, macht komplexe Kontrollstrukturen wie Coroutinen und kooperatives Multitasking relativ einfach zu schreiben.[43]

Nachrichtenübergang

In nicht proceduralen Paradigmen ist GOTO weniger relevant oder vollständig nicht vorhanden. Eine der Hauptalternativen ist Nachrichtenübergang, was von besonderer Bedeutung ist in Gleichzeitiges Computer, Interprozesskommunikation, und Objekt orientierte Programmierung. In diesen Fällen haben die einzelnen Komponenten keine willkürliche Kontrollübertragung, die Gesamtkontrolle kann jedoch auf komplexe Weise geplant werden, wie z. Präsentation. Die einflussreichen Sprachen Simula und Smalltalk waren unter den ersten, die die Konzepte von Nachrichten und Objekten einführten. Durch Einkapselung Zustandsdaten, Objekt orientierte Programmierung Reduzierte Softwarekomplexität für Interaktionen (Nachrichten) zwischen Objekten.

Variationen

Es gibt eine Reihe verschiedener Sprachkonstrukte unter der Klasse von gehe zu Aussagen.

Berechnete Goto und Goto zugewiesen

Im Forran, a berechnet GEHE ZU springt zu einem von mehreren Etiketten in einer Liste, basierend auf dem Wert eines Ausdrucks. Ein Beispiel ist Goto (20,30,40) i.[44] Das äquivalente Konstrukt in C ist das Schaltanweisung und in neuerem Forran a FALL Aussage ist die syntaktische Alternative.[45] BASIC hatte a 'Auf goto' ' Aussage, die das gleiche Ziel erreichte, aber in Visual Basic Dieses Konstrukt wird nicht mehr unterstützt.[46]

In Versionen vor Forran 95 hatte Forran auch eine Goto zugewiesen Variante, die die Steuerung in eine Anweisungsbezeichnung (Zeilennummer) überträgt, die in einer Ganzzahlvariablen gespeichert ist (zugewiesen). Es war leider möglich, zu einer Ganzzahlvariablen zu springen, die nicht zugewiesen worden war, und war eine Hauptquelle für Fehler, die zugewiesene Gotos umfassten.[47] Der Forran zuordnen Die Anweisung ermöglicht nur eine konstante (vorhandene) Zeilennummer der Ganzzahlvariablen. Es war jedoch möglich, diese Variable versehentlich als Ganzzahl danach zu behandeln, z. gehe zu Zeit. Der folgende Code zeigt das Verhalten der goto i wenn Linie i ist nicht spezifiziert:

  zuordnen 200 zu i  i = i+1  gehe zu i ! nicht näher bezeichnetes Verhalten 200 schreiben(*,*) "Dies ist eine gültige Zeilennummer" 

Mehrere C-Compiler implementieren zwei nicht standardmäßige C/C ++-Erweiterungen in Bezug auf GOTOs, die ursprünglich eingeführt wurden von von GCC.[48] Die GNU -Erweiterung ermöglicht die Adresse einer Etikett innerhalb der aktuellen Funktion als a Leere* Verwenden des unären Präfixes Etikettenwertoperator &&. Die GOTO -Anweisung wird ebenfalls erweitert, damit das Springen zu einem willkürlichen Sprung springen kann Leere* Ausdruck. Diese C -Erweiterung wird als a bezeichnet berechnete Goto in Dokumentation der C -Compiler, die es unterstützen; Seine Semantik ist ein Supersatz von Forrans zugewiesenem Goto, da es willkürliche Zeigerausdrücke als GOTO -Ziel ermöglicht, während der zugewiesene Goto von Forran keine willkürlichen Ausdrücke als Sprungziel zulässt.[49] Wie bei der Standard -GOTO in C ermöglicht die GNU C -Erweiterung das Ziel des berechneten GOTO nur in der aktuellen Funktion. Der Versuch, außerhalb der aktuellen Funktion zu springen, führt zu einem nicht spezifizierten Verhalten.[49]

Einige Basic -Varianten unterstützen auch eine berechnete GOTO in dem Sinne, das in GNU C verwendet wird, d. H. In dem das das Ziel sein kann irgendein Zeilennummer, nicht nur eine aus einer Liste. Zum Beispiel in MTS Grundlegender könnte schreiben Goto i*1000 Zum 1000 -fachen des Wertes einer Variablen zu der Linie zu springen i (Dies könnte beispielsweise eine ausgewählte Menüoption darstellen).[50]

Pl/i Beschriftungsvariablen Erzielen Sie den Effekt von berechneten oder zugewiesenen GEHE ZUs.

ÄNDERN

Bis zum 1985 ANSI Cobol Standard hatte die Änderungserklärung, mit der das Ziel eines vorhandenen GOS geändert werden konnte, zu dem sich in einem Absatz für sich selbst befinden musste.[51] Die Funktion, die erlaubte Polymorphismus, wurde häufig verurteilt und selten verwendet.[52]

Perl Goto

Im PerlEs gibt eine Variante der gehe zu Aussage, die überhaupt keine traditionelle Goto -Aussage ist. Es erfordert einen Funktionsnamen und überträgt die Kontrolle, indem es einen Funktionsaufruf für einen anderen ersetzt (a Schwanzanruf): Die neue Funktion kehrt nicht zum GOTO zurück, sondern an den Ort, von dem die ursprüngliche Funktion aufgerufen wurde.[53]

Emuliert Goto

Es gibt mehrere Programmiersprachen, die goto standardmäßig nicht unterstützen. Durch die Verwendung von Goto -Emulation ist es immer noch möglich, GOTO in diesen Programmiersprachen zu verwenden, wenn auch mit einigen Einschränkungen. Man kann Goto in Java emulieren,[54] JavaScript,[55] und Python.[56][57]

PL/I Beschriftungsvariablen

Pl/i hat den Datentyp ETIKETT, mit der sowohl das "zugewiesene Goto" als auch das "berechnete Goto" implementiert werden können. PL/I erlaubt Zweige aus dem aktuellen Block. Ein Anrufverfahren kann ein Etikett als Argument an ein aufgerufenes Verfahren übergeben, das dann mit einem Zweig beenden kann. Der Wert einer Etikettenvariablen umfasst die Adresse eines Stapelrahmens und ein Goto aus Block schlägt den Stapel.

 / * Dies implementiert das Äquivalent von *// * dem zugewiesenen Goto */ deklarieren Sie wo Etikett; wo = irgendwo; wohin gehen; ... irgendwo: / * Anweisung * /; ...
 / * Dies implementiert das Äquivalent von *// * dem berechneten Goto */ deklarieren Sie, wo (5) Etikett; Inx deklarieren; wo (1) = ABC; wo (2) = xyz; ... goto wo (Inx); ... ABC: / * Anweisung * /; ... xyz: / * Anweisung * /; ...

Ein einfacherer Weg, um ein äquivalentes Ergebnis zu erzielen, besteht darin, a zu verwenden Etiketten Sie konstantes Array Das braucht nicht einmal eine explizite Erklärung von a ETIKETT Typvariable:

 / * Dies implementiert das Äquivalent von *// * dem berechneten Goto */ deklarieren Sie inx fest; ... goto wo (Inx); ... wo (1): / * Anweisung * /; ... wo (2): / * Anweisung * /; ...

MS/dos Goto

Goto leitet die Ausführung auf ein Etikett, das mit einem Dickdarm beginnt. Das Ziel der GOTO kann eine Variable sein.

@Echo ausEINSTELLEN D8str=%Datum% EINSTELLEN D8dow=%D8str: ~ 0,3% ZUM %%D in (Mon Mi Fr) tun wenn "%%D" == "%D8dow%" gehe zu Shop %% d Echo Heute, %D8dow%, ist kein Einkaufstag.gehe zu Ende :Shopmon Echo Kaufen Sie Pizza zum Mittagessen - Montag ist Pizza -Tag.gehe zu Ende :Ladung Echo Kaufen Sie Calzone, um mit nach Hause zu nehmen - heute ist Mittwoch.gehe zu Ende :ShopFri Echo Kaufen Sie Seltzer, falls jemand ein Null -Kalorien -Getränk wünscht.:Ende 

Sprachunterstützung

Viele Sprachen unterstützen die gehe zu Aussage, und viele nicht. Im Java, gehe zu ist ein reserviertes Wort, ist aber unbrauchbar, obwohl die kompilierte Datei.Class Gotos und Etiketten generiert.[58] Python hat keine Unterstützung für Goto, obwohl es mehrere Witzmodule gibt, die es bieten.[56][57] Es gibt keine Goto -Aussage in Samen7 Und versteckte Gotos wie Break- und Fortsetzung werden ebenfalls weggelassen.[59] Im Php Es gab keine einheimische Unterstützung für gehe zu Bis Version 5.3 (Bibliotheken standen verfügbar, um seine Funktionalität zu emulieren).[60]

Das C# Programmiersprache hat gehe zu.[61] Es erlaubt jedoch nicht, auf ein Etikett außerhalb des aktuellen Bereichs zu springen, was es deutlich weniger mächtig und gefährlich macht als die gehe zu Schlüsselwort in anderen Programmiersprachen. Es macht auch Fall und Ursprünglich Aussagen Etiketten, deren Umfang die Einschließung ist Schaltanweisung; Goto Fall oder Goto Standard wird oft als expliziter Ersatz für implizite Falle verwendet, was C# nicht zuständig ist.

Das Pl/i Die Programmiersprache hat eine GOTO -Aussage, die den Stapel für eine Blockübertragung abwickelt und keine Übertragung in einen Block von außen ermöglicht.

Andere Sprachen haben möglicherweise eigene separate Schlüsselwörter für explizite Falle, die als Version von betrachtet werden können gehe zu auf diesen spezifischen Zweck beschränkt. Zum Beispiel verwendet Go die durchfallen Schlüsselwort und erlaubt implizite Falle überhaupt, überhaupt,[62] Während Perl 5 verwendet nächste Für explizite Falle standardmäßig, ermöglicht es jedoch auch, implizite Falle als Standardverhalten für ein Modul festzulegen.

Die meisten Sprachen, die Goto -Aussagen haben, nennen es das, aber in den frühen Tagen des Computers wurden andere Namen verwendet. Zum Beispiel in WÜTEND Die Übertragung zur Erklärung wurde verwendet.[63] Apl Verwendet einen richtigen Pfeil, für Goto.

C hat Goto und wird häufig in verschiedenen Redewendungen verwendet, wie oben diskutiert.

Da ist ein gehe zu Funktion in Perl auch. (siehe oben)

Funktionelle Programmiersprachen wie das Schema haben im Allgemeinen keine GOTO, sondern verwendet stattdessen Kontinuationen.

Siehe auch

Anmerkungen

  1. ^ Watt & Findlay 2004.
  2. ^ Kernighan & Ritchie 1988, p. 224, A9.6 Sprungerklärungen.
  3. ^ a b Dijkstra 1968.
  4. ^ GNU Pascal Development Team 2005, 5.1 verschiedene Pascal -Programmier -Tipps.
  5. ^ Louden & Lambert 2012.
  6. ^ "Die ungezügelte Verwendung der GOTO -Aussage hat eine unmittelbare Folge, dass es furchtbar schwierig wird, eine aussagekräftige Reihe von Koordinaten zu finden, in denen der Prozessfortschritt beschrieben werden kann. Zu viel Einladung, um das eigene Programm durcheinander zu bringen. "
  7. ^ Rubin 1987.
  8. ^ Dijkstra, Edsger W. Auf einer etwas enttäuschenden Korrespondenz (EWD-1009) (PDF). E. W. Dijkstra Archiv. Zentrum für amerikanische Geschichte, Universität von Texas in Austin. (Transkription) (Mai 1987)
  9. ^ Knuth 1974.
  10. ^ Kernighan & Ritchie 1988, S. 65–66, 3,8 Goto und Labels.
  11. ^ a b c Vine 2007, p. 262.
  12. ^ Geisler 2011.
  13. ^ Prata 2013.
  14. ^ a b c d Sahni & Cmelik 1995.
  15. ^ a b c Andrews 2003.
  16. ^ McConnell 2004.
  17. ^ Regehr 2013.
  18. ^ Roberts 1995.
  19. ^ Meyer 2009.
  20. ^ Kozen & Tseng 2008.
  21. ^ Stapelüberlauffragen 2012.
  22. ^ Pitchford & Tapp 2013.
  23. ^ Williams 2013.
  24. ^ ANSI X3.9-1978. American National Standard - Programmiersprache Forran. American National Standards Institute. Auch als ISO 1539-1980 bekannt, informell bekannt als Fortran 77
  25. ^ ISO/IEC 1539-1: 1997. Informationstechnologie - Programmiersprachen - FORTRAN - Teil 1: Basissprache. Informell bekannt als Forran 95. Es gibt weitere zwei Teile für diesen Standard. Teil 1 wurde von ANSI offiziell übernommen.
  26. ^ Barnes 2006.
  27. ^ Summit 1995.
  28. ^ a b Torvalds 2016.
  29. ^ a b Cozens 2004.
  30. ^ Java Tutorial 2012.
  31. ^ Gosling & McGilton 1996.
  32. ^ Brender 2002, S. 960–965.
  33. ^ a b Spinellis 2003.
  34. ^ a b Allain 2019.
  35. ^ Stroustrup 2012.
  36. ^ Hoad, Nathan (28. Juli 2022). "Nathanhoad/Godot_Dialogue_Manager". Abgerufen 28. Juli 2022.
  37. ^ Chisnall 2012.
  38. ^ Contieri 2021.
  39. ^ Wilkes, Wheeler & Gill 1951.
  40. ^ Ramshaw 1988.
  41. ^ Siedenleben 2006.
  42. ^ a b Steele 1977.
  43. ^ a b Kelsey, Cler & Rees 1998.
  44. ^ , was bedeutet, dass das Programm auf die Kennzeichnung 20, 30 oder 40 kennzeichnet, falls dies der Fall ist i ist entweder weniger als, gleich oder größer als Null.
  45. ^ Lahey Computer Systems, Inc 2004.
  46. ^ Microsoft 2021.
  47. ^ Wehr 1997.
  48. ^ Z/OS 2.5.0 in IBM -Dokumentation 2021.
  49. ^ a b GCC, die GNU Compiler Collection 2021.
  50. ^ Fronczak & Lubbers 1974, p. 226.
  51. ^ Die Alterserklärung wurde im COBOL 1985 -Standard als veraltet angesehen und 2002 gelöscht; sehen COBOL> Selbstmodifizierender Code
  52. ^ Van Tassel 2004.
  53. ^ Perl Syntax Manual 2021.
  54. ^ Goto für Java 2009.
  55. ^ Sexton 2012.
  56. ^ a b Hindle 2004.
  57. ^ a b Noack et al. 2015.
  58. ^ Gosling et al. (2005) Im Gegensatz zu C und C ++ hat die Java -Programmiersprache keine Aussage; Bezeichnungen zur Bezeichnung "Identifiererklärungen" werden mit Break (§14.15) oder fortgesetzt (§14.16) Anweisungen, die innerhalb der gekennzeichneten Erklärung überall erfolgen. Die Schlüsselwörter const und Goto sind reserviert, obwohl sie derzeit nicht verwendet werden. Dies kann es einem Java -Compiler ermöglichen, bessere Fehlermeldungen zu erstellen, wenn diese C ++ - Schlüsselwörter fälschlicherweise in Programmen angezeigt werden.
  59. ^ Handbuch für die Seed7 -Programmiersprache 2021.
  60. ^ PHP -Handbuch 2021.
  61. ^ Wagner 2021.
  62. ^ Die GO -Programmiersprachenspezifikation 2021.
  63. ^ Galer 1962, S. 26–28, 197, 211.

Verweise

  • Fronczak, Edward J.; Lubbers, Clark E. (September 1974). MTS, Michigan Terminalsystem. Universität von Michigan Computing Center. UOM: 39015034770076.
  • Geisler, Sandra (2011). C All-in-One-Schreibtischreferenz für Dummies. John Wiley & Sons. S. 217–220. ISBN 978-1-118-05424-6.
  • Hindle, Richie (1. April 2004). "Goto für Python". Lösungen der Teilnehmer. Hertford, Großbritannien: Abkommens Solutions Ltd.. Abgerufen 2021-11-10.
  • McConnell, Steve (Dezember 2004). Code vollständig: Ein praktisches Handbuch der Softwarekonstruktion, zweite Ausgabe (2. Aufl.). Microsoft Press. ISBN 978-0735619678.
  • Meyer, Bertrand (2009). Berührung der Klasse: Lernen, gut mit Objekten und Verträgen zu programmieren. Springer Science & Business Media. p. 189. ISBN 978-3-540-92144-8.
  • Perl Syntax Manual (2021). Gehe zu (Bericht). Abgerufen 2021-11-14.
  • PHP -Handbuch (2021). "gehe zu". Php. Abgerufen 2021-11-13.
  • Prata, Stephen (2013). C Primer Plus. Addison-Wesley. S. 287–289. ISBN 978-0-13-343238-1.
  • Roberts, Eric S. (März 1995). "Schleifenausgänge und strukturierte Programmierung: Wiedereröffnung der Debatte". ACM Sigcse Bulletin. 27 (1): 268–272. doi:10.1145/199691.199815.
  • Steele, Guy Lewis (Januar 1977). "Debunking des 'teuren Verfahrens rufen Sie Mythos oder Verfahrensanruf -Implementierungen als schädlich an oder lambda: das ultimative Goto". ACM '77: Verfahren der Jahreskonferenz von 1977: 153–162. doi:10.1145/800179.810196. S2CID 9807843.
  • Vine, Michael A. (2007). C Programmierung für den absoluten Anfänger. Cengage -Lernen. ISBN 978-1-59863-634-5.
  • Z/OS 2.5.0 in IBM -Dokumentation (2021). "Computered Goto Anweisung (IBM -Erweiterung)". IBM. Abgerufen 2021-11-13. Dieses Dokument beschreibt die Syntax-, Semantik- und IBM Z/OS® XL C/C ++ - Implementierung der Programmiersprachen C und C ++.Für eine allgemeine Standardreferenz für C- oder C ++-siehe cppreference.com.