Python piedāvā JIT kompilatoru, kas izmanto copy-and-patch tehniku

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.

Atskaņot video


Avots: opennet.lv
Iegādājieties uzticamu tÄ«mekļa hostingu ar DDoS aizsardzÄ«bu, VPS VDS serveriem šŸ”„ Iegādājieties uzticamu tÄ«mekļa hostingu ar DDoS aizsardzÄ«bu, VPS VDS serveriem | ProHoster