یک کامپایلر JIT جدید، ZJIT، به کدبیس پیادهسازی مرجع زبان روبی اضافه شده است و به عنوان نسل بعدی Ruby JIT قرار گرفته است. ZJIT در نسخه اصلی بعدی Ruby 3.5 گنجانده خواهد شد، جایی که به عنوان یک گزینه در کنار کامپایلر YJIT JIT در دسترس خواهد بود و ممکن است در Ruby 3.6 جایگزین آن شود. مانند YJIT، کامپایلر جدید JIT نیز با زبان Rust نوشته شده است. هر دو کامپایلر JIT توسط تیمی از توسعهدهندگان در Shopify به عنوان بخشی از ابتکار عمل برای بهبود عملکرد برنامههای Ruby که از چارچوب Rails استفاده میکنند و متدهای زیادی را فراخوانی میکنند، ایجاد شدهاند.
برخلاف YJIT، کامپایلر جدید JIT، بایتکد ماشین مجازی YARV را به یک نمایش میانی سطح پایین (اساساً تقریباً مستقیماً به کد ماشین) ترجمه نمیکند، بلکه بایتکد را به یک نمایش میانی سطح بالا SSA (تخصیص تکایستا) تبدیل میکند که روی آن میتوان مراحل بهینهسازی اضافی را پیادهسازی کرد و بهینهسازی را میتوان با توجه به بلوکهای بزرگ کد انجام داد، نه اینکه فقط به عملیات فعلی متکی باشد.
ZJIT کامپایل کل یک متد را در یک زمان انجام میدهد، در حالی که YJIT فقط میتواند کامپایل بلوکهای پایه را انجام دهد. برای پروفایلینگ نوع، ZJIT یک معماری JIT کلاسیک را پیادهسازی میکند که به جای تکنیک Lazy Basic Block Versioning (LBBV) که در YJIT استفاده میشود، از دادههای نوع تاریخی انباشته شده مفسر استفاده میکند.
استفاده از یک IR سطح بالا، مشکلات مقیاسپذیری YJIT را حل میکند، پایه و اساس پیادهسازیهای آیندهی کامپایل JIT چندسطحی را بنا مینهد، بهینهسازیهای پیشرفته (مانند استقرار درونخطی تهاجمیتر) را امکانپذیر میکند و تطبیق JIT با پلتفرمهای مختلف را آسانتر میسازد. بازگشت به مدل سنتی پروفایلینگ نوع، پیچیدگی را از کد حذف میکند و به مشارکتکنندگان جدید اجازه مشارکت میدهد (استفاده YJIT از LBBV منجر به این شد که پروژه برای سایر مشارکتکنندگان مبهم باشد و فقط توسط کارمندان Shopify توسعه داده شود).
منبع: opennet.ru
