goto SCL

Amzaun

Level-1
Beiträge
2
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
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?
 
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."
 
...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.).
 
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.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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.
 
Ü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
 
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.
 
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.

:ROFLMAO:
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Was die Exit Anweisung macht ist mir bewusst, nur ist das eben kein Ersatz für goto.

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

oder

Code:
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.
 
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.

:ROFLMAO:
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.
 
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
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Code:
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:
Code:
done := false;
repeat [ Code]
 done := [abbruchbedingung];
until done;
ganz ohne exit und goto. nur dass man halt seine Laufvariable(n) selbst initialisieren und hochzählen muss. Und dass man diese Laufvariablen nicht auf den ersten Blick erkennen kann.
 
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.
 
Zurück
Oben