Was genau ist der "als-ob" - Regel?
Wie der Titel sagt,
Eine typische Antwort würde man erhalten:
Die Regel, die erlaubt, dass jede und alle code-Transformationen, die sich nicht ändern das beobachtbare Verhalten des Programms
Wir von Zeit zu Zeit immer Verhalten von bestimmten Implementierungen, die zugeschrieben werden, um diese Regel. Viele Male falsch. Also, was genau ist diese Regel. Der standard ist nicht eindeutig erwähnen diese Regel ein Abschnitt oder Absatz, also was genau fällt unter den Anwendungsbereich dieser Regel? Mir scheint es wie eine graue Fläche, die nicht im detail definiert durch die Norm. Kann mal jemand näher auf die details, unter Berufung auf die Hinweise aus der standard?
Anmerkung: dieser Tagging als C und C++ sowohl, weil es für beide Sprachen.
- Es bezieht sich auf die abstrakte Maschine.
- "Dieser Tagging als C und C++ sowohl, weil es für beide Sprachen" Es ist relevant, in welcher Sprache.
- bezieht sich auf die abstrakte Maschine", Es bezieht sich auf den Zustand der "abstrakten Maschine" ein Werkzeug und nicht ein Ende, und irrelevant im Begriff des Anpassungsprozesses, weil es "Abstrakt" ist ein Spezifikation-tool nicht wirklich.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Was ist die "als-ob - " - Regel?
Den "als-ob - " - Regel grundsätzlich definiert, welche Transformationen eine Implementierung durchführen darf, auf eine rechtliche C++ - Programm. Kurz gesagt, alle Transformationen, die sich nicht auf ein Programm "beobachtbare Verhalten" (siehe weiter unten für eine genaue definition) sind erlaubt.
Das Ziel ist es, dass Implementierungen die Freiheit, um Optimierungen durchzuführen, solange das Verhalten des Programms bleibt kompatibel mit der Semantik angegeben, die von der C++ - Standard im Sinne einer abstrakten Maschine.
Wo kommt die Standard einführen dieser Regel?
Dem Standard C++11 führt die "als-ob - " - Regel in Absatz 1.9/1:
Auch eine erklärende Fußnote ergänzt:
Was bedeutet der Regel Mandat genau?
Absatz 1.9/5 weitere gibt:
Lohnt es sich zu betonen, dass diese Einschränkung gilt, wenn "ausführen ein wohlgeformtes Programm" nur, und dass die möglichen Ergebnisse der Ausführung eines Programms enthält Undefiniertes Verhalten sind zwanglos. Dies ist ausdrücklich in Paragraph 1.9/4:
Schließlich, in Bezug auf die definition von "beobachtbare Verhalten", Absatz 1.9/8 geht wie folgt:
Gibt es Situationen, in denen diese Regel nicht gilt?
Zu den besten meines Wissens, die einzige Ausnahme von der "als-ob - " Regel kopieren/verschieben elision, was erlaubt ist, selbst wenn der copy-Konstruktor, move-Konstruktor oder Destruktor einer Klasse Nebenwirkungen haben. Die genauen Bedingungen für diese sind angegeben in Paragraph 12.8/31:
In C11 die Regel ist, nie so genannt. Aber C, wie C++, definiert das Verhalten im Sinne der abstrakten Maschine. Die als-ob-Regel ist in C11 5.1.2.3p4 und p6:
In C, C++, Ada, Java, SML... in jeder anderen Programmiersprache auch angegeben werden, durch die Beschreibung der (in der Regel viele mögliche, nicht-deterministisch) Verhalten(s) eines Programms (ausgesetzt Interaktionen auf der I/O-ports), es gibt keine eindeutige as-if-Regel.
Beispiel verschiedene Regel ist derjenige, der sagt, dass eine division durch null löst eine Ausnahme (Ada, Caml) oder eine null-Dereferenzierung wirft eine exception (Java). Sie könnte sich ändern, die Regel angeben, so etwas sonst und Sie würde am Ende mit einer anderen Sprache (einige Menschen würden eher einem "Dialekt"(*). Eine eindeutige Regel gibt es zu spezifizieren, einige distinct verwendet eine Programmiersprache wie eine ausgeprägte grammatische Regel Abdeckung einige syntax-Konstrukte.
(*) Ein Dialekt, der nach einigen Linguisten ist eine Sprache mit einer "Armee". in diesem Kontext kann dies bedeuten, dass eine Programmiersprache, die ohne einen Ausschuss und eine spezifische Branche der compiler Editoren.
Die wie-wenn Regel ist keine deutliche Regel; es gilt nicht für jedes Programm im besonderen und ist nicht einmal eine Regel, die besprochen werden könnten, entfernt oder in irgendeiner Weise verändert: die sogenannte "Regel" einfach bekräftigt, dass die Programm-Semantik definiert ist, und kann nur Mobil (universell) definiert, in der Bezeichnung des sichtbaren Interaktionen einer Ausführung des Programms mit der "außen" - Welt.
Der externen Welt werden können I/O-Schnittstellen (stdio), einer GUI, die auch eine interaktive interpreter, dass die Ausgabe der resultierende Wert eines reinen applicative language. In C und C++ gehören auch die (vage angegeben) Zugriffe auf volatile-Objekte, die eine andere Art zu sagen, dass einige Objekte an einem bestimmten Punkt vertreten sein müssen in-memory-streng nach dem ABI (Application Binary Interface), ohne jemals zu erwähnen das ABI explizit.
Die definition, was ist ein trace der Ausführung, auch genannt die sichtbaren oder beobachtbaren Verhaltens definiert, was gemeint ist, durch "als-ob-Regelung". Die wie-wenn Regel versucht es zu erklären, aber damit es die Menschen verwirrt mehr als es klärt die Dinge, wie es der Ausdruck des seins eine zusätzliche semantische Regel, die mehr Spielraum bei der Umsetzung.
Zusammenfassung: