Dynamische Wiederkompilation

In der Informatik ist dynamische Wiederkompilation (manchmal abgekürzt zu dynarec oder dem Pseudoakronym DRC) eine Eigenschaft von einigen Emulatoren und virtuellen Maschinen, wo das System einen Teil eines Programms während der Ausführung wiederkompilieren kann. Durch das Kompilieren während der Ausführung kann das System den erzeugten Code schneidern, um die Laufzeitumgebung des Programms zu widerspiegeln, und potenziell effizienteren Code durch die Ausnutzung der Information zu erzeugen, die für einen traditionellen statischen Bearbeiter nicht verfügbar ist.

Gebrauch

Die meisten dynamischen Wiederbearbeiter werden verwendet, um Maschinencode zwischen Architekturen an der Durchlaufzeit umzuwandeln. Das ist eine Aufgabe, die häufig im Wetteifer des Vermächtnisses erforderlich ist, das Plattformen spielt. In anderen Fällen kann ein System dynamische Wiederkompilation als ein Teil einer anpassungsfähigen Optimierungsstrategie verwenden, eine tragbare Programm-Darstellung wie Java oder.NET Durchlaufzeit der Gemeinsamen Sprache bytecodes durchzuführen. Voll-Gangtesthilfeprogramme verwerten auch dynarec, um den Raum zu reduzieren, der oben in den meisten deoptimization Techniken und anderen Eigenschaften wie dynamische Faden-Wanderung übernommen ist.

Aufgaben

Die Hauptaufgaben, die ein dynamischer Wiederbearbeiter durchführen muss, sind:

  • Das Lesen in der Maschine codiert von der Quellplattform
  • Das Ausstrahlen der Maschine codiert für die Zielplattform

Ein dynamischer Wiederbearbeiter kann auch einige Hilfsaufgaben durchführen:

  • Das Handhaben eines geheimen Lagers des wiederkompilierten Codes
  • Das Aktualisieren von vergangenen Zyklus-Zählungen auf Plattformen mit der Zyklus-Zählung schreibt ein
  • Management der Unterbrechung, die überprüft
  • Die Versorgung einer Schnittstelle zu virtualized unterstützt Hardware zum Beispiel ein GPU
Wenn sie
  • höhere Niveau-Codestrukturen optimieren, um effizient auf der Zielhardware zu laufen, sehen (unten)

Beispiel

Nehmen Sie an, dass ein Programm in einem Emulator und Bedürfnissen geführt wird, eine ungültig begrenzte Schnur zu kopieren. Das Programm wird ursprünglich für einen sehr einfachen Verarbeiter kompiliert. Dieser Verarbeiter kann nur ein Byte auf einmal kopieren, und muss so durch die erste Lesung es von der Quellschnur in ein Register tun, dann es von diesem Register in die Bestimmungsort-Schnur schreibend. Das ursprüngliche Programm könnte etwas wie das schauen:

Anfang:

mov A, [spannen zuerst Zeigestock]; Stellen Sie Position des ersten Charakters von Quelle Schnur

; im Register Ein

mov B, [der zweite Schnur-Zeigestock]; Stellen Sie Position des ersten Charakters von Bestimmungsort Schnur

; im Register B

Schleife:

mov C; Kopie-Byte an der Adresse im Register, um C einzuschreiben

mov [B], C; Kopie-Byte im Register C zur Adresse im Register B

inc A; Erhöhen Sie die Adresse im Register, um zu hinzuweisen

; das folgende Byte

inc B; Erhöhen Sie die Adresse im Register B, um zu hinzuweisen

; das folgende Byte

cmp C,#0; Vergleichen Sie die Daten, die wir gerade zu 0 (Schnur-Endanschreiber) kopiert

haben

Jnz-Schleife; wenn es nicht 0 dann war, haben wir mehr, um zu kopieren, so gehen Sie zurück

; und kopieren Sie das folgende Byte

Ende:; Wenn wir uns dann nicht geschlungen haben, müssen wir, fertig gewesen sein

; so fahren Sie mit etwas anderem fort. </source>

Der Emulator könnte auf einem Verarbeiter laufen, der ähnlich, aber im Kopieren von Schnuren äußerst gut ist, und der Emulator weiß, dass es das ausnutzen kann.

Es könnte die Schnur-Kopie-Folge von Instruktionen anerkennen und sich dafür entscheiden, sie effizienter kurz vor der Ausführung umzuschreiben, den Wetteifer zu beschleunigen.

Sagen Sie, dass es eine Instruktion auf genannten movs unseres neuen Verarbeiters, spezifisch entworfen gibt, um Schnuren effizient zu kopieren. Unsere theoretische movs Instruktion kopiert 16 Bytes auf einmal, ohne sie ins Register C zwischen, laden

zu müssen

aber wird anhalten, wenn es 0 Bytes kopiert (der das Ende einer Schnur kennzeichnet) und setzen Sie die Nullfahne. Es weiß auch, dass die Adressen der Schnuren in Registern A und B sein werden, so erhöht es A und B vor 16 jedem Mal, wenn es, bereit zur folgenden Kopie durchführt.

Unser neuer wiederkompilierter Code könnte etwas wie das schauen:

