Domino 9 und frühere Versionen > Entwicklung
Voraussetzungen für [Strg][Pause]
Semeaphoros:
Ja, habe ich.
Leider ist die seit rund 25 Jahren übliche C-ische Architektur so ausgelegt, dass Parameter - auch bei Aufrufen von Subroutinen/Functions - auf dem Stack liegen. Die Intel-Prozessoren haben genau für diese (von mir aus hirnverbrannte) Architektur den BasePointer (BP-Register) eingerichtet. Das Goto ist ein simpler JMP, das ist richtig, der IF-Block ist aber schon etwas komplizierter, auch wenn ich Dir jetzt nicht auswendig sagen kann, wie der häufig implementiert wird. Beim Wend ist es definitiv so, dass dort Zwischenresultate vom Stack geholt werden und ausgewertet werden. Einen Memory-Leak, den man bei solchen wilden Gotos noch provozieren könnte, befürchte ich jetzt hier nicht, aber ein Stack-Missbrauch, damit ist zu rechnen. Natürlich kann der LS-Code so angelegt sein, dass mit solchen Konstrukten gerechnet wird und diese abgefangen werden, verlassen würd ich mich aber nicht darauf.
BTW: Diese Architektur ist weitgehend für die im Zusammenhang mit den Sicherheitslücken immer wieder erwähnten "Buffer Overflow"s verantwortlich, wird die Parameterlänge aus irgend einem Grund nicht korrekt berechnet, bekommt man über die Daten die Möglichkeit, Rücksprungadressen zu ändern und damit den Code zu manipulieren.
koehlerbv:
Oops - buffer overflow unter Zuhilfenahme des LS-Interpreters ? Jetzt wird es aber gewagt, Jens ;)
Goto ist ein ausdrückliches (wenn auch meist äusserst hässliches) Konstrukt der BASIC-Dialekte. Eine saubere Umsetzung der Standards vorausgesetzt, darf es dabei also keinerlei Probleme geben.
Ich selbst verzichte soweit als möglich auf die Verwendung von Goto (oder wilder Sprünge in anderen Sprachen). Manchmal heisst es aber, bei sehr komplexen Routinen abzuwägen, ob man immer weiter verschachtelt oder immer neue Subs / Functions aufruft, oder bei einer immer gleich bleibenden Bedingungen den weiteren Abfragemechanismus überspringt und mittels Goto "alles auf Anfang" setzt und damit auf das garantierte Anschwellen der Stacks verzichtet.
Meine nun durchaus langjährige) Erfahrung (mit der nochmaligen Betonung: Für jedes Goto, auch wenn im Sprachumfang vorhanden, braucht es schon eine sehr triftige Begründung !) sagt: Goto bewirkt keine Memory leaks noch hat es andere negative Auswirkungen (ausser einem "unsauberen" Code - zugegebenermassen !). Hierbei geht es natürlich nicht um Erfahrungen mit Routinen, die 15 Dokumente bearbeiten und dann fertig sind. Aber das setze ich jetzt mal als bekannt voraus.
Es gab sogar Fälle, in denen ein JUMP (egal wie in der Programmiersprache nun tatsächlich genannt) geholfen hat, Probleme mit sich aufblähenden Stacks zu vermeiden half und enorme bottle necks beseitigte. Nochmals: Aber nur, wenn es nicht anders vermeidbar war. Sauber ist sowas an sich nicht.
Bernhard
Semeaphoros:
Nein, nein, nicht mit LS Buffer Overflow, wollte nur sagen, dass die beschriebene Architektur dieses Problem ermöglicht, da muss man aber lower level Sprache zu Hilfe nehmen, um das ausnutzen zu können, war nur eine Randbemerkung.
Zum Goto: das ist ein Basic-Konstrukt, ist aber nicht überall erlaubt. In den ursprünglichen Normen ist Goto nicht gestattet zum Sprung aus einem Zweig eines If, egal ob aus dem Then-Zweig oder aus dem Else Zweig. Weiter ist Goto nach ursprünglicher Sprachdefinition nicht gestattet zum Verlassen irgendwelcher Schlaufen. Für letzteres wurde dann später in Anlehnung an andere Sprachen das Exit Loop eingeführt.
koehlerbv:
--- Zitat von: Semeaphoros am 07.01.05 - 21:25:29 ---Zum Goto: das ist ein Basic-Konstrukt, ist aber nicht überall erlaubt.
--- Ende Zitat ---
Ein Zitat aus einer LS-Doku oder ein Code-Schnipsel. der das Gegenteil beweist, und ich bin fein still. Alternativ akzeptiere ich auch gerne einen rekompilierten VB-Abschnitt (sowas sollte man mal gemacht haben) ;D
Und nochmals: Für den Einsatz von Goto braucht man mindestens hundert verdammt gute Gründe, sonst ist das grottenschlechter Code.
Und Jens und ich brauchen uns doch nicht wegen grottenschlechtem Code zu hauen, oder ? ;)
Bernhard
0xse:
Im Endeffekt sind If/Else, Do/While auch nur Abfrage + Goto Kombinationen. Sind also Platzhalter um es dem Entwickler zu ermöglichen übersichtlicher zur programmieren. Aber das ist ja gar nicht das Problem ^^ Das Script läuft ohne Probleme oder Fehler durch. Aber trotzdem lässt es sich immer noch nicht abbrechen.
Navigation
[0] Themen-Index
[#] Nächste Seite
[*] Vorherige Sete
Zur normalen Ansicht wechseln