# goto SCL



## Amzaun (25 Januar 2013)

Heute hat ein Elektromeister bei uns im SCL Kurs behauptet das die goto Anweisung nicht mehr verwendet werden soll, weil sie angeblich gefährlich sei. Was meint ihr dazu?


----------



## zotos (25 Januar 2013)

Die Verwendung von GOTO ist die beste Zutat für einen ordentlichen Spagetticode.

Es gibt wirklich nur sehr wenige Situationen bei denen ein GOTO sinnvoll ist (z.B. um im Fehlerfall einen Abbruch anzuspringen). In der Regel gibt es deutlich bessere (übersichtlichere) Lösungen als GOTO. Diese Diskussion über GOTO ist aber nun wirklich echt so uralt das einen Google mit den Argumenten zuschmeißt.

Eines der berühmtesten Statements ist von Edsger W. Dijkstra: _"GoTo Statement Considered Harmful."_


----------



## Jochen Kühner (25 Januar 2013)

goto gibts fast noch in jeder Programmiersprache, wird meist benötigt um verschachtelte Schleifen zu verlassen!


----------



## Perfektionist (26 Januar 2013)

...um Schleifen zu verlassen, kennen manche Sprachen auch den Befehl "exit". In AWL (Achtung: OT, Spamverdacht) empfinde ich so Sachen wie MCR und BEB/BEA als deprecated.

Allgemein ist es ja so, dass in einer klassischen SPS ständig jeder Code abgearbeitet wurde. Somit man zum Verständnis eines Programms zunächst sich in der Regel keine Gedanken darüber macht, ob der vorgefundene Codeschnipsel überhaupt wirksam ist bzw. abgearbeitet wird. Diese Regel, dass der Code wirksam ist, durchbrechen Programmflusskontrollen wie MCR, SPA oder GOTO, aber auch IF/THEN oder CASE, wenn die bedingte Codeausführung nicht durch Einrückung o.ä. gekennzeichnet ist und die Bedingung auf so viel wirkt, dass einem die Bedingung nicht mehr zwangsläufig ins Auge fällt.

Oftmals wird kolportiert, wer GOTO benutzt, würde zwangsläufig unübersichtlichen Code erzeugen. Dem kann ich als AWL-Programmierer, der zwangsläufig bei nicht-binären Programmabschnitten SPB und SPA benötigt, erwidern, dass ich genau wegen dieser Problematik Sprünge, die deutlich weiter reichen als eine Bildschirmseite, deswegen extra deutlich durch Zeilenkommentar auffällig kennzeichne. Wahrscheinlich werde ich das bei GOTO (ich beginne gerade SCL) auch tun, sodenn ich diesen Befehl ausnahmsweise tatsächlich benötigen sollte (statt dem zu bevorzugenden IF/THEN, WHILE/DO-UNTIL etc.).


----------



## MasterOhh (26 Januar 2013)

Mein Informatik Lehrer an der Schule hat uns vor 16 Jahren eingetrichert: "Wer GOTO verwendet, darf das ganze Programm nochmal schreiben"
Seit dem habe ich diesen Befehl auch noch nie gebraucht.


----------



## Perfektionist (26 Januar 2013)

bei mir ist das jetzt rund dreissig Jahre her, dass mir mein Lehrer (einer der ersten Informatik-Unterrichte überhaupt am Gymi!) das eingetrichtert hatte. Damals mit Commodore-Basic praktisch nicht umsetzbar. Erst Q-Basic ua. kannten dann mal andere Programmkontrollen, wobei: If/Then bei Commodore war schonmal ganz übersichtlich auf eine Zeile beschränkt, kannte kein ENDIF. Aufgrund meiner Lebenserfahrung vor AWL denke ich, dass auch ich GOTO weitestgehend oder ganz und gar beim Einsatz von SCL vermeiden werden werde.


----------



## Blockmove (26 Januar 2013)

Über die Verwendung von Goto wirst du im Netz genügend Diskussionen finden.

Ich persönlich sehe es recht pragmatisch:
Ein Goto kann durchaus den Code übersichtlicher und/oder schneller machen.
Anwendungsfälle sind das Verlassen von sehr verschachtelte Abfragen / Schleifen oder der Sprung zu Errorhandlern.

Da eine SPS eigentlich eine simple Plattform und SCL eine doofe Sprache ohne viel Automatismen ist, kann ein Goto gar nicht die Auswirkungen haben, wie bei anderen Sprachen und Plattformen (PC).

