Recompilare dinamică

De la Wikipedia, enciclopedia liberă.
Salt la navigare Salt la căutare

Î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

linkuri externe

Informatică Portal IT : accesați intrările Wikipedia care se ocupă cu IT