Wann ist die Kurzschlussbewertung schlecht?

12

Um ein bisschen klarer zu sein, werde ich sagen, dass ich viel Zeit mit verschiedenen Sprachen verbracht habe. Aber bis jetzt wurde es entweder die ganze Zeit verwendet oder es unterstützt es überhaupt nicht.

Jetzt arbeite ich an Projekten, für die VB.net erforderlich ist, und ich sehe, dass es in Bezug auf AND und ANDALSO beide Möglichkeiten bietet . Der erste schließt nicht kurz und der zweite nicht.

Das führt mich zu der Frage, warum? Wenn es so eingerichtet ist, scheint dies zu bedeuten, dass es ziemlich oft vorkommt, dass man den Modus wechseln möchte. Aber ich kann mir keine Situationen vorstellen, in denen es schlecht wäre, Kurzschluss zu verwenden .

Ich weiß, dass dies sehr gut zu einer Option werden könnte. Wenn ich dies also an einem anderen Ort platzieren muss, sag mir einfach, wo.

Obwohl ich hoffe, dass es zumindest eine offizielle Antwort gibt, warum es besser wäre, beide Optionen zu haben, als immer einen Kurzschluss zu machen , wenn er verfügbar ist.

Kit Ramos
quelle

Antworten:

5

Einige Begriffe in einem logischen Ausdruck können Nebenwirkungen haben. Manchmal muss sichergestellt werden, dass alle Nebenwirkungen in der angegebenen Reihenfolge auftreten und keine übersprungen werden. Das Bewertungsergebnis leitet die Logik:

if not (PushAirPlane(thrust) and TurnAirplane(vector)), SimulateCrash(severity)

In anderen Fällen möchten Sie keinen der verbleibenden Begriffe bewerten, wenn eine frühere Bewertung false zurückgibt.

if IsAirborne() and not (PushAirPlane(thrust) and TurnAirplane(vector)), SimulateCrash(severity)

Einige werden / haben argumentiert, dass es eine schlechte Form ist, sich auf das Kurzschlussverhalten im zweiten Beispiel zu verlassen, aber das führt zu Codierungsstil und Glaubenssystemen. Es gibt viele sehr gute Code-Teile auf der Welt, die sich auf fast alle Funktionen einer Sprache stützen, und so ist es auch.

ANDALSO von VB ist knackig und scheint ein Versuch zu sein, die Praxis akzeptabler zu machen.

Wie JimmyJames in seiner Antwort hervorhebt, kann die Kurzschlussbewertung messbare Auswirkungen auf die Leistung haben. Sprachen, die den Mechanismus nicht bereitstellen, bewerten immer jeden Begriff des Ausdrucks, während diejenigen, die ihn bereitstellen, zusätzliche Verzweigungsanweisungen generieren können. In beiden Fällen hängt vieles von der Anzahl der Verarbeitungsschritte ab, die zur Bewertung der einzelnen Begriffe erforderlich sind, sowie von der Compiler- und CPU-Architektur. Normalerweise interessieren Sie sich nicht für solche Dinge, bis Sie einen gemessenen Engpass im Code haben und herausfinden müssen, wie Sie diesen beheben können. Alle Do or Do-Regeln zum Zulassen einer Kurzschlussauswertung in Ihrem Code haben ungefähr die gleiche Wahrscheinlichkeit, langsameren Code zu verursachen, und eine frühzeitige Optimierung kann eine totale Zeitverschwendung sein. Messen Sie also immer und optimieren Sie dann.

jwdonahue
quelle
4
Obwohl es sachlich korrekt ist, ist es kein großartiges Design.
Robert Harvey
2
@RobertHarvey, ich kann kein Kontrollsystem schreiben, das keine Nebenwirkungen hat, und ich kann das System nicht richtig steuern, wenn ich nicht auf Ergebnisse reagiere. Mit anderen Worten, überwinde es;).
Jwdonahue
7
Nein, aber Sie können die Ergebnisse dieser Nebenwirkungen booleschen Variablen zuordnen, diese Variablen in Ihrem ifZustand überprüfen und trotzdem kurzschließen. Ich stimme zu, dass es in gewisser Weise eine stilistische Unterscheidung ist, aber es hat die Tugend, die Dinge kristallklar zu machen.
Robert Harvey
3
@jwdonahue Es ist in Ordnung, "große Wörter" zu verwenden, wenn das Risiko von Verwirrung gering ist. Das Risiko von Verwechslungen und dem Fehlen bestimmter Nuancen eines solchen Codeblocks ist extrem hoch und kann für die Logik katastrophal sein. Es ist nie gut, den Leseentwickler zum Nachdenken zu bringen.
jpmc26
5
"Einige Begriffe in einem logischen Ausdruck können Nebenwirkungen haben" - Obwohl diese einleitende Aussage korrekt ist, kann diese Antwort meiner Meinung nach nicht darauf hinweisen, dass es schlecht ist , sich auf Nebenwirkungen zu verlassen . In der Tat weitaus schlimmer, als sich auf eine Kurzschlussbewertung zu verlassen, um falsche Bewertungen zu verhindern. Was diese Antwort nahelegt, kann eine schlechte Form sein.
aroth
20