Gruß
Dieter


----------



## Ralle (26 Januar 2013)

Ich habe GoTo noch nie benötigt, BEB eigentlich auch nicht, ansonsten kommt man natürlich in AWL an Sprüngen nicht vorbei. SCL/ST zumindest braucht das nicht, das kommt tatsächlich der Übersichtlichkeit zu Gute.


----------



## Amzaun (26 Januar 2013)

Alles klar dann ist doch etwas wahres dran. Ich hatte es für einen Humbug gehalten. Danke meinerseits für die Aufklärungen!!!


----------



## JOHKU (30 Januar 2013)

Hi,

hier noch ein Zitat aus meiner PASCAL Vorlesung von 1982

" Unser Motto:
Wenig GOTO!"

Gruß

Johannes


----------



## hucki (30 Januar 2013)

Wobei man aber auch mal zugestehen sollte, das aus den ganzen IF, THEN usw. der Hochsprachen nach der Kompilierung in Maschinensprache auch bloß ein JMP dahin oder dorthin wird.

Also genau wie in AWL.
Nur daß man es nicht direkt sieht.


----------



## IBFS (30 Januar 2013)

JOHKU schrieb:


> " Unser Motto:
> Wenig GOTO!"



Das ist unvollständig. Es muss heißen:

Weniger GOTO, mehr EXIT!

Frank


----------



## Thomas_v2.1 (31 Januar 2013)

IBFS schrieb:


> Das ist unvollständig. Es muss heißen:
> 
> Weniger GOTO, mehr EXIT!



Versteh ich nicht, was soll das heißen?


----------



## IBFS (31 Januar 2013)

Thomas_v2.1 schrieb:


> Versteh ich nicht, was soll das heißen?



*EXIT-Anweisung* 
Wenn die EXIT-Anweisung in einer FOR-, WHILE- oder REPEAT-Schleife vorkommt, dann wird die innerste Schleife beendet, ungeachtet der Abbruchbedingung.

Gruß

Frank


----------



## Thomas_v2.1 (1 Februar 2013)

Was die Exit Anweisung macht ist mir bewusst, nur ist das eben kein Ersatz für goto.


```
IF a THEN
  IF b THEN
    IF c THEN
       // Hier bei einer Bedigung den kompletten IF-Zweig verlassen
    ENDIF
  ENDIF
ENDIF
```

oder


```
FOR i := 0 TO 1000
  FOR j := 0 TO 1000
    FOR k := 0 TO 1000
      // Hier bei einer Bedigung alle drei verschachtelten Schleifen verlassen
```

Da kommt man mit Exit nicht weit.
Und an den Stellen wo man Exit einsetzen kann, hat wohl noch nie jemand ein goto gesetzt.


----------



## Perfektionist (1 Februar 2013)

hucki schrieb:


> Wobei man aber auch mal zugestehen sollte, das aus den ganzen IF, THEN usw. der Hochsprachen nach der Kompilierung in Maschinensprache auch bloß ein JMP dahin oder dorthin wird.
> 
> Also genau wie in AWL.
> Nur daß man es nicht direkt sieht.


gerade der Umstand, dass man die Sprünge nicht sieht, macht Hochsprachenkonstrukte übersichtlicher, sodenn man auf goto verzichten kann. Exit gehört, glaube ich, auch eher in die Kategorie deprecated, wenn ich da meinen Informatikunterricht noch richtig im Ohr behalten habe.


----------



## IBFS (1 Februar 2013)

Perfektionist schrieb:


> Exit gehört, glaube ich, auch eher in die Kategorie deprecated, wenn ich da meinen Informatikunterricht noch richtig im Ohr behalten habe.



Das ist definitiv ein falscher Gedankengang.

Wenn du in einer Suchschleife  von 0 bis 100 etwas suchst und das beim Element 2 findest, 
dann springst du ganz gepflegt mit EXIT heraus, oder willst du wirklich bis 100 durchzählen
und erst zum Schluss mit dem gemerkten Element 2 weiterarbeiten.

Ich verwende EXIT im Codesys-ST wirklich sehr oft.

Frank


----------



## Perfektionist (1 Februar 2013)

```
FOR i := 0 TO 1000
  FOR j := 0 TO 1000
    FOR k := 0 TO 1000
      // Hier bei einer Bedigung alle drei verschachtelten Schleifen verlassen
```
aahh, ein hübsches Beispiel, das anregt, etwas anders machen zu können:

