A Pythonhoz egy JIT fordító került javaslatra, amely a copy-and-patch technikát használja.

A Microsoft képviselője, Brandt Bucher, aki a CPython fő fejlesztői közé tartozik, és a CPython értelmező teljesítményének javítására fókuszáló csapatban dolgozik, közzétett egy JIT-compiler implementációt a Python számára, amely a Copy-and-Patch technikát használja. A JIT közzétételét karácsonyhoz időzítették, és a bejelentés verses formában készült el.

A javasolt JIT kiemelkedik a rendkívül magas kódgenerálási sebességével, a karbantartás egyszerűségével és a teljes integrációjával az értelmezővel. A javasolt módszer lehetővé teszi, hogy a C nyelven írt értelmezőt automatikusan JIT-compilerre alakítsuk át, anélkül, hogy külön kódgeneráló logikát kellene kialakítani, vagy manuálisan kellene assemblerszintű megvalósításokat létrehozni. E megközelítés következtében hibaelhárítás az értelmezőben automatikusan megszünteti a problémát a JIT-ben is, mivel közös kódgenerátort használnak.

A Copy-and-Patch módszer lényege abban rejlik, hogy a kód újrahordozása a memóriában az objektumfájlok betöltésekor és a gépi utasítások behelyettesítése a bájtcode-ba a JIT-ben hasonló feladatok. A JIT működés során, a program végrehajtása közben, a készített értelmező által generált bájtcode utasításokat vizsgálja, és minden egyes utasítás számára átkonvertált gépi kódot másol a végrehajtható kód memóriaterületére, valamint futás közben módosítja az utasításokat, hogy az éppen feldolgozott adatokat helyettesítse bennük (a JIT készen álló, már lefordított függvények sablonjait másolja, és beilleszti a szükséges értékeket, mint például argumentumokat és konstansokat). Az objektumfájlok betöltése során szintén gépi kód másolás történik a memóriába, és külső szimbólumok behelyettesítése.

A Copy-and-Patch JIT segítségével az LLVM használatával ELF formátumú objektumfájlt állítanak elő, amely tartalmazza a bájtcode utasításait és az adatcserére vonatkozó információkat. A JIT a program futása során az interpretált programban generált bájtcode utasításokat a gépi kód megfelelő képviselőire cseréli, miközben behelyettesíti a számításokhoz szükséges adatokat. A JIT implementálásához az LLVM modulra van szükség a fordítási fázisban, de a futási komponensek nem kötődnek külső függőségekhez, és körülbelül 300 manuálisan írt C nyelvű sorból és 3000 generált C kódsorból állnak.

A hagyományos JIT-eszközökhöz (LLVM -O0) képest a javasolt JIT 100-szor gyorsabb kódgenerálást és 15%-kal gyorsabb eredménykódot biztosít. Az WebAssembly-be való fordítással (Liftoff) összehasonlítva az új JIT 5-ször gyorsabban generál kódot, a kapott kód pedig 50%-kal gyorsabban fut. Ha az új JIT-et összehasonlítjuk az optimalizáló JIT-tel (LuaJIT), amely manuálisan írt assemblerkódot használ, akkor a javasolt megoldás 44 teszt közül 13-ban gyorsabb volt, míg átlagosan 35%-kal lassabb volt, mindezt jelentős karbantartási egyszerűsítéssel és a megvalósítási komplexitás csökkentésével elveszítve.

Videó lejátszása


Forrás: opennet.ru
Megbízható hosting vásárlása weboldalak számára, DDoS védelemmel, VPS VDS szerverek. 🔥 Megbízható webtárhely vásárlása DDoS védelemmel, VPS VDS szerverek | ProHoster