Za Python je predložen JIT-kompajler koji koristi tehniku copy-and-patch

Brandt Bucher iz Microsofta, koji je jedan od glavnih programera CPythona i radi s timom koji se bavi poboljšanjem performansi CPython interpretera, objavio je implementaciju JIT kompajlera za Python koja koristi Copy-and-Patch tehniku. Objavljivanje JIT-a usklađeno je s Božićem, a najava je napisana u stihu.

Predloženi JIT se odlikuje vrlo visokom brzinom generiranja koda, jednostavnošću održavanja i potpunom integracijom s interpreterom. Predložena metoda omogućuje automatsku transformaciju interpeter napisanog u C-u u JIT kompajler bez zasebnog oblikovanja logike generiranja koda i bez ručnog stvaranja asemberskih reprezentacija. Ovaj pristup osigurava da ispravak greške u interpreteru automatski uklanja istu problematiku u JIT-u, jer se koristi zajednički generator koda.

Rad Copy-and-Patch metode temelji se na sličnosti zadataka koji uključuju relokaciju koda u memoriji prilikom učitavanja objektnog datoteka i umetanja mašinskih instrukcija umjesto bajtkoda u JIT. Kada JIT radi tijekom izvršenja programa, prolazi kroz instrukcije bajtkoda koje je stvorio interpreter, te za svaku instrukciju kopira unaprijed kompajlirani mašinski kod u područje memorije koje sadrži izvršni kod, kao i dinamički mijenja instrukcije za umetanje obrađenih podataka (JIT kopira gotove predloške već kompajliranih funkcija i umetne potrebne vrijednosti, kao što su argumenti i konstante). Prilikom učitavanja objektnog datoteka također se obavlja kopiranje mašinskog koda u memoriju i umetanje vanjskih simbola.

U Copy-and-Patch JIT, uz pomoć LLVM, sastavlja se objektna datoteka u ELF formatu koja sadrži podatke o instrukcijama bajtkoda i informacije o potrebnim zamjenama podataka. JIT zamjenjuje generirane instrukcije bajtkoda tijekom interpretacije programa s njihovim reprezentacijama u mašinskom kodu, istovremeno umetnuvši podatke potrebne za izračune. Implementacija JIT-a zahtijeva kao zavisnost LLVM tijekom faze izgradnje, ali runtime komponente nisu vezane uz vanjske ovisnosti i svode se otprilike na 300 ručno pisanih redaka u C-u i 3000 generiranih redaka koda u C-u.

U usporedbi s tradicionalnim JIT alatom (LLVM -O0), predloženi JIT osigurava 100 puta bržu generaciju koda i 15% brži rezultantni kod. U usporedbi s kompajliranjem u WebAssembly (Liftoff), novi JIT generira kod 5 puta brže, a rezultantni kod radi 50% brže. Ako usporedimo novi JIT s optimizirajućim JIT-om (LuaJIT), koji koristi ručno napisani kod na asembleru, predložena opcija pokazala se bržom u 13 od 44 testa, dok je u prosjeku bila sporija za 35%, uz značajno pojednostavljenje održavanja i smanjenje razine složenosti implementacije.

Pogledajte video


Izvor: opennet.ru
Kupite pouzdan hosting za web stranice s DDoS zaštitom, VPS VDS servere 🔥 Kupite pouzdan hosting za web stranice s DDoS zaštitom, VPS VDS servere | ProHoster