July 10, 2023

Qanday qilib interpreted tillarni tezlashtirish mumkin. AOT va JIT haqida

Ma'lumingizkim o'tgan galgi maqolada biz yaratgan dasturlar yozilgan tiliga qarab qanday ishga tushirilishi haqida yozgan edim. Compiled tillarda yozilgan dasturlar ishga tushirilishidan oldin mashina tushinadigan kodga o'tkazib olinsa, interpreted tillarda yozilgan dasturlar qatorma qator va to'gridan to'g'ri interpreterlar orqali ishga tushiriladi. Bugun esa compilation turlari va qanday qilib interpreted dasturlarni tezligini oshirish mumkinligi haqida gaplashamiz.

Kodlarni mashina tushunadigan tilga o'tkazishning 2ta metodi mavjud. AOT(ahead-of-time) va JIT(just-in-time).

AOT - dasturlarning ishga tushirilishidan oldin mashina tiliga o'tkazib olish. Static compilation ham deb yuritiladi.

JIT - dasturning runtime muhitida mashina tiliga o'girish. Dynamic compilation ham deb yuritiladi.

AOT compilation dan foydalangan dasturlar allaqachon mashina tiliga o'tkazib bo'lingani sababli tezroq ishga tushadi, kamroq xotira sarf qiladi va generatsiya qilingan kodlar xavfsizlik tomondan ham ustunroq bo'ladi. Lekin ular testing uchun noqulay va har gal o'zgartirish kiritilganda compilation jarayoni vaqtimizni oladi. AOT compilationni hamma tillar va hamma platformalar qo'llab quvvatlamasligini ham unutmasligimiz kerak. Quyida AOT compilationni qo'llab quvvatlaydigan ba'zi tillar, texnalogiyalar va platformalarni keltirib o'taman.

  • Java: Java tilining AOTJC(ahead of time java compiler) nomli AOT compileri mavjud.
  • .Net: .Netda Ngen(Native Image Generator) nomli compiler mavjud.
  • Angular: Ha, Angularning ham sifatli javascript kodga aylantirib beradigan AOT compileri mavjud.
  • Android: Androidda Java dasturlari uchun AOT comiplation mavjud.
  • IOS: IOSda .Net dasturlari uchun AOT comiplation mavjud.
  • WebAssembly: har qanday dasturlash tili uchun AOT compilationni qo'llab quvvatlaydi.

Endi esa JIT haqida gaplashamiz. U qanday qilib interpreter dasturlarni tezlashtirib bera oladi? Ma'lumki interpreterlar dasturlarni bytcodega o'girib ishga tushiradi. bytecode mashinalarning ona tili bo'lmagani uchun ham to'gridan to'g'ri ishga tushirilmaydi va ishga tushirilishi uchun intertpreterlarga muxtoj. Bu esa sekinlikka sabab bo'ladi. Ho'sh unda runtime jarayonida bytecodeni mashina tiliga o'girsakchi? Shunda protsessor tomonidan hech qanday interpreterga muxtoj bo'lmasdan to'g'ridan to'g'ri ishga tushardi? Bu dasturlarni tezlata oladimi? Albatta tezlata oladi. Lekin baribir AOT ga nisbatan sekinroq ishlaydi.

AOT kabi JITni ham hamma dasturlash tillari va platformalar qo'llab quvvatlayvermaydi. Quyida JITni qo'llab quvvatlovchi ba'zi tillar va platformalarni keltirib o'taman:

  • Java: Java tilining HotSpot Virtual Machine (JVM) nomli JIT compileri mavjud.
  • C#: C# ning Common Language Runtime (CLR) nomli JIT compileri mavjud.
  • JavaScript: JavaScriptdagi JIT compiler bu v8 engine.
  • Python: Numba nomli JIT compiler.
  • Android: Androidda Java dasturlari uchun JIT comiplation mavjud.
  • IOS: IOSda C# dasturlari uchun JIT compilation mavjud.
  • Web browsers: Ko'p web browser lar JavaScript dasturlari uchun JIT compilationni qo'llab quvvatlaydi.

Ba'zida hamma kodlarni mashina kodiga o'tkazish dasturning startup vaqtini kechiktiradi shu sabab ko'p JIT compilerlar eng muhim qismlarnigini mashina tiliga o'tkazadi. Java tilini olaylik. JVM, masalan biror funksiyaning bytecode ini analiz qiladi va necha marotaba ishlatilganini hisoblaydi. Agar belgilangan miqdordan oshadigan bo'lsa uni CPU to'g'ridan to'gri ishga tushira oladigan mashina kodiga o'tkazib oladi va uni xotirada saqlaydi. Keyingi safar shu funksiya yana qayta chaqirilganda aynan o'sha mashinakodini ishga tushiradi va bu dasturni ancha tezlashtiradi. Agar mashina kodiga o'tkizilmay ishga tushirilganda har safar funksiya qayta chaqirilganda uning bytecode ini qayta qayta qatorma-qator yangittan ishga tushirgan bo'lar edi.

Xulosa qilib aytganda, AOT compilation lar JIT compilation larga qaraganda tezroq startup vaqtiga ega, lekin performance jihatdan JIT tezroq bo'la oladi. Chunki JIT runtime vaqtida dynamic ma'lumotlarga asoslanib yaxshiroq kod generatsiya qila oladi. Xavfsizlik tomondan esa AOT static ma'lumotlarni yaxshiroq analiz qila olgani uchun ustunlikka ega. Agar sizga tezroq ishga tushadigan, kamroq xotira istemol qiladigan, ko'proq xafsiz bo'lgan dasturlar kerak bo'lsa AOT compilation yaxshi tanlov. Lekin sizga performace tomondan yaxshi, portativ dasturlar kerak bo'lsa JIT compilationdan foydalaning.