Wie der Titel sagt,
Eine typische Antwort wäre:
Die Regel, die alle Codetransformationen zulässt, die das beobachtbare Verhalten des Programms nicht ändern
Von Zeit zu Zeit erhalten wir Verhaltensweisen von bestimmten Implementierungen, die dieser Regel zugeordnet sind. Viele Male falsch. Also, was genau ist diese Regel. In der Norm wird diese Regel nicht eindeutig als Abschnitt oder Absatz erwähnt. Was fällt also genau in den Geltungsbereich dieser Regel? Für mich scheint es eine Grauzone zu sein, die vom Standard nicht im Detail definiert wird. Kann jemand die Details unter Berufung auf die Referenzen aus dem Standard näher erläutern?
Hinweis: Kennzeichnen Sie dies als C und C ++, da es für beide Sprachen relevant ist.
Antworten:
Was ist die " als ob " -Regel?
Die " Als-ob " -Regel definiert grundsätzlich, welche Transformationen eine Implementierung in einem legalen C ++ - Programm ausführen darf. Kurz gesagt, alle Transformationen, die das " beobachtbare Verhalten " eines Programms nicht beeinflussen (siehe unten für eine genaue Definition), sind zulässig.
Ziel ist es, Implementierungen die Freiheit zu geben, Optimierungen durchzuführen, solange das Verhalten des Programms mit der vom C ++ - Standard in Bezug auf eine abstrakte Maschine festgelegten Semantik übereinstimmt.
Wo führt der Standard diese Regel ein?
Der C ++ 11 Standard führt die " Als-ob " -Regel in Abschnitt 1.9 / 1 ein:
Eine erklärende Fußnote fügt hinzu:
Was genau schreibt die Regel vor?
In Absatz 1.9 / 5 wird ferner Folgendes festgelegt:
Es ist hervorzuheben, dass diese Einschränkung nur beim "Ausführen eines wohlgeformten Programms" gilt und dass die möglichen Ergebnisse der Ausführung eines Programms, das undefiniertes Verhalten enthält, nicht eingeschränkt sind. Dies wird auch in Absatz 1.9 / 4 explizit ausgeführt:
In Bezug auf die Definition von " beobachtbarem Verhalten " lautet Ziffer 1.9 / 8 schließlich wie folgt:
Gibt es Situationen, in denen diese Regel nicht gilt?
Nach meinem besten Wissen ist die einzige Ausnahme von der " Als-ob " -Regel die Kopier- / Verschiebungselision, die zulässig ist, obwohl der Kopierkonstruktor, der Verschiebungskonstruktor oder der Destruktor einer Klasse Nebenwirkungen haben. Die genauen Bedingungen hierfür sind in Abschnitt 12.8 / 31 angegeben:
quelle
In C11 wird die Regel niemals mit diesem Namen aufgerufen. C definiert jedoch genau wie C ++ das Verhalten in Bezug auf abstrakte Maschinen. Die Als-ob-Regel ist in C11 5.1.2.3p4 und p6 :
quelle
In C, C ++, Ada, Java, SML ... in jeder Programmiersprache, die durch Beschreibung des (normalerweise vielen möglichen, nicht deterministischen) Verhaltens eines Programms (das einer Reihe von Interaktionen an E / A-Ports ausgesetzt ist) genau spezifiziert ist. , gibt es keine eindeutige as-if - Regel .
Ein Beispiel für eine eindeutige Regel ist die, 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 anderes anzugeben, und Sie würden eine andere Sprache erhalten (die manche Leute lieber als "Dialekt" (*) bezeichnen würden. Eine bestimmte Regel dient dazu, bestimmte Verwendungen einer Programmiersprache wie eine bestimmte anzugeben Die grammatikalischen Regeln decken einige Syntaxkonstrukte ab.
(*) Ein Dialekt ist nach Ansicht einiger Linguisten eine Sprache mit einer "Armee". In diesem Zusammenhang könnte dies eine Programmiersprache ohne ein Komitee und eine bestimmte Branche von Compiler-Editoren bedeuten.
Die Als-ob-Regel ist keine eindeutige Regel . Es deckt kein bestimmtes Programm ab und ist nicht einmal eine Regel, die diskutiert, entfernt oder auf irgendeine Weise geändert werden könnte : Die sogenannte "Regel" wiederholt lediglich, dass die Programmsemantik definiert ist und nur portabel (universell) sein kann. definiert in Bezug auf die sichtbaren Wechselwirkungen einer Ausführung des Programms mit der "externen" Welt.
Die Außenwelt kann E / A-Schnittstellen (stdio), eine grafische Benutzeroberfläche oder sogar ein interaktiver Interpreter sein, der den resultierenden Wert einer reinen Anwendungssprache ausgibt. In C und C ++ sind die (vage angegebenen) Zugriffe auf flüchtige Objekte enthalten. Dies ist eine andere Möglichkeit zu sagen, dass einige Objekte an einem bestimmten Punkt streng nach dem ABI (Application Binary Interface) im Speicher dargestellt werden müssen, ohne das ABI jemals explizit zu erwähnen.
Die Definition einer Ausführungsspur , auch sichtbares oder beobachtbares Verhalten genannt, definiert, was unter "Als-ob-Regel" zu verstehen ist. Die Als-ob-Regel versucht es zu erklären, aber auf diese Weise verwirrt sie die Menschen mehr als sie die Dinge klärt, da sie den Ausdruck einer zusätzlichen semantischen Regel gibt, die der Implementierung mehr Spielraum gibt.
Zusammenfassung:
quelle