Brandt Bucher iz podjetja Microsoft, ki je eden od glavnih razvijalcev CPython in dela v ekipi, ki se ukvarja z izboljšanjem učinkovitosti interpreterja CPython, je objavil implementacijo JIT-kompajlerja za Python, ki uporablja tehniko Copy-and-Patch. Objava JIT sovpada z Božičem, napoved pa je napisana v verzih.
Predlagani JIT se odlikuje po zelo visoki hitrosti generiranja kode, enostavnosti vzdrževanja in popolni integraciji z interpreterjem. Predlagana metoda omogoča avtomatsko preoblikovanje interpreterja, napisanega v jeziku C, v JIT-kompajler, brez ločenega oblikovanja logike generiranja kode in brez ročnega ustvarjanja predstavitev v assemblerju. S takim pristopom bo odprava napake v interpreterju samodejno odpravila tudi isto težavo v JIT-u, saj se uporablja skupni generator kode.
Delovanje metode Copy-and-Patch temelji na tem, da sta relokacija kode v pomnilniku pri nalaganju povezovalnikom objektnih datotek in nadomestitev strojnih navodil namesto bajtkode v JIT podobni nalogi. Pri delovanju JIT v procesu izvajanja programa se izvaja pregled ustvarjenih navodil bajtkode, in za vsako navodilo se kopira vnaprej skompilirana strojna koda v območje pomnilnika z izvršljivo kodo ter tudi dinamično spreminja navodila za nadomestitev obdelanih podatkov (JIT kopira pripravljene predloge že skompiliranih funkcij in v njih nadomesti potrebne vrednosti, kot so argumenti in konstante). Pri nalaganju objektnih datotek se prav tako izvaja kopiranje strojne kode v pomnilnik in nadomestitev zunanjih simbolov.
V Copy-and-Patch JIT se s pomočjo LLVM sestavi objektna datoteka v formatu ELF, ki vsebuje podatke o navodilih bajtkode in informacije o potrebnih nadomestitvah podatkov. JIT nadomesti generirana navodila bajtkode, nastala med interpretacijo programa, s predstavitvami v strojni kodi, hkrati pa vstavlja potrebne podatke za izračune. Implementacija JIT zahteva kot odvisnost LLVM v fazi sestavljanja, vendar komponente v času izvajanja niso vezane na zunanje odvisnosti in znašajo približno 300 ročno napisanih vrstic v jeziku C in 3000 generiranih vrstic kode v C.
V primerjavi s tradicionalnimi JIT orodji (LLVM -O0) predlagani JIT zagotavlja 100-krat hitrejšo generacijo kode in 15 % hitrejšo končno kodo. V primerjavi s kompilacijo v WebAssembly (Liftoff) nov JIT generira kodo 5-krat hitreje, končna koda pa deluje 50 % hitreje. Če primerjamo nov JIT z optimiziranim JIT (LuaJIT), ki uporablja ročno napisano kodo v assemblerju, se je predlagana različica izkazala za hitrejšo v 13 od 44 testov, povprečno pa je zaostala po zmogljivosti za 35 %, ob znatnem poenostavljenju vzdrževanja in zmanjšanju ravni zapletenosti izvedbe.

Izvor: opennet.ru
