2016-04-16 8 views
0

Nehmen Optimierer (allgemein gesprochen hier) meinen c/C++ - Code und schreiben besseren c/C++ - Code oder übersetzen sie ihn direkt in Assembler und optimieren ihn dann. Oder ist es eine Kombination?Was optimiert ein Optimierer C++ oder Assembly

EDIT: Ich bin mit gcc (aber ich würde gerne wissen, was andere auch)

+0

Welche besonderen Optimierer haben Sie im Hinterkopf? –

+0

@KerrekSB unter Verwendung von gcc – DarthRubik

Antwort

3

Optimizers kann auf verschiedenen Ebenen, aber in der Regel werden sie nicht neu lesbaren Code erzeugen (wenn auch manchmal mit anderen Sprachen geschieht, wie JavaScript zum Beispiel.)

GCC erzeugt eine Zwischendarstellung:

http://www.tldp.org/HOWTO/GCC-Frontend-HOWTO-4.html

Optimierungen werden dann auf diese Struktur angewendet. Sehen Sie hier, zum Beispiel:

https://gcc.gnu.org/onlinedocs/gccint/Tree-SSA.html

Von dort das Backend es bis zur endgültigen Maschinencode übersetzt (obwohl ich diesen Teil glaube auch Optimierungen beinhaltet, wie auch.)

+0

Andere Compiler, z.B. clang, verwende auch Zwischendarstellungen dessen, was der Code * tut *. Im Falle von clang optimiert das LLVM, bevor es Asm- oder Maschinencode für die Zielmaschine ausgibt. Übrigens werden die "zielspezifischen" Optimierungen, wie das Ersetzen von "mov reg, 0" durch "xor reg, reg" auf x86 oder das Ausnutzen von "lea" für verschiedene Dinge, als "Peephole" -Optimierungen bezeichnet –

2

Optimizern Do ...

Nun, Optimizern (oder besser Optimierungsstrategien) mit bestimmten Compilerimplementierungen.

Es gibt keine allgemeingültige Antwort für Ihre Frage


und besser C/C++ Code schreiben oder sie es tun übersetzen direkt in Montage

Nein, ihre Aufgabe ist es, die Back-End-Optimierung Code, der Ziel-Assembly oder irgendeinen dazwischenliegenden Maschinencode sein könnte. Somit ist kein intermediate optimierter C++ Code zu erwarten.

2

Optimierer nicht umschreiben C/C++ Code.

Der Compiler führt eine lexikalische Analyse durch und erstellt dann eine semantische Analyse mit einer Art interner Diagrammdarstellung Ihres Codes. Der Optimierer arbeitet zuerst an dieser internen Repräsentation und identifiziert optimize the flow of execution (zum Beispiel konstante Propagation).

Sobald die Code-Generierung starten kann, greift der Optimierer wieder macine abhängige Optimierung (Registerzuweisung, spezielle Befehlssätze wie Intels MMX, etc ...)

Erst am Ende wird es generieren Assembler zu machen Code.