Was sind einige Tipps für die Optimierung des Assembler-code, der vom compiler erzeugt?

Ich bin derzeit in den Prozess des Schreibens ein compiler und ich scheinen zu haben, in einige Probleme laufen, wie es den Ausgabe-code, der ausgeführt wird, in einem anständigen Zeitrahmen.

Einen kurzen überblick über den compiler:

7Basic ist ein compiler, der soll zu kompilieren 7Basic code direkt in Maschinen-code für die Ziel-Architektur /Plattform. Derzeit 7Basic generiert x86 Assembler gegeben, eine source-Datei.

Das problem ist, dass der Assembler-code, der vom compiler generiert wird langsam und ineffizient.

Beispielsweise diese code (die kompiliert unten zu diese Assembler-code) dauert fast 80.47 mal länger auszuführen als der entsprechende C-code.

Teil des Problems ist, dass der compiler erzeugt code wie den folgenden:

push eax
push 5000000
pop ebx
pop eax

Anstelle der logisch:

mov ebx,5000000

..., führt die gleiche Sache.

Meine Frage ist: was sind einige Techniken, um zu vermeiden, diese Art von problem? Der parser grundsätzlich verwendet Rekursion, um eine Analyse der Ausdrücke, so dass der erzeugte code spiegelt dies wider.

  • Add-O3 zu Ihrem compiler-Befehlszeile 😉
  • +1 @drhirsch LOL
  • "...ein cross-Plattform BASIC-compiler erzeugt native Win32 ausführbaren Dateien." Warten Sie, was?
  • Gut, es soll auch zu generieren ELF-executables auch.
  • Crenshaw tutorial, sagt ein (sehr!) wenig über peephole-Optimierung in einem one-pass-compiler. Kurz-kurz-version: Puffer für die Ausgabe von N Anweisungen und überprüfen Sie mögliche Optimierungen in den Puffer jedes mal, wenn eine neue Anweisung emittiert wird, zu dem Puffer. Drücken die Ergebnisse aus, wie gebraucht. Welche Optimierungen sind zu tun? Ah...das ist der schwierige Teil, nicht wahr?
  • Das scheint, wie hilfreiche Ratschläge.
  • Ist LLVM eine option für dich?

InformationsquelleAutor Nathan Osman | 2010-09-22
Schreibe einen Kommentar