Binär översättning ( eng. binär översättning ) - emulering av en uppsättning instruktioner på en annan på grund av översättning av maskinkod . Instruktionssekvenser översätts från källuppsättningen till måluppsättningen av instruktioner. Binär översättning låter dig köra applikationer av en arkitektur samtidigt som den körs på den andra, och för att optimera binära kompilatorer är kodexekveringshastigheten ofta högre än originalet.
Binär översättning kan vara statisk eller dynamisk. Dynamisk kompilering sker osynligt för användaren när applikationen startar. En statisk kompilator förvandlar den binära koden för källarkitekturen till en färdig fullfjädrad applikation för målarkitekturen. I statisk dynamisk översättning översätts hela källfilen till en körbar fil för målarkitekturen. Detta är en mycket svår uppgift - att utföra denna översättning helt korrekt, eftersom inte all kod omedelbart läses av översättaren. Till exempel är vissa delar av den körbara koden endast tillgängliga genom indirekta hopp , vars parametrar bara är kända under körning.
Å andra sidan tar dynamisk översättning hänsyn till korta kodsekvenser (vanligtvis ett grundläggande block : en loop eller en metod), översätter den och cachar den resulterande sekvensen. Koden översätts inte i sin helhet, men när den läses och följaktligen möjligheten till dess översättning, och för greninstruktioner, skapas en kontrollpunkt i den översatta koden.
Dynamisk binär översättning skiljer sig från enkel emulering genom att ta bort den huvudsakliga läs-avkoda-exekveringsemulatorslingan (som är dess huvudsakliga flaskhals), och betalar för detta med en stor overhead under översättningsprocessen. Denna overhead (belastning) är något utjämnad i framtiden på grund av det faktum att den översatta koden kommer att exekveras flera gånger (det vill säga utan omöversättning).
Mer avancerade dynamiska översättare använder dynamisk omkompilering : koden som översätts är instrumenterad för att ta reda på "kodtemperatur", det vill säga vilka fragment som exekveras ganska ofta, och aggressiv optimering tillämpas på dem . Detta tillvägagångssätt påminner om en JIT- kompilator, och i huvudsak kan sådana kompilatorer (som Suns HotSpot -teknologi) ses som dynamiska översättare från en virtuell instruktionsuppsättning ( bytecode ) till en riktig.
Apple implementerade M68K live- kodöversättningsemulatorn i sin serie av Macintosh-datorer med PowerPC-processorer , vilket uppnådde en mycket hög nivå av tillförlitlighet, prestanda och kompatibilitet (se Mac 68K-emulatorn ). Detta gjorde det möjligt för Apple att lansera maskiner på marknaden med endast ett delvis inbyggt operativsystem , och slutanvändare kunde prova den nya, snabbare arkitekturen utan att riskera sin investering i programuppdateringar. "Delvis" för att emulatorn var så framgångsrik att många delar av operativsystemet fortsatte att emuleras. Den slutliga övergången till det inhemska PowerPC-operativsystemet skedde inte förrän när Mac OS X (10.0) släpptes 2001, men inom detta nya operativsystem stödde " Classic " runtime fortfarande emulering av PowerPC Mac:s kapacitet.
Apple implementerade senare översättningslagret Rosetta (ingår i Mac OS 10.4-versioner ) för Intel-centrerade Mac-datorer, som användes för att underlätta övergången från PPC till x86, ett exempel på dynamisk översättning. Rosetta, som utvecklats för Apple av Transitive , är en implementering av Transitives QuickTransit -lösning som kan användas för att dynamiskt översätta mellan plattformar baserade på SPARC, PowerPC, MIPS, Itanium och x86-arkitekturerna.
Sun ( SPARC → x86 ), IBM (x86 → Power Architecture , PowerVM Lx86 ) och SGI ( MIPS → Itanium2 ) [1] använde också Transitives QuickTransit-teknik.
DEC implementerade översättare för att migrera från CISC VAX- arkitekturen till RISC Alpha - arkitekturen . DEC implementerade också den binära översättaren FX!32 för att konvertera x86- arkitekturapplikationer till Alpha-applikationer.
MCST Lintel- översättaren låter dig köra x86-applikationer på Elbrus 2000 -processorn ( e2k- arkitektur).
Intel använde Intel IA-32 EL-översättaren för att köra 32-bitars x86-applikationer på Itanium -familjen av processorer .
I januari 2000 tillkännagav Transmeta en design för en uppdaterad processor som kallas Transmeta Crusoe [2] [3] . Som följer av FAQ [4] , med den inbyggda Code Morphing-programnivån, som tillhandahåller dynamisk binär översättning av x86 - instruktioner till Crusoe-instruktioner.
HP ARIES ( Automatic Re-translation and Integrated Environment Simulation ) är ett dynamiskt binärt översättningssystem som kombinerar snabb kodtolkning med tvåfas dynamisk översättning för att transparent och exakt köra HP 9000 HP-UX-applikationer på HP-UX 11i för HP Integrity -servrar . ARIES-tolken emulerar hela uppsättningen icke-privilegierade PA-RISC- instruktioner utan användaringripande, medan endast ofta använd kod översätts till Itanium -kod - tvåfas dynamisk översättning används, där information om lanseringsprofilen samlas in i den första steg. ARIES lagrar dynamiskt översatt kod i en minnesbuffert som kallas kodcache eller fragmentcache. Målblocken med kod som översätts är markerade för att säkerställa exekvering i kodcachen i de flesta fall. När emuleringen är klar kasserar ARIES all översatt kod utan att ändra den ursprungliga applikationen. ARIES-emuleringsmotorn implementerar också Environment Emulation, som emulerar HP 9000 HP-UX- applikationssystemanrop , signalering, undantagshantering, trådning, HP GNU Debugger- emulering för felsökning och generering av kärnfiler för applikationen.
Kinesiska mikroprocessorer i Loongson- serien använder det binära översättningssystemet qemu med modifieringar från processortillverkaren ICT. Cirka 200 instruktioner har lagts till den MIPS-liknande arkitekturprocessorn för att förenkla x86-emulering.
Den mest utvecklade dynamiska översättaren för gratis programvara är QEMU . Den stöder översättning för ett stort antal plattformar och i valfri kombination av emulerade och emulerade arkitekturer.