Anscheinend geht es bei Ihrer Frage nicht darum, ob ein Kurzschluss im Allgemeinen gut oder schlecht ist, sondern darum, warum VB.NET Betreibern mit und ohne diesen Kurzschluss zur Verfügung stellt. In diesem Sinne die Antwort auf

Wann ist die Kurzschlussbewertung schlecht?

ist einfach: wenn es die Abwärtskompatibilität verletzt .

Ok, jetzt können Sie sagen, dass VB.NET nicht sehr abwärtskompatibel mit altem VB6 oder VBA ist, jedoch zumindest bestimmte Teile der Sprache. Die Entscheidung von Microsoft, die alte UND- und ODER-Semantik (ohne Kurzschluss) beizubehalten, führte dazu, dass beim Portieren alter VB-Programme nach VB.NET eine große Fehlerkategorie weniger wahrscheinlich auftrat.

Auf der anderen Seite haben VB.NET-Sprachdesigner wahrscheinlich Ihre Meinung darüber geteilt, dass Kurzschlüsse eine gute Sache sind. Wenn ich mich richtig erinnere, versorgten die ersten VB.NET-Vorabversionen AND- oder OR-Operatoren mit Kurzschlüssen, aber das Feedback der Entwickler muss so schlecht gewesen sein, dass MS diese Entscheidung zurückzog, bevor VB.NET 1.0 erschien. Daher haben die Designer beschlossen, es in Bezug auf neue Schlüsselwörter ANDALSOund ORELSEals Kompromiss zwischen Abwärtskompatibilität und Nützlichkeit zu implementieren .

IMHO war das eine gute Entscheidung. Ich musste im letzten Jahrzehnt mehrere ältere Programme portieren, und nicht für jeden logischen Ausdruck, einschließlich UND und / oder ODER (Wortspiel beabsichtigt), eine Analyse der Auswirkungen durchführen zu müssen, machte diese Aufgabe viel einfacher und wirtschaftlicher. Wenn ich andererseits einen neuen logischen Ausdruck in VB.NET schreiben muss, sind meine Standardauswahl für die Operatoren die Kurzschlussformen, wie ich es von C, C ++, C # usw. gewohnt bin, und es erlaubt Ich schreibe mehrere Redewendungen in prägnanterer Form (auch wenn ANDALSO 4 Zeichen mehr zum Tippen benötigt).

Wenn Sie nicht überzeugt sind, empfehle ich, Joel Spolskys großartigen Artikel über Martian Headsets zu lesen. Deshalb können frühe Entwurfsentscheidungen in der Softwareentwicklung nicht einfach widerrufen werden, nachdem die betreffende Komponente, Sprache oder API eine Benutzerbasis einer bestimmten Größe erreicht hat .

