Was genau ist die „Als-Ob“-Regel?

Lesezeit: 9 Minuten

Was genau ist die „Als Ob Regel
Alok Speichern

Wie der Titel sagt:

Was genau ist die „Als-Ob“-Regel?

Eine typische Antwort, die man bekommen würde, ist:

Die Regel, die alle Codetransformationen zulässt, die das beobachtbare Verhalten des Programms nicht ändern

Von Zeit zu Zeit erhalten wir immer wieder Verhaltensweisen von bestimmten Implementierungen, die dieser Regel zugeschrieben werden. Viele Male falsch.

Also, was genau ist diese Regel? Der Standard erwähnt diese Regel nicht eindeutig als Abschnitt oder Absatz, was genau fällt also in den Geltungsbereich dieser Regel?

Mir kommt das wie eine Grauzone vor, die nicht im Detail durch die Norm definiert ist. Kann jemand die Details näher erläutern und die Referenzen aus der Norm zitieren?

Hinweis: Markieren Sie dies sowohl als C als auch als C++, da es für beide Sprachen relevant ist.

  • Es bezieht sich auf die abstrakte Maschine.

    – Alexey Frunze

    30. März 2013 um 12:00 Uhr

  • Markieren Sie dies sowohl als C als auch als C++, da es für beide Sprachen relevant ist„Es ist in jeder Sprache relevant.

    – Neugieriger

    28. Mai 2019 um 13:02 Uhr

  • @AlexeyFrunze “Es bezieht sich auf die abstrakte Maschine„Es bezieht sich auf den Zustand der „abstrakten Maschine“, die ein Werkzeug und kein Zweck ist und in Bezug auf die Konformität irrelevant ist, weil sie „abstrakt“ ist, also ein Spezifikationswerkzeug, nicht real.

    – Neugieriger

    28. Mai 2019 um 13:04 Uhr

1647263413 208 Was genau ist die „Als Ob Regel
Andy Prowl

Was ist der “als ob” Regel?

Die “als ob” Die Regel definiert im Grunde, welche Transformationen eine Implementierung an einem legalen C++-Programm durchführen darf. Kurz gesagt, alle Transformationen, die sich nicht auf die “beobachtbares Verhalten” (genaue Definition siehe unten) sind erlaubt.

Das Ziel besteht darin, Implementierungen die Freiheit zu geben, Optimierungen durchzuführen, solange das Verhalten des Programms mit der durch den C++-Standard spezifizierten Semantik in Bezug auf eine abstrakte Maschine konform bleibt.


Wo führt der Standard diese Regel ein?

Der C++11-Standard führt die “als ob” Regel in Absatz 1.9/1:

Die semantischen Beschreibungen in dieser Internationalen Norm definieren eine parametrisierte nichtdeterministische abstrakte Maschine. Diese Internationale Norm stellt keine Anforderungen an die Struktur konformer Implementierungen. Insbesondere müssen sie die Struktur der abstrakten Maschine nicht kopieren oder emulieren. Vielmehr sind konforme Implementierungen erforderlich, um (nur) die zu emulieren beobachtbares Verhalten der abstrakten Maschine, wie unten erklärt.

Außerdem fügt eine erläuternde Fußnote hinzu:

Diese Bestimmung wird manchmal als „Als-ob“-Regelung bezeichnet, weil es einer Implementierung freisteht, jede Anforderung dieser Internationalen Norm zu missachten, solange das Ergebnis so ist, als ob die Anforderung erfüllt worden wäre, soweit dies aus dem beobachtbaren Verhalten des Programms bestimmt werden kann. Beispielsweise muss eine tatsächliche Implementierung einen Teil eines Ausdrucks nicht auswerten, wenn daraus abgeleitet werden kann, dass sein Wert nicht verwendet wird und dass keine Nebeneffekte erzeugt werden, die das beobachtbare Verhalten des Programms beeinträchtigen.


Was schreibt die Regel genau vor?

Absatz 1.9/5 spezifiziert weiter:

Eine konforme Implementierung Ausführen eines wohlgeformten Programms soll dasselbe beobachtbare Verhalten erzeugen wie eine der möglichen Ausführungen der entsprechenden Instanz der abstrakten Maschine mit demselben Programm und derselben Eingabe. Wenn jedoch eine solche Ausführung eine undefinierte Operation enthält, stellt diese Internationale Norm keine Anforderung an die Implementierung, die dieses Programm mit dieser Eingabe ausführt (nicht einmal in Bezug auf Operationen, die der ersten undefinierten Operation vorausgehen).

Es ist erwähnenswert, dass diese Einschränkung gilt, wenn “Ausführen eines wohlgeformten Programms” nur, und dass die möglichen Ergebnisse der Ausführung eines Programms, das undefiniertes Verhalten enthält, nicht eingeschränkt sind. Dies wird auch in Ziffer 1.9/4 explizit gemacht:

