2013-11-27 6 views
12

Kann mir jemand auf eine gute Definition des Begriffs "Senken" im Zusammenhang mit Compilern hinweisen?Gesucht: gute Definition des Begriffs "Senken" im Zusammenhang mit Compilern

Von dem, was ich sagen kann, ist es die Übersetzung einer Operation auf höherer Ebene in eine äquivalente Kombination von Operationen auf niedrigerer Ebene, aber ich bin mir nicht wirklich sicher, und ich kann nicht eine nach ein paar Minuten finden Suche auf Google. (Es gibt einige Verwendungen des "Senkens" beispielsweise in GCC oder LLVM, aber keine Verweise auf eine Definition.)

+0

Wird das nicht 'Reduzieren' genannt? Oder vielleicht nennt man das in Grammatikdefinitionen, ich kann mich nicht erinnern. – slugster

+0

Ziemlich vage. Das macht der gesamte Compiler. Ich würde spezifische Beispiele "Festigkeitsreduktion" nennen, z. '* 2' =>' 1'. – EJP

Antwort

13

Dr. Dobbs nur an article by Walter Bright veröffentlicht (von dlang Ruhm), wo er den Begriff erwähnt:

Tieferlegung

Eine semantische Technik, die im Nachhinein (aber nahm Andrei Alexandrescu liegt auf der Hand weisen darauf hin, ich) heißt "Absenken". Es besteht darin, komplexere semantische Konstrukte im Sinne von einfacheren neu zu schreiben. Zum Beispiel können while Schleifen und foreach Schleifen in Bezug auf for Schleifen geschrieben werden. Dann muss der Rest des Codes nur mit for Schleifen umgehen. Dies stellte sich heraus, um ein paar latente Bugs zu entdecken, wie While-Loops in D implementiert wurden, und so war ein netter Gewinn. Es wird auch verwendet, um scope guard Aussagen in Bezug auf try-finally Aussagen, etc. neu zu schreiben. Jeder Fall, in dem dies in der semantischen Verarbeitung gefunden werden kann, wird für die Implementierung gewinnen.

Wenn sich herausstellt, dass es in der Sprache einige Sonderfallregeln gibt, die dieses "Absenken" des Umschreibens verhindern, könnte es eine gute Idee sein, das Sprachdesign erneut zu betrachten.

Jedes Mal, wenn Sie im Umgang mit semantischen Konstrukten Gemeinsamkeit finden, ist es eine Gelegenheit, Implementierungsaufwand und Fehler zu reduzieren.

4

Ich kann keine gute Verbindung mit einer Definition finden, aber ich denke, dass ich ein gutes Beispiel geben kann. In LLVM unterstützt der LLVM IR mehrere Größen von Ganzzahlen. Die meisten C/C++ - Compiler, einschließlich clang, unterstützen lange long und einen 64-Bit-Datentyp. Viele 32-Bit-Prozessoren, wie die Mips (32 Bit), haben keine Befehle, die beispielsweise ein 64-Bit-Add oder Compare ausführen können. LLVM wird diese 64-Bit-Operationen auf Operationen, normalerweise 32 Bit, "senken", die der Prozessor tun kann.

Im Falle eines int64_t zum Beispiel vergleichen, werden LLVM es kann

compare the upper 32 bits with a signed comparison 
if they are equal, compare the lower 32 bits with an unsigned comparison 

Einige senken senken ziemlich Lust bekommen. Auf einem Prozessor, der keine Multiplikationsanweisung unterstützt, können einfache Multiplikationen beispielsweise in Verschiebungen und Additionen umgewandelt werden, während kompliziertere in einen Aufruf einer Runtime-Supprt-Bibliothek umgewandelt werden können.

Verwandte Themen