Unveränderliche Falte

Unveränderliche Falte und unveränderliche Fortpflanzung sind verwandte durch viele moderne Bearbeiter verwendete Bearbeiter-Optimierungen. Eine fortgeschrittene Form der unveränderlichen als spärliche bedingte unveränderliche Fortpflanzung bekannten Fortpflanzung kann Konstanten genauer fortpflanzen und gleichzeitig toten Code entfernen.

Unveränderliche Falte

Unveränderliche Falte ist der Prozess, feste Ausdrücke während der Übersetzung zu vereinfachen. Begriffe in festen Ausdrücken sind normalerweise einfache Druckfehler wie die ganze Zahl, aber können auch Variablen sein, deren Werte, oder Variablen ausführlich gekennzeichnet als unveränderlich nie modifiziert werden. Denken Sie die Behauptung:

i = 320 * 200 * 32;

</Quelle>

Die meisten modernen Bearbeiter würden zwei nicht wirklich erzeugen multiplizieren Instruktionen und einen Laden für diese Behauptung. Statt dessen identifizieren sie Konstruktionen wie diese, und setzen die geschätzten Werte während der Übersetzung (in diesem Fall, 2,048,000) gewöhnlich im Baum der Zwischendarstellung (IR) ein.

In einigen Bearbeitern wird unveränderliche Falte früh getan, so dass Behauptungen wie die Reihe-Initialisierungsprogramme von C einfache arithmetische Ausdrücke akzeptieren können. Jedoch ist es auch üblich, weiter unveränderliche sich faltende Runden in spätere Stufen im Bearbeiter ebenso einzuschließen.

Unveränderliche Falte kann an einem Vorderende eines Bearbeiters auf dem IR Baum getan werden, der die Quellsprache auf höchster Ebene vertritt, bevor es in den Drei-Adressen-Code, oder am Zurückende als ein Zusatz zur unveränderlichen Fortpflanzung übersetzt wird.

Unveränderliche Falte und böse Kompilation

Im Einführen eines bösen Bearbeiters muss Sorge genommen werden, um sicherzustellen, dass das Verhalten der arithmetischen Operationen auf den Gastgeber-Architektur-Matchs dass auf der Zielarchitektur, weil sonst das Ermöglichen unveränderlicher Falte das Verhalten des Programms ändern wird. Das ist von besonderer Wichtigkeit im Fall von Schwimmpunkt-Operationen, deren sich genaue Durchführung weit ändern kann.

Unveränderliche Fortpflanzung

Unveränderliche Fortpflanzung ist der Prozess, die Werte bekannter Konstanten in Ausdrücken während der Übersetzung einzusetzen. Solche Konstanten schließen diejenigen ein, die oben, sowie innere auf unveränderliche Werte angewandte Funktionen definiert sind. Denken Sie den folgenden Pseudocode:

interne Nummer x = 14;

interne Nummer y = 7 - x / 2;

geben Sie y * (28 / x + 2) zurück;

</Quelle>

Das Fortpflanzen x Erträge:

interne Nummer x = 14;

interne Nummer y = 7 - 14 / 2;

geben Sie y * (28 / 14 + 2) zurück;

</Quelle>

Ständig, um sich fortzupflanzen, gibt das folgende nach (der wahrscheinlich weiter durch die tote Codebeseitigung sowohl von x als auch von y optimiert würde.)

interne Nummer x = 14;

interne Nummer y = 0;

kehren Sie 0 zurück;

</Quelle>

Unveränderliche Fortpflanzung wird im Bearbeiter-Verwenden durchgeführt, das Definitionsanalyse-Ergebnisse erreicht. Wenn alle reichenden Definitionen einer Variable dieselbe Anweisung sind, die dieselbe Konstante der Variable zuteilt, dann hat die Variable einen unveränderlichen Wert und kann durch die Konstante ersetzt werden.

Unveränderliche Fortpflanzung kann auch bedingte Zweige veranlassen, zu einer oder mehr vorbehaltlosen Behauptungen zu vereinfachen, wenn der bedingte Ausdruck zum wahren oder falschen während der Übersetzung bewertet werden kann, um das einzige mögliche Ergebnis zu bestimmen.

Die Optimierungen in der Handlung

Unveränderliche Falte und Fortpflanzung werden normalerweise zusammen verwendet, um viele Vereinfachungen und die Verminderungen, durch das Durchschießen von ihnen wiederholend zu erreichen, bis keine Änderungen mehr vorkommen. Denken Sie diesen Pseudocode zum Beispiel:

interne Nummer = 30;

interne Nummer b = 9 - / 5;

interne Nummer c;

c = b * 4;

wenn (c> 10) {\

c = c - 10;

}\

geben Sie c * (60 / a) zurück;

</Quelle>

Die Verwendung unveränderlicher Fortpflanzung einmal, gefolgt von der unveränderlichen Falte, Erträgen:

interne Nummer = 30;

interne Nummer b = 3;

interne Nummer c;

c = 3 * 4;

wenn (c> 10) {\ c = c - 10; }\

geben Sie c * 2 zurück;

</Quelle>

Als und sind zu Konstanten und ihren Werten eingesetzt überall vereinfacht worden sie sind vorgekommen, der Bearbeiter wendet jetzt tote Codebeseitigung an, um sie zu verwerfen, den Code weiter reduzierend:

interne Nummer c;

c = 12;

wenn (12> 10) {\

c = 2;

}\ geben Sie c * 2 zurück;</Quelle>

Unveränderliche Falte wieder anwendend, werden wir folgenden Code bekommen:

interne Nummer c; c = 12;

wenn (Wahr), {\

c = 2; }\ geben Sie c * 2 zurück;</Quelle>

Im obengenannten Code, statt seiner konnte 1 oder jede andere Konstruktion von Boolean abhängig vom Bearbeiter-Fachwerk sein. Mit der traditionellen unveränderlichen Fortpflanzung werden wir nur diese viel Optimierung bekommen. Es kann Struktur des Programms nicht ändern.

Es gibt eine andere ähnliche Optimierung, genannt spärliche bedingte unveränderliche Fortpflanzung, die den passenden Zweig auf der Grundlage davon auswählt. Der Bearbeiter kann jetzt entdecken, dass die Behauptung immer zum wahren bewerten wird, selbst kann beseitigt werden, den Code noch weiter zusammenschrumpfen lassend:

kehren Sie 4 zurück;

</Quelle>

Wenn dieser Pseudocode den Körper einer Funktion eingesetzt hat, konnte der Bearbeiter weiter die Kenntnisse ausnutzen, dass es zur unveränderlichen ganzen Zahl bewertet, um unnötige Anrufe zur Funktion zu beseitigen, weitere Leistungszunahmen erzeugend.

Siehe auch

Weiterführende Literatur


Nationalparks in der Republik Irland / Howard Stern
Impressum & Datenschutz