Doc Brown
quelle
Ok, dies ist ein Scherz und der Link zu Martian Headsets scheint überhaupt nicht verwandt zu sein.
Jwdonahue
6
@jwdonahue: Ich habe keine Ahnung, warum du denkst, dass dies ein Scherz ist, ganz im Gegenteil. In dem Artikel über Martian Headsets geht es darum, warum einige Designentscheidungen in der Softwareentwicklung, die vor einigen Jahrzehnten getroffen wurden, nicht einfach widerrufen werden können, nachdem die betreffende Komponente, Sprache oder API eine Benutzerbasis einer bestimmten Größe erreicht hat. Ist die Analogie nicht wirklich so schwer zu verstehen? VB6 war in der Vergangenheit sehr beliebt, und ich bin sicher, dass immer noch hunderttausende Unternehmen auf der Welt geschäftskritische Apps in VB6 oder VBA haben.
Doc Brown
Ich verstehe nicht ganz, wie der Artikel "Mars-Kopfstützen" wirklich passt. Um die Interoperabilität zwischen X und Y (z. B. Schrauben und Muttern) sicherzustellen, müssen separate Standards für X und Y festgelegt werden, sodass eine Worst-Case-Mutter eine etwas schlechter als die angegebene Schraube aufnehmen kann und umgekehrt. Man sollte versuchen, die Spezifikationen zu schreiben, um zu vermeiden, dass Schrauben oder Muttern unnötig teuer werden oder dass zwischen Schrauben und Muttern unnötig ein Gefälle auftritt. Wenn Sie jedoch beide Hälften getrennt angeben, können Sie die Interoperabilität weitaus zuverlässiger sicherstellen als wenn Sie versuchen, eine Spezifikation zu haben dienen beide Seiten.
Superkatze
3
@supercat: Hier geht es darum, dass bereits Billionen von Muttern (oder Zeilen mit VB6-Code) vorhanden sind und verwendet werden. Jetzt werden die Schrauben (oder in diesem Fall der VB-Compiler) durch eine neuere Generation ersetzt. Wenn die vorhandenen Muttern nur für nicht metrische Schrauben passen, ist es nicht wirtschaftlich, nur die neueren Schrauben als metrisches System zu verwenden.
Doc Brown
tl; dr: VB ist ein Dialekt von BASIC, einer Sprache aus dem Jahr 1964, und in BASIC wird die AndOperation weder kurzgeschlossen, noch in SQL (1974), FORTRAN (1956) oder Pascal (1970).
Ben
3

Wann ist die Kurzschlussbewertung schlecht?

Sie werden schlecht , sobald Sie sich auf Nebenwirkungen von Ausdrücken verlassen, von denen Sie erwarten, dass sie bei der Bewertung eines booleschen Gesamtergebnisses ausgeführt werden.

πάντα ῥεῖ
quelle
1

Vorsichtsmaßnahme : Dies ist insofern etwas esoterisch, als Entwickler sich in fast allen Fällen keine Sorgen machen sollten. Aber ... aufgrund der bedingten Auswertung kann es zu Leistungseinbußen kommen, da bei der Ausführung Verzweigungen auftreten. Eine nicht kurzschließende Operation verzweigt sich nicht und ist vorhersehbarer.

Der Grund, warum dies selten von Bedeutung ist, ist, dass die Kosten typischerweise gering sind und normalerweise auch durch die Kosten für die Bewertung der zweiten (oder dritten usw.) Bedingung aufgewogen werden. Dies ist in rechenintensiven Routinen immer dann nur dann von Bedeutung, wenn eine hohe Leistung erforderlich ist, und es spielt dann möglicherweise auch noch keine Rolle.

JimmyJames
quelle
Ich denke, man kann bisher nur eine logische Aussage optimieren, irgendwann muss man sich verzweigen.
Jwdonahue
@jwdonahue Ich verstehe deinen Standpunkt nicht. Es tut uns leid.
JimmyJames
Wir sprechen hier über kombinatorische Logik. Kurzschlussbewertung oder nicht, Sie haben einen oder mehrere Begriffe, die abhängig vom Ergebnis eines früheren Begriffs bewertet werden müssen. Daher ist eine Verzweigung beteiligt.
Jwdonahue
1
@jwdonahue Natürlich, aber jeder Kurzschluss ist ein zusätzlicher Zweig. In bestimmten Szenarien ist die Ausführung von zwei Ausdrücken (z. B.) schneller als die Überprüfung des Ergebnisses des ersten vor der Ausführung des zweiten, auch wenn der zweite häufig irrelevant ist. Auch dies ist selten wichtig. Der Fall, den mir jemand dafür gemacht hat, war für Dinge wie die Matrixmultiplikation, bei denen Sie viele einfache Bewertungen haben.
JimmyJames
1
Ich habe meine Antwort mit Gutschrift an Sie aktualisiert.
Jwdonahue
0

Pascal hat nicht definiert, ob UND und ODER Kurzschlussauswertung verwenden oder nicht, was Ihnen das Schlimmste aus beiden Welten gibt.

C und C ++ haben bitweise Operationen & und | die Ihnen in der Praxis nicht kurzschließen. Und Compiler können nach Belieben bewerten, ob dies keinen erkennbaren Unterschied macht.

gnasher729
quelle
@Deduplicator: Wie bereits erwähnt, hat Pascal nicht definiert, ob AND / OR eine Kurzschlussauswertung verwendet. Das bedeutet "nicht wissen".
Superkatze