Brandt Bucher dari Microsoft, pembangun teras CPython yang bekerja dalam pasukan yang berusaha meningkatkan prestasi penterjemah CPython, telah menerbitkan pelaksanaan pengkompil JIT untuk Python yang menggunakan teknik Copy-and-Patch. Pengeluaran JIT ditetapkan pada masa Krismas, dan pengumuman itu ditulis dalam ayat.
JIT yang dicadangkan terkenal dengan kelajuan penjanaan kod yang sangat tinggi, kemudahan penyelenggaraan dan penyepaduan penuh dengan penterjemah. Kaedah yang dicadangkan membenarkan penukaran automatik penterjemah yang ditulis dalam C ke dalam pengkompil JIT, tanpa memerlukan logik penjanaan kod berasingan atau perwakilan pemasangan manual. Dengan pendekatan ini, membetulkan ralat dalam penterjemah secara automatik akan menyelesaikan masalah yang sama dalam JIT, kerana penjana kod biasa digunakan.
Kaedah Copy-and-Patch beroperasi pada fakta bahawa memindahkan kod dalam memori apabila memuatkan fail objek oleh pemaut dan menggantikan arahan mesin untuk bytecode dalam JIT adalah tugas yang serupa. Semasa pelaksanaan program, JIT melelar melalui arahan bytecode yang dijana oleh penterjemah, menyalin kod mesin pra-disusun untuk setiap arahan ke dalam kawasan memori yang mengandungi kod boleh laku, dan mengubah suai arahan dengan cepat untuk menggantikan data yang sedang diproses (JIT menyalin templat siap sedia bagi fungsi yang telah disusun dan menggantikannya ke dalam nilai yang diperlukan dan pemalar). Apabila memuatkan fail objek, kod mesin juga disalin ke dalam memori dan simbol luaran digantikan.
Copy-and-Patch JIT menggunakan LLVM untuk membina fail objek ELF yang mengandungi data arahan bytecode dan maklumat penggantian data yang diperlukan. JIT menggantikan arahan bytecode yang dijana semasa tafsiran program dengan perwakilan kod mesin, pada masa yang sama menggantikan data yang diperlukan untuk pengiraan. Pelaksanaan JIT memerlukan LLVM sebagai kebergantungan masa binaan, tetapi komponen masa jalan tidak terikat dengan kebergantungan luaran dan dikurangkan kepada kira-kira 300 baris tulisan tangan kod C dan 3000 baris kod C yang dijana.
Berbanding dengan rantai alat JIT tradisional (LLVM-O0), JIT yang dicadangkan menyampaikan penjanaan kod 100x lebih pantas dan kod terhasil 15% lebih pantas. Berbanding dengan kompilasi WebAssembly (Liftoff), JIT baharu menjana kod 5x lebih pantas dan kod yang terhasil berjalan 50% lebih pantas. Apabila membandingkan JIT baharu dengan JIT pengoptimuman (LuaJIT), yang menggunakan kod pemasangan tulisan tangan, JIT yang dicadangkan adalah lebih pantas dalam 13 daripada 44 ujian, dengan purata kehilangan prestasi sebanyak 35%, sambil memudahkan penyelenggaraan dan mengurangkan kerumitan pelaksanaan dengan ketara.

Sumber: opennet.ru
