Recompilare dinamică
În informatică , recompilarea dinamică este o tehnică de optimizare implementată de mulți emulatori și mașini virtuale . Această tehnică necesită ca codul sursă al unui program să fie analizat în timpul execuției sale și recompilat pentru a-l face executabil și / sau pentru a-și îmbunătăți performanța de execuție. Compilarea în timpul execuției vă permite să adaptați codul la mașina care îl execută, ținând cont și de informațiile prezente în timpul execuției, informații pe care un compilator nu le are în timpul compilării statice clasice.
În unele cazuri, recompilarea dinamică este utilizată împreună cu alte tehnici de optimizare adaptivă pentru a îmbunătăți executarea codului portabil , independent de platformă . De exemplu, mașinile virtuale Java și .NET Common Language Runtime folosesc adesea această tehnică atunci când rulează bytecode .
Exemplu
Să presupunem că aveți un program care rulează pe un emulator și că programul trebuie să copieze un șir terminat cu un caracter NULL. Programul a fost compilat pentru un procesor foarte simplu, acesta este capabil să copieze un singur octet la un moment dat, programul citește octetul dintr-un registru și îl copiază în șirul de destinație. Programul original ar avea un cod similar cu următorul:
Start:
mov A , [ primul pointer de șir ] ; Puneți locația primului caracter al șirului sursă
; în registrul A
mov B , [ al doilea indicator de șir ] ; Puneți locația primului caracter al șirului de destinație
; în registrul B
buclă:
mov C , [ A ] ; Copiați octetul la adresa din registrul A pentru a înregistra C
mov [ B ], C ; Copiați octeții din registrul C la adresa din registrul B
inc A ; Creșteți adresa din registrul A pentru a indica
; următorul octet
inc B ; Creșteți adresa din registrul B pentru a indica
; următorul octet
cmp C , # 0 ; Comparați datele pe care tocmai le-am copiat la 0 (marcaj final de șir)
bucla jnz ; Dacă nu era 0 atunci avem mai multe de copiat, așa că întoarce-te
; și copiați următorul octet
sfarsit :; Dacă nu am făcut o buclă, atunci trebuie să fi terminat,
; deci continuați cu altceva.
Emulatorul rulează pe un procesor mai puternic decât cel folosit pentru a dezvolta codul de mai sus. Acest procesor are instrucțiuni special concepute pentru copierea șirurilor, iar emulatorul este conștient de aceste instrucțiuni. Emulatorul care utilizează tehnica de recompilare dinamică ar putea recunoaște fragmentul de cod care copiază șirul și l-ar putea înlocui cu cod care profită de noile instrucțiuni prezente pe procesor. Printre noile instrucțiuni presupunem că există instrucțiunea „movs”, aceasta copiază până la 16 octeți în același timp, fără a fi nevoie să utilizați un registru de parcare și se oprește dacă întâlnește caracterul NULL.
Noul cod cu recompilare dinamică ar avea următoarea formă:
Start:
mov A , [ primul indicator de șir ] ; Puneți locația primului caracter al șirului sursă
; în registrul A
mov B , [ al doilea indicator de șir ] ; Puneți locația primului caracter al șirului de destinație
; în registrul B
buclă:
mișcări [ B ], [ A ] ; Copiați 16 octeți la adresa din registrul A la adresă
; în registrul B, apoi creșteți A și B cu 16
bucla jnz ; Dacă steagul zero nu este setat, atunci nu am ajuns
; sfârșitul șirului, așa că întoarceți-vă și copiați încă ceva.
sfarsit :; Dacă nu am făcut o buclă, atunci trebuie să fi terminat,
; deci continuați cu altceva.
Acest cod este mai compact și mult mai rapid, deoarece evită o copie intermediară în registrele procesorului. De asemenea, instrucțiunea „movs” a fost probabil dezvoltată pentru a fi mai rapidă decât 16 mov-uri simple.
Produse dinamice de recompilare
- Multe mașini virtuale Java (consultați compilatorul Just-in-time )
- Programul Rosetta furnizat de Apple pentru a permite mașinilor X86 să execute codul PowerPC .
- Vechiul program Mac 68K folosit de Apple pentru a permite mașinilor PowerPC să execute codul 68000.
- Psyco un compilator pentru Python .
- Mașina virtuală VX32 .
- PC virtual
- QEMU
- Se presupune că emulatorul inclus în Xbox 360 care permite executarea jocurilor de pe Xbox anterioară utilizează recompilarea dinamică.
- Emulatorul consolei Nintendo GameCube Dolphin-Emu
- OVPsim
linkuri externe
- ( RO ) Raportul tehnic HP Labs despre Dynamo , la hpl.hp.com .