mov A, [spannen zuerst Zeigestock]; Stellen Sie Position des ersten Charakters von Quelle Schnur ; im Register Ein mov B, [der zweite Schnur-Zeigestock]; Stellen Sie Position des ersten Charakters von Bestimmungsort Schnur ; im Register BSchleife:

movs [B]; Kopieren Sie 16 Bytes an der Adresse im Register, um zu richten

; im Register B, dann erhöhen Sie A und B durch 16

Jnz-Schleife; wenn die Nullfahne dann nicht gesetzt wird, haben wir nicht erreicht

; das Ende der Schnur, so gehen Sie zurück und kopieren Sie weiter.

Ende:; Wenn wir uns dann nicht geschlungen haben, müssen wir, fertig gewesen sein

; so fahren Sie mit etwas anderem fort. </source>

Es gibt einen unmittelbaren Geschwindigkeitsvorteil einfach, weil der Verarbeiter so viele Instruktionen nicht laden muss, dieselbe Aufgabe zu erledigen, sondern auch weil die movs Instruktion wahrscheinlich vom Verarbeiter-Entwerfer optimiert wird, um effizienter zu sein, als die im ersten Beispiel verwendete Folge. (zum Beispiel kann es besseren Gebrauch der parallelen Ausführung im Verarbeiter machen, um A und B zu erhöhen, während es noch Bytes kopiert).

Anwendungen mit der dynamischen Wiederkompilation

Allgemeiner Zweck

  • Viele Java virtuelle Maschinen zeigen dynamische Wiederkompilation.
  • Rosetta des Apfels für Mac OS X auf x86, erlaubt Code von PowerPC, auf der x86 Architektur geführt zu werden.
  • Spätere Versionen des in Mac OS verwendeten Emulators von Mac 68K, um 680x0 zu laufen, codieren auf der Hardware von PowerPC.
  • Psyco, ein Spezialisierungsbearbeiter für die Pythonschlange.
  • Das HP-Dynamo-Projekt, ein Beispiel eines durchsichtigen binären dynamischen optimizer.
  • Die Vx32 virtuelle Maschine verwendet dynamische Wiederkompilation, um Architektur-Sandkästen von OS-independent x86 für die sichere Anwendung plugins zu schaffen.
  • Microsoft Virtual PC für Mac, verwendet, um X86-Code auf PowerPC zu führen.
  • QEMU, eine offene Quelle voller Systememulator.
  • FreeKEYB, eine internationale DOS-Tastatur und Konsole-Fahrer mit vielen Brauchbarkeitserhöhungen verwertet, Code und dynamische tote Codebeseitigung selbstmodifizierend, um sein Speicherimage zu minimieren, das auf seiner Benutzerkonfiguration (ausgewählte Eigenschaften, Sprachen, Lay-Outs) und wirkliche Laufzeitumgebung (OS Variante und Version, geladene Treiber, zu Grunde liegende Hardware) gestützt ist, automatisch Abhängigkeiten auflösend, dynamisch umziehend und Codeabteilungen auf der Körnung des Byte-Niveaus wiederverbindend und opstrings optimierend, gestützt auf der semantischen Auskunft, die im Quellcode, Wiederpositionsinformation gegeben ist, die durch spezielle Werkzeuge während des Zusammenbaues und der in der Ladezeit erhaltenen Profil-Information erzeugt ist.
  • OVPsim, ein frei verfügbarer voller Systememulator.
  • VirtualBox verwendet dynamische Wiederkompilation
  • Valgrind, ein Programmierwerkzeug für das Speicherbeseitigen, Speicherleckstelle-Entdeckung, und Kopierfräs-, verwenden dynamische Wiederkompilation.

Das Spielen

  • MAME verwendet dynamische Wiederkompilation in seinen Zentraleinheitsemulatoren für MIPS, SuperH, PowerPC und sogar die Voodoo-Grafik in einer Prozession gehende Einheiten.
  • 1964, Nintendo 64 Emulator für die x86 Hardware.
  • Wii64, Nintendo 64 Emulator für Wii.
  • WiiSX, Sony Emulator von PlayStation für Nintendo Wii.
  • Mupen64Plus, eine Mehrplattform Nintendo 64 Emulator.
  • Yabause, ein Mehrplattform-Saturn-Emulator.
  • Umgekehrt, wie man weit annimmt, verwendet die Vereinbarkeitsfunktionalität von Xbox 360 (d. h. laufende Spiele, die für ursprünglichen Xbox geschrieben sind), dynamische Wiederkompilation.
  • PSEmu Pro, Sony Emulator von PlayStation.
  • Ultrahle, erster Nintendo 64 Emulator, um kommerzielle Spiele völlig zu führen.
  • PCSX2, Sony PlayStation 2 Emulator, hat genannten "microVU" eines Wiederbearbeiters, den Nachfolger von "SuperVU".
  • Delfin, ein Nintendo Emulator von GameCube und Wii, hat eine dynarec Auswahl.
  • GCemu, ein Nintendo Emulator von GameCube.
  • NullDC, ein Emulator von Sega Dreamcast für x86.

Siehe auch

  • Vergleich der Plattform virtuelle Maschinen
  • Binäre Übersetzung
  • Gerade rechtzeitig Kompilation
  • Binärer Wiederbearbeiter

Links


Anlegesteg-Pflüger / Guillaume Thomas François Raynal
Impressum & Datenschutz