GOTO Befehl ... Warum Böse?

  • Ja da ich ja ein etwas mehr jüngeres Semester bin, bin ich eigendlich nie mit dem Befehl in Berührung bekommen.
    Aber wenn ich mir mal den Syntax anschaue und etwas drüber nachdanke, ist der Befehl doch garnicht so schlecht.
    Also warum hast ihn alle Welt?
    Vorallem meine ich wir sehen ja wohl zu denen auf die das Assembler flüssig beherschen, und da kommt man ja ums GOTO eigendlich kaum herum oder sehe ich das Falsch ?
    Und warum ises so schlimm in jede Belibige programmstelle zu springen, ich kann mir vorstellen das spaart sicher viel zeit.

    MFG Matthias

  • Mir gefällt der Befehl auch, solange man goto SPARSAM einsetzt.
    Aber so was geht gar nicht:

    Code
    start:
      ...
      if ... goto start
     ...
      goto ende
    nochwas:
      if (bla) goto start
    ende: 
      if (g) goto nochwas
      goto start

    Der Befehl ist wohl verhasst, weil manche (viele) Programmier unübersichtlichen Code damit erzeugt haben (Wäre bestimmt auch anders gegeangen) Und dann kam eben jemand, der goto darufhin allgemein verteufelt hat.

    Im Assembler ist goto übrigens nicht wegzudenken. Jedes if und jede schleife beruht darauf. Wenn man in einer höheren Sprache aber diese Konstrukte zur Verfügung hat, sollte man sie auch verwenden und nur mit guter Begründung noch goto verwenden.

    Zitat

    Und warum ises so schlimm in jede Belibige programmstelle zu springen, ich kann mir vorstellen das spaart sicher viel zeit.


    Solange der Code übersichtlich bleibt, geht das, aber wenn man sehr viele gotos verwendet, läuft man Gefahr, sich darin zu verlieren.

    PS: Mein Prof sieht das jetzt bestimmt anders, aber was will man von einem Java-Jünger erwarten.

    • Offizieller Beitrag

    An eine beliebige Stelle springen zu können, hat z.B. auch große Nachteile bei der automatischen Optimierung des Assembler-Codes, den ein Compiler erzeugt. Wenn Sprünge festgelegt sind (und die, die for-/while-/if-Anweisungen erzeugen, sollten das in der Regel sein), dann kann man z.B. Annahmen darüber machen, welche Variablen demnächst genutzt werden können und deshalb in Registern bleiben sollten.

    Die Unübersichtlichkeit ist natürlich auch ein echtes Problem. Assembler-Code braucht deshalb für die meisten Programmierer noch mehr Kommentare (Andy macht sie glaube ich zeilenweise ;)) als das, was wir machen, eben weil die Sprünge so teuflisch überraschende Wirkung erzielen können. Das ist wahrscheinlich zum Teil Gewöhnungssache, aber auch unser Hirn mag Lokalität, Sprünge, die wirklich überall hingehen können, sind komisches Zeug. Was machst du z.B., wenn du per Goto in eine For-Schleife reinkommst (also in den Körper)? Initialisierst du die Schleifenvariable? Wenn ja, wann? Und wie?

    Eine Welt ohne Goto scheint anstrengender, ist aber schöner ;).
    Johannes

  • Hi,
    ich finde Goto eigentlich gar nicht schlecht... Solange man ihn nicht so exesiv benutzt wie in progandy's Beispiel ;).

    Um noch mal zum Thema Assembler zu kommen. Mir ist eigentlich gar keine Methode bekannt ohne Sprungmarken komplexere Sachen und Schleifen zu machen. Diese vielen Marken erhöhen aber keineswegs die Lesbarkeit :wacko: . Deshalb gilt bei Assembler: Um die Übersicht zu behalten sollte man unbedingt viel Kommentieren und seinen Code einrücken.

  • Hi,
      peethebee : schönen Dank für die Blumen ;)
    Ich MUSS zum Thema GOTO einfach was sagen: Schließlich kann ich den Befehl nicht leiden!^^
    Sicherlich mag es Situationen geben, in denen der GOTO-Befehl hilfreich ist..
    Vielfach haben Programmierer aber einfach keine Lust, darüber nachzudenken, wie er sich vermeiden läßt! Wer sich (außer peethebee) noch an mich erinnern kann, weiß, daß ich auch aktiver FreeBasic'er bin. Doch auch dort ist GOTO verpönt und kann mit den sprachlichen Mitteln vermieden werden.
    Gerade in größeren Programmen verliert nicht nur der Programmierer schon mal die Übersicht, von denen, die ihm helfen sollen, sein Programm lauffähig zu bekommen mal ganz zu schweigen..
    GOTO war (und ist) eine Hilfskonstruktion in Sprachen, denen andere Möglichkeiten fehl(t)en, einzelne Programm-Module ordentlich einzukapseln(in Funktionen, Schleifen, wie auch immer).
    Für mich war es eine Erholung, in den FAQs zu Autoit zu lesen, daß es keinen GOTO-Befehl gibt.
    Und so sollte es auch bleiben!
    Selbst wenn es irgendwann ein GOTO in AutoIt geben sollte, kann mich niemand zwingen, das zu benutzen..
    Gruß
    ytwinky

    (Ich) benutze stets die aktuelle (Beta) und SciTE..

    • Offizieller Beitrag

    Ich kenne den GOTO-Befehl noch vom C64 BASIC und was da an Spaghetticode bei entstanden ist, geht auf keine Kuhhaut. :D
    Völlig wirres Hin- und Herspringen war bei manchen Codern normal und wenn die nach einem Jahr selbst mal wieder ihr Programm anschauten, konnte das keiner mehr überblicken.
    Ich war damals schon immer bemüht, die GOTOs so gering wie möglich zu halten. Ganz verhindern konnte man das wegen der fehlenden Alternativen aber nicht. Ganz schlimm war, dass es keine Label gab. Man musste Zeilennummern anspringen. Wenn man nachträglich einen Befehl einfügte, musste man von Hand alle GOTOs entsprechend anpassen. Grausam! :thumbdown:

    Das ist wohl auch der Grund warum ich überaus dankbar bin, dass es in AutoIt kein GOTO gibt. Und ich habe es auch noch nie vermisst. Die vielen Schleifen und die Möglichkeit von Funktionen sind mir um ein vielfaches lieber. :)

    P.S.: Ich kenne aus der C64 Zeit auch noch Assembler und natürlich braucht man dort eine Art GOTO. Dort ist die Situation IMHO aber eine andere. Man programmiert viel hardwarenäher und die Sprünge sind meist nicht sehr "weit".

  • Oscar : Ich bin von gotos mit richtigen Labeln ausgegangen. Bei nummerierten gotos oder gar gotos nach Zeilennummern wird mir schon von der Vorstellung schlecht. Ich möchte wissen, wer so einen Schwachsinn erfunden hat.

  • zunächst OT :D

    Zitat von Oscar

    Man programmiert viel hardwarenäher und die Sprünge sind meist nicht sehr "weit".

    Hehe, genau! Far Jumps und near Jumps, die übrigens heute noch ihre Berechtigung haben!

    Zitat von peethebee

    An eine beliebige Stelle springen zu können, hat z.B. auch große Nachteile bei der automatischen Optimierung des Assembler-Codes, den ein Compiler erzeugt

    Das ist eine der grossen Vorteile der Optimierungen "richtig" schneller Compiler, die erzeugen nämlich (abhängig von der Hardware) keine "direkten" Sprünge an eine Adresse, sondern springen z.B. XXX Bytes im Code zurück und "zwingen" so die branch-prediction-Unit im Prozessor, da (je nach Prozessor) der eine oder andere Fall als "wahrscheinlicher" angesehen und somit schneller ausgeführt wird. Aber dieser Code ist überhaupt nicht mehr nachzuvollziehen, wird daher noch gerne und oft von Virenprogrammierern verwendet, genau wie mittlerweile von sämtlichen Compilerherstellern verpönter selbstmodifizierender Code.
    Übrigens fasse ich

    Zitat

    Assembler-Code braucht deshalb für die meisten Programmierer noch mehr Kommentare (Andy macht sie glaube ich zeilenweise )

    als Kompliment auf :thumbup:, aber unter uns Klosterschwestern, ich spreche JEDEM Programmierer ab, nach Jahren seinen Code ohne Kommentare schneller verstehen zu können als mit Kommentaren, unabhängig von der Programmiersprache :D
    *whispermode ON* ....habe hier viele Kilobytes Assemblercode ohne einen einzigen Kommentar, aber der wird wohl nie "veröffentlicht" ;) ...*whispermode OFF*
    Wobei natürlich infolge fortschreitendem Alter und somit immer heftigeren Alzheimer-Anfällen die Kommentare die "Krücke" sind, welche auch beim körperlichen Verfall ab und zu hilfreich ist :whistling:

    Nun BTT :D
    GOTO, ick liebe Dir! :rock:
    Hach war das schön, da hat einer deinen Programmcode geklaut und du hast es gemerkt und musstest nur 1-2 GOTOS umbiegen, um den kompletten Code unbrauchbar zu machen X(

    Zitat von Oscar

    Man musste Zeilennummern anspringen. Wenn man nachträglich einen Befehl einfügte, musste man von Hand alle GOTOs entsprechend anpassen. Grausam!

    Du NOOB! :D Zeilennummern im ersten Programmierdurchgang in 10er Schritten, wenn dann was eingefügt werden musste hat man in die 5er Zeilennummern eingefügt, und ganz zum Schluss hat man dann die Einer-(Zeilennummern) ausgefüllt. :rofl:
    Und wenn dann immer noch einige Zeilen gefehlt haben, konnte man dank GOTO über den kompletten restlichen Code zweihundert Zeilen nach vorne springen und dort weitermachen :rock:

    Jetzt ohne Witz, die ersten kommerziellen BASIC-Programme waren die, welche bestehende BASIC-Programme an 10er-Zeilennummern ausgerichtet hatten, und natürlich sämtliche GOTOs anpassten!

    A propos Spaghetticode, für den braucht man kein GOTO, das schaff ich auch ohne :D (und SEHR viele andere auch)....


    Zitat von progandy

    Ich möchte wissen, wer so einen Schwachsinn erfunden hat.

    Die Typen sitzen heute auf 60m langen Yachten in der Südsee und lassen sich den Wanst kraulen :D
    Aber mal im Ernst, setz dich an einen 80x25 Zeichen Monochrom-Monitor, angeschlossen an einen 8-Bit-Rechner mit einer Handvoll Bytes Arbeitsspeicher. Die Programme werden auf Magnetbändern gespeichert und du verdienst als 08/15 Programmierer JEDEN TAG 1000€ Netto damit, Programme für eine Versicherung, Bank usw zu schreiben. Und du bist heilfroh, endlich mit einem GOTO zu Zeilennummern in deinem Programm zu springen, statt für Sprünge die Bytes der Opcodes zu zählen ;)

  • Hmm, stimmt auch wieder. Aber warum man z.B. in Pascal nummerierte Labels einführt, kann ich nicht wirklich verstehen. Wenn man schon labels erstellt, kann man doch gleich Text verwenden.
    Oder hat da jemand die Zeilennummern von Basic abgeschaut und ohne nachzudenken als Labels implementiert?

    A propos Spaghetticode, für den braucht man kein GOTO, das schaff ich auch ohne :D (und SEHR viele andere auch)....


    Das ist wirklich kein Problem :D

    Einmal editiert, zuletzt von progandy (24. Februar 2011 um 21:20)

  • Goto kann aber auch z.B eine unendliche schleife ersetzen was ich nicht unübersichtlich finde

    Code
    @echo off
    :hallo
    echo 10101010100010110101101101110110010101000101001010010101000010010001
    echo 01010100010110101010101010010100101001010100010011001010100110010101
    echo 1010101010010100101001010010100101010001010010100101010010101010010
    echo 10101010100010101101101101110110010101000101001010010101000010010001
    echo 01010100010110101010101010010100101001010100010011001010100110010101
    echo 1010101010010100101001010010100101010001010010100101010010101010010
    echo 10101010100010101101101101110110010101000101001010010101000010010001
    goto:hallo