
Python je programski jezik visokog nivoa.
Nedavno jedan od glavnih CPython programeri su predstavili novi JIT kompajler za Python koristeći tehniku Copy-and-Patch, koji je novija i inovativna tehnika kompilacije to jest ističe se brzinom, lakoćom održavanja i njegovu potpunu integraciju sa postojećim prevodiocem.
Kopiraj i zakrpi zasniva se na upotrebi unapred definisane biblioteke fragmenata binarnog koda poznatih kao "šablone" za izlaz optimizovanog mašinskog koda. Ovi predlošci su unaprijed izgrađene implementacije AST (Apstraktno stablo sintakse) čvorova ili bajtnih opkodova koji sadrže nedostajuće vrijednosti, kao što su neposredni literali, pomaci varijabli steka i ciljevi grananja i poziva.
Omogućava vam da sistematski generišete varijante binarnih šablona u C++ na čist i čist način. Koristi Clang+LLVM infrastrukturu kompajlera da sakrijete specifične detalje platforme na niskom nivou.
U toku rada, optimizacija i generisanje koda postaju jednostavniji zadacil Pronađite tabelu podataka koja sadrži odgovarajući predložak, kreirajte njegovu instancu i postavite je na željenu poziciju koristeći proces Copy-and-Patch, prilagođavajući sve nedostajuće vrednosti koje će biti zakrpljene tokom izvođenja.
Gledajući iz jednostavnije perspektive, sastoji se od kompajliranja (kopiranja) postojećeg izvornog koda i prilagođavanja nedostajućih vrijednosti ili specifičnih modifikacija (patch).
Copy-and-Patch uvelike olakšava automatsku konverziju tumača napisanog u C jeziku u JIT kompajleru, eliminišući potrebu za odvojenim kreiranjem logike generisanja koda i reprezentacija kompilacije. Korištenjem uobičajenog generatora koda, ispravljanje grešaka u interpretatoru rezultira automatskim rješavanjem istih problema u JIT-u.
Pristup Copy-and-Patch oslanja se na sličnost između premeštanja koda u memoriju Kada linker učitava objektne datoteke i zamjena strojnih instrukcija umjesto bajtkoda u JIT-u su slični zadaci. Tokom izvršavanja programa, lNavedene su instrukcije bajtkoda koje je generirao interpreter, i prethodno kompajlirani mašinski kod se kopira za svaku instrukciju u područje izvršne memorije, zatim ovog uputstva Oni se dinamički modificiraju kako bi zamijenili obrađene podatke u realnom vremenu. U slučaju JIT-a, unaprijed definirani predlošci se kopiraju iz već kompajliranih funkcija i zamjenjuju potrebnim vrijednostima, kao što su argumenti i konstante).
Implementacija JIT-a sa tehnikom Copy-and-Patch uključuje kompajliranje objektne datoteke u ELF formatu ilikoristeći LLVM. Ova prigovorena datoteka sadrži informacije o uputama bajtkoda i detalje o potrebnoj zamjeni podataka. Tokom izvršavanja, JIT zamjenjuje bajtkod instrukcije koje generiše interpreter sa prikazima mašinskog koda, istovremeno prilagođavajući podatke potrebne za proračune. Iako implementacija JIT-a zahtijeva LLVM kao ovisnost tokom kompilacije, komponente vremena izvođenja nisu vezane za vanjske ovisnosti, smanjujući na približno 300 redova rukom pisanog C koda i 3000 redova generiranog C koda.
Što se tiče performansi, predloženi JIT sa tehnikom Copy-and-Patch predstavlja značajna poboljšanja u poređenju sa tradicionalnim pristupima. U poređenju sa konvencionalnim JIT-ovima (LLVM -O0), ističe se 100 puta bržim generiranjem koda i rezultirajućim kodom koji Efikasniji je za 15%. U području kompilacije WebAssembly-a (Liftoff), novi JIT demonstrira 5x brže generiranje koda, a rezultirajući kod radi 50% brže.
U poređenju sa optimizacijskim JIT-om kao što je LuaJIT, koji koristi ručno pisani asemblerski kod, predloženi JIT je bio bolji u 13 od 44 testa. Iako je u prosjeku zaostajao u performansama za 35%, bitno je naglasiti da je ova razlika nadoknađena značajnim pojednostavljenjem održavanja i smanjenjem složenosti implementacije. Ova ravnoteža između performansi i efikasnosti u upravljanju kodom pozicionira predloženi JIT kao atraktivnu alternativu u okruženju performansi.
Finalmeni ako ste zainteresovani da saznate više o tome, možete provjeriti detalje Na sledećem linku.