Brandt Bucher no uzÅÄmuma Microsoft, kurÅ” ir viens no CPython kodola izstrÄdÄtÄjiem un darbojas komandÄ, kas strÄdÄ pie CPython interpretatora veiktspÄjas uzlaboÅ”anas, ir publicÄjis JIT kompilatora realizÄciju Python, izmantojot Copy-and-Patch tehniku. JIT publikÄcija ir izlaista ZiemassvÄtkiem, un tÄs paziÅojums ir uzrakstÄ«ts dzejÄ.
IerosinÄtais JIT izceļas ar ļoti augstu koda Ä£enerÄÅ”anas Ätrumu, vieglu uzturÄÅ”anu un pilnÄ«gu integrÄciju ar interpretatoru. IerosinÄtÄ metode automatizÄ interpretatora, kas uzrakstÄ«ts C valodÄ, pÄrveidoÅ”anu par JIT kompilatoru, bez atseviŔķas koda Ä£enerÄÅ”anas loÄ£ikas izveidoÅ”anas un bez manuÄlas assemblera reprezentÄciju izveides. Å ÄdÄ pieejÄ kļūdas laboÅ”ana interpretatorÄ automÄtiski novÄrÅ” to paÅ”u problÄmu arÄ« JIT, jo tiek izmantots kopÄ«gs koda Ä£enerators.
Copy-and-Patch metodes darbs balstÄs uz to, ka kodu atkÄrtoÅ”ana atmiÅÄ, to ielÄdÄjot ar objektu failu linkeru, un maŔīnu instrukciju apakÅ”stÄdīŔana vietÄ ar Š±Š°Š¹ŃŠŗŠ¾Š“а JIT ir lÄ«dzÄ«gas uzdevumiem. StrÄdÄjot JIT, programmÄ izpildes laikÄ tiek pÄrskatÄ«ti interpretatora radÄ«tie Š±Š°Š¹ŃŠŗŠ¾Š“а instruktÄ«vi un katrai instrukcijai tiek kopÄts iepriekÅ” kompilÄts maŔīnu kods izpildÄmÄs atmiÅas jomÄ, kÄ arÄ« Ä«slaicÄ«gi tiek mainÄ«tas instrukcijas, lai ievietotu apstrÄdÄtos datus (JIT kopÄ gatavas funkciju Å”ablonus un ievieto tajÄs nepiecieÅ”amÄs vÄrtÄ«bas, kÄ piemÄram, argumentus un konstantus). Objektu failu ielÄdÄÅ”anas laikÄ arÄ« notiek maŔīnu koda kopÄÅ”ana atmiÅÄ un ÄrÄjo simbolu apakÅ”stÄdīŔana.
Copy-and-Patch JIT, izmantojot LLVM, tiek izveidots objektu fails ELF formÄtÄ, kas satur informÄciju par Š±Š°Š¹ŃŠŗŠ¾Š“а instrukcijÄm un datus par nepiecieÅ”amo datu nomaiÅu. JIT nomaina interpretÄcijas laikÄ radÄ«tÄs Š±Š°Š¹ŃŠŗŠ¾Š“а instrukcijas uz maŔīnas kodu, vienlaikus ievietojot nepiecieÅ”amos skaitļoÅ”anas datus. JIT realizÄcijai ir nepiecieÅ”ams LLVM kÄ atkarÄ«ba veidoÅ”anas posmÄ, bet izpildes komponentes nav saistÄ«tas ar ÄrÄjÄm atkarÄ«bÄm un sastÄv no aptuveni 300 manuÄli rakstÄ«tÄm rindÄm C valodÄ un 3000 Ä£enerÄtÄm rindÄm koda C valodÄ.
SalÄ«dzinÄjumÄ ar tradicionÄliem JIT rÄ«kiem (LLVM -O0) piedÄvÄtais JIT nodroÅ”ina simts reizes ÄtrÄku koda Ä£enerÄÅ”anu un par 15% ÄtrÄku rezultÄjoÅ”o kodu. SalÄ«dzinÄjumÄ ar WebAssembly kompilÄciju (Liftoff) jaunais JIT Ä£enerÄ kodu piecas reizes ÄtrÄk, un rezultÄjoÅ”ais kods darbojas par 50% ÄtrÄk. SalÄ«dzinot jauno JIT ar optimizÄjoÅ”o JIT (LuaJIT), kas izmanto manuÄli rakstÄ«tu asembleri, piedÄvÄtais variants izrÄdÄ«jÄs ÄtrÄks 13 no 44 testiem, un vidÄji atpalika par 35%, saglabÄjot bÅ«tisku atvieglojumu uzturÄÅ”anÄ un samazinot realizÄcijas sarežģītÄ«bu.

Avots: opennet.lv