```
done := false;
repeat [ Code]
 done := [abbruchbedingung];
until done;
```
ganz ohne exit und goto. nur dass man halt seine Laufvariable selbst initialisieren und hochzählen muss. Und dass man diese Laufvariablen nicht auf den ersten Blick erkennen kann.


----------



## Thomas_v2.1 (1 Februar 2013)

Dass man ein goto immer irgendwie umschiffen kann ist klar. Nur ab einer gewissen Schachtelungstiefe ist es eben übersichtlicher ein goto zu verwenden (die bei 3 sicher noch nicht erreicht ist).
Und es ist eigentlich genauso ein Dogma, dass man bei einer Schleife die eine Laufvariable hat die dafür vorgesehen Anweisungen verwendet.
Nur um ein goto zu vermeiden zur unübersichtlichen repeat-Schleife zu wechseln ist auch alles andere als schön.


----------



## IBFS (1 Februar 2013)

Thomas_v2.1 schrieb:


> Nur um ein goto zu vermeiden zur unübersichtlichen repeat-Schleife zu wechseln ist auch alles andere als schön.



In der Firmenvorschrift, die ich beachten muss, wird nur eine FOR-Schleife und IF-THEN erlaubt. 

Frank


----------



## Thomas_v2.1 (1 Februar 2013)

IBFS schrieb:


> In der Firmenvorschrift, die ich beachten muss, wird nur eine FOR-Schleife und IF-THEN erlaubt.



Halte ich für eine übliche Schwachsinnsvorschrift.
Ein Sortieralgorithmus wie Bubble- oder Quicksort beispielsweise würde dadurch entweder unübersichtlicher oder langsamer.

So eine Vorschrift macht vielleicht Sinn wenn in der Firma nur Leute arbeiten die nicht wissen wann man welche Anweisung einsetzt. Da wäre eine Mitarbeiterschulung zweckdienlicher als so eine Vorschrift.


----------



## Perfektionist (1 Februar 2013)

nebenbei bemerkt versuche ich, Schleifen grundsätzlich zu meiden, wenn ich entsprechende Möglichkeiten hab, die Laufvariablen nur Zyklus für Zyklus weiterzählen zu können. Wenn ich das Ergebnis der Schleife nicht sofort im gleichen Zyklus brauche.

dass repeat-until unübersichtlich sein soll ist wohl genauso Ansichtssache, wie dass goto und exit als unschön betrachtet werden. Ich finde eigentlich an Repeat nichts unschönes.

Dass Schleifen ausschließlich in der FOR-Form erlaubt werden, ist, denke ich mal, dem Umstand geschuldet, dass diese Form niemals endlos laufen kann (jedenfalls nicht, solange man die Laufvariable in der Schleife nicht manipuliert, oder meckert da der Compiler?). Was aber auch bedeutet, dass man mit IF-THEN und GOTO ebenfalls keine Schleifen bauen sollte, deren Abbruchbedingung unter Umständen niemals eintritt.

Letztlich ist eigentlich jede bedingte Codeausführung im Bereich Automatisierung (da spreche ich jetzt von Einzelmaschinen, die Zykluszeiten von oftmals <10ms erfordern) problematisch, wenn man sich nicht gerade im Status befindet, sondern nur den Code vor Augen hat, bei dem unklar ist, ob er überhaupt wirksam ist.


----------



## IBFS (1 Februar 2013)

Thomas_v2.1 schrieb:


> Halte ich für eine übliche Schwachsinnsvorschrift.



Naja, die Firma, um die es geht, stellt u.a. Waschmaschinen her ..... also keine Gurkenbude.

Außerdem haben die einen Codescanner geschrieben - genial wie ich finde - der scannt den kompletten ST-Quellcode, also
das gesamte CoDeSys-Projekt auf Konformität mit dieser .....-vorschrift  und der gibt nachher exakt aus, wo der Programmierer
etwas zu virtuos gehandelt hat. Man mag davon halten was man will, der Softwareeinheitlichkeit und -qualität ist das mit
Sicherheit dienlich.

Frank


----------



## JesperMP (1 Februar 2013)

Warum ist CASE OF nicht in die Firmenvorschriften ?
CASE OF ist genau so "sicher" wie IF THEN. CASE OF ist eigentlich nur eine saubere Variante von verschacktelte IF THEN.


----------



## nutellahase (1 Februar 2013)

