Bosh sahifa Wiki Just-In-Time Compilation

Just-In-Time Compilation

Just-In-Time Compilation — dastur kodi bajarilish vaqtida oraliq formatdan target mashina kodiga compile qilinadigan usuldir. JIT interpreter moslashuvchanligini native kod tezligi bilan birlashtirishga urinadi. Java Virtual Machine, .NET runtime va ko‘plab JavaScript engine’lari profiling ma’lumotiga qarab tez-tez ishlatiladigan kodni optimallashtiradi.

Bajarilish bosqichlari

Dastur avval bytecode yoki intermediate representation ko‘rinishida tarqatiladi. Runtime uni interpretatsiya qilib boshlashi mumkin, shu vaqtda call soni, branch natijasi, type va allocation haqida profil yig‘adi. “Hot” deb topilgan method yoki loop compilerga yuborilib, ayni processor uchun native instructionga aylantiriladi.

Tiered compilation tez start uchun arzon, kam optimallashtirilgan kod yaratadi, keyin uzoq ishlaydigan qismlarni qimmatroq optimallashtiradi. Code cache compile qilingan natijani saqlaydi. Cache to‘lsa eski yoki sovuq kod chiqarilishi mumkin; compilation threadlari application ishiga resurs bo‘yicha raqobat qiladi.

Spekulyativ optimallashtirish

Runtime real type va branch tarixini bilgani uchun compiler “bu call site’da odatda bitta class keladi” kabi taxmin qiladi. Virtual call inline qilinib, type checkdan keyin bevosita kod bajariladi. Escape analysis obyekt methoddan tashqariga chiqmasligini aniqlab, heap allocationni yo‘qotishi mumkin.

Taxmin buzilsa deoptimization yuz beradi: runtime native frame holatini interpreter yoki kam optimallashtirilgan kodga qaytaradi. Safepoint metadata object location va stack holatini tiklashga yordam beradi. Spekulyativ kod semantikani o‘zgartirmasligi kerak; faqat kuzatilgan holat uchun tez yo‘l yaratadi.

Afzallik va xarajat

JIT target CPU feature’larini aynan runtime’da biladi va production workloadga mos profilga tayana oladi. Dynamic til uchun real object shape va type feedback katta optimallashtirish imkonini beradi. Buning evaziga warm-up davri, compile latency, code cache xotirasi va performance o‘zgaruvchanligi paydo bo‘ladi.

Qisqa CLI yoki serverless function compile foydasini olishdan oldin tugashi mumkin. Profile-guided AOT yoki cached code bunday holatda qulay. Long-running server warm-up’ni canary trafik bilan bajarishi, benchmark esa steady-state bilan birga cold startni ham o‘lchashi kerak.

Xavfsizlik va diagnostika

JIT writable xotiraga code yaratadi, keyin executable qiladi. W^X siyosati sahifaning bir vaqtda yoziluvchi va bajariluvchi bo‘lmasligini talab qiladi. Code signing cheklangan platformalarda JIT alohida entitlement yoki umuman taqiqlanishi mumkin. Compiler bug sandbox chegarasini buzishi ehtimoli sabab engine yangilanishlari xavfsizlik patchidir.

Profiling log compilation, deoptimization va safepoint vaqtini ko‘rsatadi. Oddiy source profiler inline frame’larni JIT metadata orqali tiklaydi. Benchmarkni bir marta ishga tushirish chalg‘itadi; warm-up soni, runtime flag, GC va CPU frequency qayd etiladi.

On-stack replacement

Uzoq davom etadigan loop method qaytishini kutmasdan optimallashtirilishi mumkin. On-stack replacement interpreter yoki past tier’dagi joriy frame’ni loopning ma’lum nuqtasida optimized frame’ga ko‘chiradi. Buning uchun local variable va operand holati ikki representation orasida aniq xaritalanadi. Deoptimization teskari yo‘nalishda ayni ma’lumotni tiklaydi. Profil hot loop ichida o‘zgarsa runtime yangi variant compile qilishi mumkin. Bunday dinamik o‘tish stack trace va performance profilini murakkablashtiradi; observability logical source frame bilan real compiled versionni bog‘laydi. Compiler thresholdlarini o‘zgartirishdan oldin application latency va compilation CPU birga o‘lchanadi.

Bog‘liq tushunchalar

Bytecode, Interpreter, Ahead-Of-Time Compilation, Inlining, Deoptimization, Code cache, Runtime profiling