Bestimmte andere Operationen werden in dieser Internationalen Norm als undefiniert beschrieben (z. B. die Auswirkung des Versuchs, ein const-Objekt zu ändern). [ Note: This International Standard imposes no requirements on
the behavior of programs that contain undefined behavior
. —end note ]

Abschließend zur Definition von „beobachtbares Verhalten“ lautet Absatz 1.9/8 wie folgt:

Die Mindestanforderungen an eine konforme Implementierung sind:

— Zugriffe auf flüchtige Objekte werden streng nach den Regeln der abstrakten Maschine ausgewertet.

— Bei Programmende müssen alle in Dateien geschriebenen Daten mit einem der möglichen Ergebnisse identisch sein, die die Ausführung des Programms gemäß der abstrakten Semantik hervorgebracht hätte.

— Die Eingabe- und Ausgabedynamik von interaktiven Geräten muss so erfolgen, dass eine Aufforderungsausgabe tatsächlich geliefert wird, bevor ein Programm auf eine Eingabe wartet. Was ein interaktives Gerät ausmacht, ist implementierungsdefiniert.

Diese werden gemeinsam als beobachtbares Verhalten des Programms bezeichnet. [ Note: More stringent
correspondences between abstract and actual semantics may be defined by each implementation. —end
note
]


Gibt es Situationen, in denen diese Regel nicht gilt?

Meines Wissens nach die einzige Ausnahme von der “als ob” Regel ist das Weglassen von Kopieren/Verschieben, was erlaubt ist, obwohl der Kopierkonstruktor, der Verschiebekonstruktor oder der Destruktor einer Klasse Seiteneffekte haben. Die genauen Bedingungen dafür sind in Abschnitt 12.8/31 angegeben:

Wenn bestimmte Kriterien erfüllt sind, darf eine Implementierung die Copy/Move-Konstruktion eines Klassenobjekts weglassen, auch wenn der für den Kopier-/Verschiebevorgang ausgewählte Konstruktor und/oder der Destruktor für das Objekt Seiteneffekte haben. […]

  • Ich habe dieses Zitat gesehen. Was nicht klar ist, ist die Definition von beobachtbarem Verhalten. Was genau ist ein beobachtbares Verhalten? Die Elision von Kopien, die eine Ausnahme von der Als-ob-Regel darstellt, ist ziemlich bekannt und nicht wirklich Teil meiner Frage.

    – Alok Speichern

    30. März 2013 um 12:02 Uhr


  • @AlokSave: Nun, im C-Standard sehen wir “Zugriff auf ein flüchtiges Objekt, Ändern eines Objekts, Ändern einer Datei oder Aufrufen einer Funktion, die eine dieser Operationen ausführt, sind alles Nebeneffekte”. Vermutlich gibt es etwas Äquivalentes in den C++-Standards. Informell schätze ich “alles, was seine Interaktion mit der Außenwelt ändert”.

    – Oliver Charlesworth

    30. März 2013 um 12:05 Uhr


  • Jedes Verhalten, das den Zustand der abstrakten Maschine ändert (also etwas, das eine übergebene oder globale Variable ändert oder E/A-Geräte liest und schreibt).

    – Mats Petersson

    30. März 2013 um 12:05 Uhr

  • Bedeutet dies, dass das Löschen einer Endlosschleife, die nichts tut, erlaubt ist, solange danach nichts Beobachtbares passiert?

    – Harald

    30. März 2013 um 13:36 Uhr

  • Besonders hervorzuheben ist, dass dies nur für gilt legale Programme. Alles Aufrufende undefiniertes Verhalten ist ausdrücklich von jeglicher Deckung ausgeschlossen.

    – Vonbrand

    30. März 2013 um 14:59 Uhr

Was genau ist die „Als Ob Regel
Antti Haapala – Слава Україні

In C11 wird die Regel niemals mit diesem Namen bezeichnet. Allerdings definiert C, genau wie C++, das Verhalten in Form einer abstrakten Maschine. Die Als-Ob-Regel ist in C11 5.1.2.3p4 und p6:

  1. In der abstrakten Maschine werden alle Ausdrücke so ausgewertet, wie es die Semantik vorgibt. Eine tatsächliche Implementierung muss einen Teil eines Ausdrucks nicht auswerten, wenn daraus abgeleitet werden kann, dass sein Wert nicht verwendet wird und dass keine erforderlichen Nebeneffekte erzeugt werden (einschließlich solcher, die durch das Aufrufen einer Funktion oder den Zugriff auf ein flüchtiges Objekt verursacht werden).

  2. […]

  3. Die Mindestanforderungen an eine konforme Implementierung sind:

    • Zugriffe auf volatile Objekte werden streng nach den Regeln der abstrakten Maschine ausgewertet.
    • Bei Programmende müssen alle in Dateien geschriebenen Daten mit dem Ergebnis identisch sein, das die Ausführung des Programms gemäß der abstrakten Semantik hervorgebracht hätte.
    • Die Ein- und Ausgabedynamik von interaktiven Geräten muss wie in angegeben erfolgen 7.21.3. Die Absicht dieser Anforderungen besteht darin, dass eine ungepufferte oder zeilengepufferte Ausgabe so schnell wie möglich erscheint, um sicherzustellen, dass Aufforderungsmeldungen tatsächlich erscheinen, bevor ein Programm auf eine Eingabe wartet.

    Dies ist das beobachtbare Verhalten des Programms.