Ich verwende FOR Schleifen nur dann, wenn mir die Anzahl der Schleifendurchläufe bekannt ist (z.b. ein Array von 100 Elementen durchsuchen). WHILE und REPEAT kommen wohl eher bei Sortieralgorithmen zum Tragen. Ich denke die meisten nehmen deswegen eine FOR-Schleifen weil sie noch am einfachsten zum debuggen ist (meiner Ansicht nach). EXIT habe ich auch schon oft gebrauchen können, aber wie steht es denn bei euch mit CONTINUE??? 
Soweit ich weiß beendet diese Anweisung ja den aktuellen Schleifendurchlauf und der Index wird dann um eins weitergezählt.


----------



## hucki (1 Februar 2013)

Perfektionist schrieb:


> ... sodenn man auf goto verzichten kann. Exit gehört, glaube ich, auch eher in die Kategorie deprecated, wenn ich da meinen Informatikunterricht noch richtig im Ohr behalten habe.


Das u.ä. haben die Unterrichtenden schon vor min. 25 Jahren erzählt.

Und trotzdem kann ich nicht nachvollziehen, warum ich mich freiwillig in meinen Möglichkeiten einschränken soll, wenn es die Programmierer der jeweiligen Hochsprache (immer noch?) anbieten und demzufolge nicht für überholt halten. 

Auch wenn's nicht viele Situationen gibt, aber wenn es in einer am Besten passt - warum nicht?


----------



## Perfektionist (4 Februar 2013)

hucki schrieb:


> Das u.ä. haben die Unterrichtenden schon vor min. 25 Jahren erzählt.
> ...
> ...aber wenn es in einer am Besten passt - warum nicht?


in meine Ohren ist dies schon vor 30 Jahren gedrungen.

das "warum nicht" wurde damals so beantwortet, dass der Leser (und auch der Urheber des Codes) davon ausgehen kann, dass die Schleife auch wirklich vollständig abläuft. Und wenn eben nicht ein vollständige Ablauf vonnöten ist, dann eben "UNTIL done", dann kann man sich auf die Suche im Code nach dem "done" machen.

Aber wie so oft: was schön ist und was weniger schön ist, liegt auch hier vermutlich rein im Auge des Betrachters.


----------



## corrado (6 Februar 2013)

Wenn schon GOTO dann das "COMPUTET GOTO" aus Fortran (ist wenn man es beherrscht universeller als jede CASE-Verzweigung bzw. SPL in Step7). Leider unterstützt SCL, ST, VB usw. diese Anweisung nicht. 

Corrado


----------



## JOHKU (6 Februar 2013)

corrado schrieb:


> Wenn schon GOTO dann das "COMPUTET GOTO" aus Fortran (ist wenn man es beherrscht universeller als jede CASE-Verzweigung bzw. SPL in Step7). Leider unterstützt SCL, ST, VB usw. diese Anweisung nicht.
> 
> Corrado



.... eventuell gibt es auch in COBOL, FORTH, ADA, MODULA2, PL/M, Prolog, Lisp oder 8080 Assembler irgendwas schönes was STEP7 nicht unterstützt

Gruß

Johannes


----------



## RobiHerb (7 Februar 2013)

*Kein GOTO*

Es ist klar, GOTO entspricht einer Sprunganweisung an ein direktes Ziel. Wer von der AWL kommt oder Assembler gemacht hat, kennt es erst einmal gar nicht anders. 

Aber die Zeit ist nicht stehen geblieben, man hat höhere Sprachen entwickelt mit Kontrollanweisungen wie IF, ELSE, END_IF. 

Diese wurden weiter entwickelt in Konstrukte wie FOR, WHILE, CASE ... bis hin zu foreach xxx in yyy. 

Hinzu kam das Konzept der Blöcke und die seinerzeit geniale neue Forderung
"Eine Funktion hat nur EINEN Eingang und auch nur EINEN Ausgang".

All das dient einzig und allein dazu, die Programme übersichtlicher und damit sicherer zu machen. Der CPU ist es egal, wenn es richtig gemacht wird, woher der Sprung
kommt. Es basiert das "Kein GOTO" also auf Erfahrung, kommt meist aber daher wie ein pädagogisch erhobener Zeigefinger und wie immer fühlen sich die Anfänger stark
und müssen erst noch Lehrgeld zahlen, bis sie lernen "Shit happens".

