Dynamická rekompilace - Dynamic recompilation
![]() | Tento článek má několik problémů. Prosím pomozte vylepši to nebo diskutovat o těchto problémech na internetu diskusní stránka. (Zjistěte, jak a kdy tyto zprávy ze šablony odebrat) (Zjistěte, jak a kdy odstranit tuto zprávu šablony)
|
Provádění programu |
---|
Obecné pojmy |
Druhy kódu |
Strategie kompilace |
Pozoruhodné doby běhu |
Pozoruhodné překladače a řetězce nástrojů |
v počítačová věda, dynamická rekompilace (někdy zkráceno na dynarec nebo pseudo-zkratka DRC) je vlastnost některých emulátory a virtuální stroje, kde systém může překompilovat nějaká část a program během provádění. Zkompilováním během provádění může systém přizpůsobit vygenerovaný kód tak, aby odrážel běhové prostředí programu, a potenciálně produkovat efektivnější kód využitím informací, které nejsou k dispozici pro tradiční statické soubory překladač.
Použití
Většina dynamických rekompilátorů se používá k převodu strojového kódu mezi architekturami za běhu. To je úkol, který je často potřeba při emulaci starších herních platforem. V ostatních případech může systém využívat dynamickou rekompilaci jako součást souboru adaptivní optimalizace strategie provedení přenosné programové reprezentace, jako je Jáva nebo .NET Common Language Runtime bytecodes. Full-speed debuggery také využívají dynamickou rekompilaci ke snížení prostorové režie vznikající ve většině deoptimalizace techniky a další funkce, například dynamické migrace vláken.
Úkoly
Hlavní úkoly, které musí dynamický recompiler provádět, jsou:
- Čtení strojového kódu ze zdrojové platformy
- Vysílání strojového kódu pro cílovou platformu
Dynamický rekompilátor může také provádět některé pomocné úlohy:
- Správa mezipaměti překompilovaného kódu
- Aktualizace počtu uplynulých cyklů na platformách s registry počtu cyklů
- Správa kontroly přerušení
- Poskytování rozhraní k virtualizovanému hardwaru podpory, například a GPU
- Optimalizace struktur kódu na vyšší úrovni pro efektivní provoz na cílovém hardwaru (viz níže)
Příklad
Předpokládejme, že program je spuštěn v emulátoru a musí kopírovat nulovou koncovku tětiva. Program je původně sestaven pro velmi jednoduchý procesor. Tento procesor může kopírovat pouze a byte najednou a musí tak učinit tak, že jej nejprve načtete ze zdrojového řetězce do a Registrovat a poté jej zapsat z tohoto registru do cílového řetězce. Původní program může vypadat asi takto:
začátek: mov A,[za prvé tětiva ukazatel] ; Vložte umístění prvního znaku zdrojového řetězce ; v registru A mov B,[druhý tětiva ukazatel] ; Vložte umístění druhého znaku cílového řetězce ; v registru Bsmyčka: mov C,[A] ; Zkopírujte bajt na adresu v registru A do registru C mov [B],C ; Zkopírujte bajt v registru C na adresu v registru B vč A ; Zvyšte adresu v registru A, na kterou ukážete ; další bajt vč B ; Zvyšte adresu v registru B, na kterou ukážete ; další bajt cmp C,# 0; Porovnejte data, která jsme právě zkopírovali, na 0 (značka konce řetězce) jnz smyčka ; Pokud to nebylo 0, máme více kopií, tak se vraťte ; a zkopírujte další bajtkonec: ; Pokud jsme neprotočili, museli jsme skončit, ; tak pokračuj v něčem jiném.
Emulátor může běžet na procesoru, který je podobný, ale extrémně dobrý v kopírování řetězců, a emulátor ví, že to může využít. Může rozpoznat posloupnost kopírování řetězců pokynů a rozhodnout se je před spuštěním efektivněji přepsat, k urychlení emulace.
Řekněme, že na našem novém procesoru je instrukce s názvem mov, speciálně navržené pro efektivní kopírování řetězců. Naše teoretická instrukce movs kopíruje 16 bajtů najednou, aniž bychom je museli mezi nimi načítat do registru C, ale zastaví se, pokud zkopíruje 0 bajtů (který označuje konec řetězce) a nastaví nulový příznak. Také ví, že adresy řetězců budou v registrech A a B, takže při každém spuštění zvýší A a B o 16, připraveno na další kopii.
Náš nový překompilovaný kód může vypadat asi takto:
začátek: mov A,[za prvé tětiva ukazatel] ; Vložte umístění prvního znaku zdrojového řetězce ; v registru A mov B,[druhý tětiva ukazatel] ; Vložte umístění prvního znaku cílového řetězce ; v registru Bsmyčka: mov [B],[A] ; Zkopírujte 16 bajtů na adresu v registru A na adresu ; v registru B, pak přírůstek A a B o 16 jnz smyčka ; Pokud není nastaven nulový příznak, nedosáhli jsme ; konec řetězce, tak se vraťte a zkopírujte další.konec: ; Pokud jsme neprotočili smyčku, museli jsme skončit, ; tak pokračuj v něčem jiném.
Existuje okamžitá rychlostní výhoda jednoduše proto, že procesor nemusí načítat tolik instrukcí, aby provedl stejný úkol, ale také proto, že instrukce mov bude pravděpodobně optimalizována návrhářem procesoru, aby byla efektivnější než sekvence použitá v první příklad. Může například lépe využívat paralelní provedení v procesoru ke zvýšení A a B, zatímco stále kopíruje bajty.
Aplikace
Obecný účel
- Mnoho Virtuální stroje Java funkce dynamická rekompilace.
- Apple Rosetta pro Mac OS X na x86, umožňuje PowerPC kód, který se má spustit na serveru architektura x86.
- Novější verze Emulátor Mac 68K použito v klasický Mac OS běžet 680x0 kód na hardwaru PowerPC.
- Psyco, a specializující překladač pro Krajta.
- HP Projekt Dynamo, příklad transparentní binární dynamiky optimalizátor.[1]
- DynamoRIO, an open-source nástupce Dynama, který pracuje s PAŽE, x86-64 a IA-64 (Itanium) instrukční sady.[2][3]
- The Virtuální stroj Vx32 využívá k vytváření dynamickou rekompilaci OS nezávislé karantény architektury x86 pro bezpečnou aplikaci pluginy.
- Microsoft Virtual PC pro Mac, který se používá ke spouštění kódu x86 na PowerPC.
- QEMU, open-source emulátor celého systému.
- FreeKEYB, mezinárodní ovladač klávesnice a konzoly DOS s mnoha použitými vylepšeními použitelnosti samočinně se měnící kód a dynamická eliminace mrtvého kódu minimalizovat svůj obraz v paměti na základě jeho uživatelské konfigurace (vybrané funkce, jazyky, rozvržení) a skutečného běhového prostředí (varianta a verze OS, načtené ovladače, základní hardware), automatické řešení závislostí, dynamické přemístění a rekombinace sekcí kódu na byte- úroveň podrobnosti a optimalizace předvoleb na základě sémantických informací poskytnutých ve zdrojovém kódu, informace o přemístění generované speciálními nástroji během sestavování a informace o profilu získané v době načítání.[4][5]
- OVPsim,[6] volně dostupný emulátor celého systému.
- VirtualBox používá dynamickou rekompilaci.
- Valgrind, programovací nástroj pro ladění paměti, únik paměti detekce a profilování využívá dynamickou rekompilaci.
Hraní
- MAME využívá dynamickou rekompilaci ve svých CPU emulátorech pro MIPS, SuperH, PowerPC a dokonce i grafické grafické jednotky Voodoo.
- Wii64, a Nintendo 64 emulátor pro Wii.
- WiiSX, emulátor Sony PlayStation pro Nintendo Wii.
- Mupen64Plus, multiplatformní emulátor Nintendo 64.[7]
- Yabause, multiplatformní Saturn emulátor.[8]
- Funkce zpětné kompatibility Xbox 360 (tj. běh her napsaných pro originál Xbox ) se obecně předpokládá, že používá dynamickou rekompilaci.
- PPSSPP, a Sony PlayStation Portable emulátor. Rekompilátory pro x86 i ARM.
- PSEmu Pro, a Sony Play Station emulátor.
- Ultrahle, první Nintendo 64 emulátor pro plné spuštění komerčních her.
- PCSX2,[9] A Sony Playstation 2 emulátor, má recompiler s názvem "microVU", nástupce "SuperVU".
- Delfín, a Nintendo GameCube a Wii emulátor, má možnost dynarec.
- GCemu,[10] A Nintendo GameCube emulátor.
- NullDC, a Sega Obsazení snů emulátor pro x86.
- KLENOT,[11] A Nintendo Game Boy emulátor pro MSX používá optimalizační dynamický rekompilátor.
- DeSmuME,[12] A Nintendo DS emulátor, má možnost dynarec.
- Soywiz's Psp,[13] A Sony PlayStation Portable emulátor, má možnost dynarec.
- RPCS3, a Sony PlayStation 3 emulátor. Rekompiluje jak PPU, tak SPU na celulárním procesoru pro x86-64
- Decaf-emu, a Wii U emulátor, používá dynamickou rekompilaci (JIT) z hardwaru kódu PowerPC32 na x86_64 pomocí knihovny libbinrec (samotná knihovna může běžet na libovolné hardwarové architektuře).
Viz také
- Binární překladač
- Binární překlad
- Porovnání virtualizačního softwaru platformy
- Just-in-time kompilace
- Přístrojové vybavení (počítačové programování)
Reference
- ^ „Technická zpráva společnosti HP Labs o Dynamu“.
- ^ http://www.dynamorio.org/home.html
- ^ https://github.com/DynamoRIO/dynamorio
- ^ Paul, Matthias R .; Frinke, Axel C. (1997-10-13) [poprvé publikováno 1991], FreeKEYB - Vylepšená klávesnice a ovladač konzoly DOS (Uživatelská příručka) (v6.5 ed.) [1] (Pozn. FreeKEYB je Unicode - založený na dynamicky konfigurovatelném nástupci K3PLUS, který podporuje většinu rozložení klávesnice, kódové stránky, a kódy zemí. K3PLUS byl rozšířený ovladač klávesnice pro DOS široce distribuovaný v Německu v té době, s adaptacemi na několik dalších evropských jazyků. Podporoval již podmnožinu funkcí FreeKEYB, ale byl staticky nakonfigurován a nepodporoval dynamická eliminace mrtvého kódu.)
- ^ Paul, Matthias R .; Frinke, Axel C. (2006-01-16), FreeKEYB - Pokročilá mezinárodní klávesnice a ovladač konzoly DOS (Uživatelská příručka) (v7 předběžné vydání)
- ^ „OVPsim“.
- ^ Mupen64Plus
- ^ „SH2“.
- ^ „PCSX 2“.
- ^ petebernert. "GCemu". SourceForge.
- ^ „Gameboy Emulator for MSX | The New Image“. KLENOT. Citováno 2014-01-12.
- ^ „DeSmuME v0.9.9“.
- ^ Publicado por Carlos Ballesteros Velasco (2013-07-28). „Emulátor PSP společnosti Soywiz: Vydání: Emulátor Psp společnosti Soywiz 2013-07-28 (r525)“. Pspemu.soywiz.com. Citováno 2014-01-12.