Brandt Bucher nga Microsoft, një nga zhvilluesit kryesorë të CPython dhe pjesë e ekipit që merret me rritjen e performancës së interpreterit CPython, publikoi një realizim të JIT-kompilatorit për Python që përdor teknikën Copy-and-Patch. Publikimi i JIT është me rastin e Krishtlindjeve dhe lajmi është shkruar në poezi.
Propozimi i JIT është i veçantë për shpejtësinë e tij shumë të lartë të gjenerimit të kodit, lehtësinë e mirëmbajtjes dhe integrimin e plotë me interpreterin. Metoda e propozuar lejon automatikisht transformimin e interpreterit të shkruar në gjuhën C në një JIT-kompilator, pa krijimin e veçantë të logjikës së gjenerimit të kodit dhe pa krijimin manual të përfaqësimeve në assembler. Me këtë qasje, korrigjimi i gabimeve në interpreter automatikisht do të çojë gjithashtu në zgjidhjen e të njëjtave probleme në JIT, pasi përdoret një gjenerues i përbashkët i kodit.
Metoda Copy-and-Patch bazohet në faktin se rilokimi i kodit në memorie gjatë ngarkimit nga lidhësi i skedhave objekt dhe zëvendësimi i instruksioneve makinerike përmes JIT janë detyra të ngjashme. Gjatë funksionimit të JIT gjatë ekzekutimit të programit, kryhet një kontroll i instruksioneve të bytecode të krijuara nga interpreteri dhe kopjohet për çdo instruktion kodi makinerik i para-gjeneruar në një zonë të memories me kod ekzekutues, si dhe modifikimi në kohë reale i instruksioneve për të zëvendësuar të dhënat që po përpunohen (JIT kopjon shabllonat e gatshme të funksioneve të para-gjeneruara dhe zëvendëson në to vlerat e nevojshme, si argumentet dhe konstantat). Gjatë ngarkimit të skedhave objekt gjithashtu kryhet kopjimi i kodit makinerik në memorie dhe zëvendësimi i simboleve të jashtme.
Në Copy-and-Patch JIT, nëpërmjet LLVM, krijohet një skedhë objekt në formatin ELF, që përmban të dhëna për instruksionet e bytecode dhe informacion mbi zëvendësimin e nevojshëm të të dhënave. JIT zëvendëson instruksionet e bytecode të gjeneruara gjatë interpretimit të programit me përfaqësime në kod makinerik, duke zëvendësuar përveç kësaj të dhënat e nevojshme për llogaritje. Implementimi i JIT kërkon si varësi LLVM në fazën e ndërtimit, por komponentët runtime nuk janë të lidhur me varësi të jashtme dhe reduktohen në rreth 300 rreshta të shkruar manualisht në gjuhën C dhe 3000 rreshta kodesh të gjeneruara në C.
Në krahasim me mjetet tradicionale JIT (LLVM -O0), JIT-i i propozuar ofron një gjenerim kodi deri në 100 herë më të shpejtë dhe një kod rezultues deri në 15% më të shpejtë. Në krahasim me kompilimin në WebAssembly (Liftoff), JIT-i i ri gjeneron kodin 5 herë më shpejt, ndërsa kodi rezultues punon 50% më shpejt. Kur krahasohet JIT-i i ri me JIT-in optimizues (LuaJIT), i cili përdor kode të shkruara manualisht në assembler, opsioni i propozuar rezultoi më i shpejtë në 13 nga 44 teste, ndërsa në mesatare ishte më i ngadalshëm me 35%, duke parandaluar rritjen e ndërlikueshmërisë dhe duke lehtësuar mirëmbajtjen.

Burimi: opennet.ru