Wenn es ein kleines Programmchen ist, überblickt es der Entwickler, wenn er mal so eben GOTO sagt, aber wenn später mal jemand anderes was ändert und gar nicht 
bemerkt, dass irgendwo quer rausgesprungen wird, dann ist das Problem gewaltig.


----------



## Markus Rupp (7 Februar 2013)

RobiHerb schrieb:


> Wenn es ein kleines Programmchen ist, überblickt es der Entwickler, wenn er mal so eben GOTO sagt, aber wenn später mal jemand anderes was ändert und gar nicht
> bemerkt, dass irgendwo quer rausgesprungen wird, dann ist das Problem gewaltig.



Was meiner Meinung nach dann ganz klar ein schlecht dokumentiertes Programm darstellt, wenn man das GOTO nicht bemerkt, oder wenn das programm doch sauber kommentiert ist nimmt es der, der das programm nicht sehr ernst die absichtlich hinterlegten kommentare zu lesen.


----------



## Perfektionist (7 Februar 2013)

Rupp schrieb:


> Was meiner Meinung nach dann ganz klar ein schlecht dokumentiertes Programm darstellt, wenn man das GOTO nicht bemerkt, oder wenn das programm doch sauber kommentiert ist nimmt es der, der das programm nicht sehr ernst die absichtlich hinterlegten kommentare zu lesen.


wer dokumentiert denn extra ein GOTO? doch nur der, der sich dessen bewusst ist, dass es allgemein problematisch ist, ein solches zu verwenden.


----------



## hucki (7 Februar 2013)

RobiHerb schrieb:


> ... Aber die Zeit ist nicht stehen geblieben, ...


... und doch hat das GOTO (wie der *Perfektionist* sagt, schon über 30 Jahre) überlebt.
Das hat z.B. die Menüleiste im MS-Office nicht geschafft. (Und die vermisse ich immer noch - gut das es Zusatztools anderer Anbieter gibt.)

Ich wüßte jetzt aus dem Kopf zwar keine Situation, wo ich ein GOTO bevorzugen würde, aber ich find' es einfach nur bekloppt, wenn man freiwillig sagt: "GOTO darf unter keinen Umständen verwendet werden!", obwohl es zum Befehlsumfang gehört.

Da unterstütze ich dann doch eher solche Aussagen:


zotos schrieb:


> ... In der Regel gibt es deutlich bessere (übersichtlichere) Lösungen als GOTO. ...


Denn es gibt nun mal gelegentlich auch Ausnahmen von der Regel.


----------



## Perfektionist (7 Februar 2013)

hucki schrieb:


> ... und doch hat das GOTO (wie der *Perfektionist* sagt, schon über 30 Jahre) überlebt.


naja, einmal in der Dummheit eines Sprachendesigners eingeführt, kann man es ja nicht einfach sterben lassen :?


----------



## bike (7 Februar 2013)

Perfektionist schrieb:


> naja, einmal in der Dummheit eines Sprachendesigners eingeführt, kann man es ja nicht einfach sterben lassen :?



Gut dass es dich gibt.
Wann schreibst du einen Compiler, ohne GOTO und unter TIA?


bike


----------



## RobiHerb (12 Februar 2013)

*Eine aktuelle Diskussion ...*

Hier einmal ein wenig Blick "über den Zaun" in die Welt der professionellen Software:

http://www.codeproject.com/Articles/539179/Some-practices-to-write-better-Csharp-NET-code


Rob


----------



## patx (15 Februar 2013)

*GOTO gehört in die Zeit von Commodore Basic*



Perfektionist schrieb:


> ... mit Commodore-Basic praktisch nicht umsetzbar...


  Na ja, bei so einer "Programmiersprache" war das GOTO noch essentiell nötig, da gab's noch ganz andere "Sünden".

Ich hab z.B. mal meinen Informatik-Leher auf einem VC20 damit verblüfft, das geforderte Programm einer Klassenarbeit in eine einzige Zeile zu packen, indem ich IF-Konstrukte durch Multiplikationen mit -1*Bedingung ersetzt habe. Der Kommentar des Lehrers unter der Note 1 war der Brüller: "Ich hab zwar nicht verstanden warum, aber ich hab es eingegeben und es hat funktioniert."
Dies war aber auch so ziemlich das letzte Mal, dass ich Code geschrieben habe, den andere NICHT verstehen sollten. 
*
Insofern ist GOTO (mit den genannten Ausnahmen von Errorhandling usw. ) ein absolutes NO GO.*


----------