In C, C++, Ada, Java, SML … in jeder Programmiersprache, die durch die Beschreibung des (normalerweise vielen möglichen, nicht deterministischen) Verhaltens (der Verhaltensweisen) eines Programms (das einer Reihe von Interaktionen an E / A-Ports ausgesetzt ist) gut spezifiziert ist , es gibt keine eindeutige Als-Ob-Regel.

Ein Beispiel für unterscheidbar Regel ist diejenige, die besagt, dass eine Division durch Null eine Ausnahme auslöst (Ada, Caml) oder eine Null-Dereferenzierung eine Ausnahme auslöst (Java). Sie könnten die Regel ändern, um etwas anzugeben anders und Sie würden mit einer anderen Sprache enden (die manche Leute lieber als “Dialekt” bezeichnen würden) . Es gibt eine eigene Regel, um einige unterschiedliche Verwendungen einer Programmiersprache zu spezifizieren wie eine eindeutige grammatikalische Regelabdeckung etwas

Syntaxkonstrukte.

Laut einigen Linguisten ist ein Dialekt eine Sprache mit einer “Armee”. in diesem Zusammenhang könnte das eine Programmiersprache ohne Komitee und eine bestimmte Branche von Compiler-Editoren bedeuten. Die Als-Ob-Regel ist keine eigenständige Regel; es deckt kein bestimmtes Programm ab und

ist nicht einmal eine Regel, die diskutiert, entfernt oder in irgendeiner Weise geändert werden könnte

: Die sogenannte “Regel” wiederholt einfach, dass die Programmsemantik definiert ist und nur portabel (universell) definiert werden kann, in Bezug auf die sichtbaren Interaktionen einer Ausführung des Programms mit der “externen” Welt. Die externe Welt können E/A-Schnittstellen (stdio), eine GUI, sogar ein interaktiver Interpreter sein, die den resultierenden Wert einer reinen Anwendungssprache ausgeben. In C und C++ umfasst dies die (vage spezifizierten) Zugriffe auf flüchtige Objekte, was eine andere Art zu sagen ist, dass einige Objekte an einem bestimmten Punkt im Speicher streng nach dem ABI (Application Binary Interface) dargestellt werden müssen, ohne dass das ABI jemals explizit erwähnt wird.Die Definition dessen, was ein ist Spur der Hinrichtung , auch sichtbares oder beobachtbares Verhalten genannt, definiert, was mit „Als-ob-Regel“ gemeint ist. Die Als-Ob-Regel

versucht

  • zu erklären, aber damit eher verwirrend als aufklärend, da es den Eindruck erweckt, eine semantische Zusatzregel zu sein, die der Umsetzung mehr Spielraum gibt.
  • Zusammenfassung:
  • Die sogenannte „Als-ob-Regel“ lockert keine Beschränkungen für Implementierungen.

  • Sie können die Als-ob-Regel in keiner Programmiersprache entfernen, die in Bezug auf sichtbares Verhalten (Ausführungsspuren, die für die Interaktion mit der Außenwelt erstellt wurden) spezifiziert ist, um einen bestimmten Dialekt zu erhalten. Sie können die Als-ob-Regel keiner Programmiersprache hinzufügen, die nicht im Hinblick auf das sichtbare Verhalten spezifiziert ist.

    Wenn die Leute glauben, dass ich falsch liege und es eine eindeutige “Als-ob-Regel” gibt, warum versuchen sie dann nicht, eine Variante von C++ (ein Dialekt) ohne diese “Regel” zu beschreiben? Was würde die C++-Spezifikation ohne sie überhaupt bedeuten? Es wäre absolut unmöglich zu sagen, ob ein Compiler konform ist.

    Oder sogar konform zu definieren.

  • – Neugieriger

    22. Februar 2020 um 3:24 Uhr

    Die “Als-Ob”-Regel impliziert, dass in jeder Situation, in der eine potenziell nützliche Optimierung das Programmverhalten beeinflussen könnte, entweder die Optimierung verboten werden müsste oder jede Kombination von Aktionen, die zu dieser Situation führen, als UB gekennzeichnet werden müsste.

  • – Superkatze 6. Juli 2021 um 22:51 Uhr es gibt keine eindeutige Als-Ob-Regel Ähm, falsch. Die „Als-Ob-Regel“ ist sogar in der

    Index des C11-Standards als – warten Sie darauf –

    die „Als-ob-Regel“

1001660cookie-checkWas genau ist die „Als-Ob“-Regel?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy