Për Python është propozuar një JIT-kompilator që përdor teknikën copy-and-patch

Brandt Bucher nga Microsoft, një nga zhvilluesit kryesorë të CPython dhe që punon në ekipin që merret me rritjen e performancës së interpreterit CPython, publikoi një implementim të JIT-kompiluesit për Python, duke përdorur teknikën Copy-and-Patch. Publikimi i JIT është planifikuar për Krishtlindje dhe njoftimi është shkruar në formë poezie.

JIT i propozuar është i njohur për shpejtësinë shumë të lartë të gjenerimit të kodit, thjeshtësinë e mirëmbajtjes dhe integrimin e plotë me interpreterin. Metoda e propozuar lejon transformimin automatik të interpreterit, i shkruar në C, në një JIT-kompilues, pa formësimin e veçantë të logjikës së gjenerimit të kodit dhe pa krijimin manual të paraqitjeve të assembler-it. Me këtë qasje, rregullimi i një gabimi në interpreter automatikisht do të çojë në zgjidhjen e të njëjtit problem në JIT, pasi përdoret një gjenerator i përbashkët i kodit.

Puna e metodës Copy-and-Patch bazohet në faktin se relokimi i kodit në memorie kur ngarkohet nga linker-i i skedarëve objekt dhe ndërlikimi i instrukcioneve makinerike në vend të bytecode në JIT, janë detyra të ngjashme. Kur punon JIT, gjatë ekzekutimit të programit, do të bëhet skanimi i instrukcioneve të gjeneruara nga interpreter-i dhe kopjimi për secilën instrukcion të një kodi makinerik të përgatitur më parë në një zonë të memories me kod ekzekutues, si dhe ndryshimi në mënyrë dinamike i instrukcioneve për të vendosur të dhënat që po procesohen (JIT kopjon modele të gatshme të funksioneve të përgatitura dhe vendos në to vlera të nevojshme si argumentet dhe konstantet). Gjatë ngarkimit të skedarëve objekt, gjithashtu bëhet kopjimi i kodit makinerik në memorie dhe vendosja e simboleve të jashtme.

Në Copy-and-Patch JIT, me ndihmën e LLVM, ndërtohet një skedar objekt në formatin ELF, që përmban të dhëna mbi instrukcionet e bytecode dhe informacion mbi zëvendësimin e nevojshëm të të dhënave. JIT zëvendëson instrukcionet e gjeneruara gjatë interpretimit të programit me përfaqësime në kod makinerik, gjithashtu duke vendosur të dhënat e nevojshme për llogaritjet. 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 zvogëlohen në rreth 300 rreshta kodi të shkruar manualisht në C dhe 3000 rreshta të gjeneruar të kodit në C.

Në krahasim me mjetet tradicionale JIT (LLVM -O0), JIT i propozuar ofron një shpejtësi 100 herë më të shpejtë të gjenerimit të kodit dhe një kod të rezultuar 15% më të shpejtë. Në krahasim me kompilimin në WebAssembly (Liftoff), JIT i ri gjeneron kod 5 herë më shpejt dhe kodi i rezultuar punon 50% më shpejt. Nëse krahasojmë JIT-in e ri me JIT-in optimizues (LuaJIT), që përdor kod të shkruar manualisht në assembler, opsioni i propozuar ishte më i shpejtë në 13 nga 44 teste, ndërsa mesatarisht ka qenë 35% më të ngadalshëm në performancë, duke ruajtur një thjeshtësi të madhe në mirëmbajtje dhe duke zvogëluar nivelin e kompleksitetit të implementimit.

Luaj videon


Burimi: opennet.ru
Bleni hostim tĂ« besueshĂ«m pĂ«r faqe me mbrojtje nga DDoS, serverĂ« VPS VDS đŸ”„ Bleni hostim tĂ« besueshĂ«m pĂ«r faqe me mbrojtje nga DDoS, serverĂ« VPS VDS | ProHoster