به عبارت ساده، JIT (just-in-time compilation) تکنیکی است که امکان کامپایل یک برنامه در کد ماشین را بلافاصله قبل از اجرای آن فراهم می کند. در واقع، این رویکرد منجر به اجرای کد، بسیار سریعتر میشود. گاهی اوقات JIT به عنوان یک میانگین طلایی بین انعطاف پذیری در توسعه کد برنامه و عملکرد زمان اجرا نامیده می شود.
همانطور که قبلاً اشاره کردم، تا به امروز عملکرد بهتر PHP بر اساس OPCache با استفاده از به اصطلاح (OPCode) بود که که یک قطعه کد از پیش کامپایل شده در قالب دستوراتی است که برای اجرا به پردازنده داده می شود. کد ذخیره شده می تواند تقریباً بلافاصله توسط یک ماشین مجازی اجرا شود. با این حال، هنوز کد ماشین بومی نیست.
JIT کد ماشین واقعی را ارائه می دهد که به گونه ای پیاده سازی شده است که با OPCache کار کند. هنگامی که اسکریپت برای اولین بار راه اندازی می شود، اگر قبلاً در OPCache ذخیره شده باشد، بلافاصله برگردانده شده و کامپایل می شود (اگر قبلاً نبوده است). با این حال، در صورتی که اسکریپت هنوز کش نشده باشد، ابتدا مانند گذشته کل فرآیند تولید OPCode را طی می کند. کل فرآیند به طور کامل در نمودار زیر نشان داده شده است.
اگر فکر می کنید JIT فقط بخشی از زبان / مترجم است و به طور خودکار کار می کند، در اشتباه هستید. متأسفانه برای استفاده از آن، به پیکربندی اضافی نیاز دارد، که در نگاه اول واضح به نظر نمی رسد. کل عملیات در فایل پیکربندی php.ini انجام می شود که برای برنامه نویسان PHP شناخته شده است.
اولین نکته مهم این است که JIT فقط زمانی کار می کند که OPCache فعال باشد. هر نصب پیش فرض PHP دارای این مقدار (opcache.enable) است که بلافاصله روی ۱ تنظیم می شود. سپس، برای استفاده کردن از JIT، باید دو پارامتر را تنظیم کنیم:
اولین مورد (opcache.jit_buffer_size) مسئول تعریف مقدار حافظه ای است که می خواهیم برای کامپایل کد اختصاص دهیم. تنظیم مقدار حاقظه بسیار ساده است:
در مورد پارامتر دوم (opcache.jit)، اساساً به شما می گوید که JIT چگونه قرار است کار کند. برای اجرا، اجازه دهید با یک مثال شروع کنم:
بله، من نیز از مقدار عددی شگفت زده شدم. در ابتدا فکر کردم که این یک نوع بیت ماسک یا چیزی است. با این حال، وقتی RFC را تجزیه و تحلیل کردم، که در آن جزئیات بیشتری در مورد گزینههای فردی پیدا میکنیم، مشخص شد که هر یک از این ارقام به طور جداگانه یک مقدار پیکربندی خاص است. بنابراین من می خواهم سه مقدار پیکربندی را ارائه دهم که ممکن است بیشترین استفاده را داشته باشند. آنها میانبری برای کمک به توسعه دهندگان برای تنظیم حالت مورد نظر هستند.
هر توسعه دهنده خوبی باید بداند که مهمترین عاملی که بر عملکرد برنامه تأثیر می گذارد، کیفیت کد آنهاست. یکی دیگر از عوامل به همان اندازه مهم، انتخاب فناوری هایی است که کل پشته آن را تشکیل می دهند و نحوه توسعه آنها. در مورد PHP، OPCache یک انقلاب بود. با این حال، (JIT) علیرغم تبلیغات گسترده رسانه ای به نظر نمی رسد که نقطه عطف باشد، به خصوص برای برنامه های کاربردی وب. چرا؟
JIT با هدف کامپایل دسته ای از کدها معرفی شد که در معرض نوسانات قابل توجهی نیستند. تکههای کدی که بیش از یک بار اجرا میشوند را شناسایی کرده و بر اساس آن کامپایل میکند. همانطور که احتمالاً قبلاً حدس میزنید، اجرای کد در حین رسیدگی به یک پرس و جو یا درخواست یک برنامه وب به متغیرهای بسیار زیادی بستگی دارد و در واقعیت، معلوم میشود که این تکههای کد یکسان تعداد کمی هستند. علاوه بر این، در برخی موارد ممکن است تعداد آنها به قدری کم باشد که به جای سرعت بخشیدن به برنامه، JIT در واقع به دلیل بار اضافی کامپایل کردن کد، سرعت آن را کاهش دهد.
در یکی از تستهای عمومی موجود این پروژه بر اساس چارچوب لاراول و شرح داده شده در مقاله medium.com، میتوانیم متوجه شویم که اجرای آن در PHP 8 با JIT تنها کمی عملکرد را افزایش میدهد:
به وضوح می توان دید که در برنامه های کاربردی وب، عملکرد اضافه شده به سختی قابل توجه خواهد بود.
معرفی یک کامپایلر JIT در PHP در واقع گامی برای باز کردن زبان به روی امکانات جدید است. JIT به طور قابل توجهی عملکرد اجرای کد را در برنامه های فشرده CPU بهبود می بخشد. این در مورد استفاده از PHP برای اهداف کاملاً جدید است، مانند یادگیری ماشینی، محاسبات پیچیده ریاضی، یا پردازش/مدل سازی تصویر ۲D/3D.
پیاده سازی کامپایلر JIT گامی در جهت باز کردن زبان به روی امکانات جدید و تبدیل کردن به عنوان مثال PHP برای استارت آپ ها است. توانایی کامپایل مستقیم کد PHP وابستگی به C را کاهش می دهد، که توسعه آن را بدون هیچ گونه پیامدهای عملکردی آسان تر و در واقع ممکن می کند. غیرقابل انکار، JIT عملکرد برنامه را به میزان کم یا زیاد بهبود می بخشد.
از سوی دیگر، JIT در شکل فعلی خود قادر به بهبود قابل توجهی عملکرد برنامه های کاربردی وب نیست و در برخی سناریوهای خاص حتی ممکن است منجر به عملکرد بدتر از قبل شود. نحوه عملکرد آن نیز می تواند بر روند توسعه تأثیر بگذارد و اشکال زدایی کد را دشوار کند، زیرا برخی از مشکلات شناخته شده با ابزار xDebug وجود دارد. JIT همچنین به دانش پیکربندی اضافی از توسعه دهندگان نیاز دارد.
در Droptica، جایی که ما خدمات دروپال را ارائه می دهیم، پشتیبانی دروپال و تیم ما شامل بسیاری از برنامه نویسان PHP است، می دانیم که اگرچه JIT در جهان کاملاً جدید نیست (فیس بوک و HHVM آنها پیشرو بودند)، به زودی به بخشی از زبان اصلی تبدیل خواهد شد. با انتشار PHP 8. JIT قصد دارد عملکرد اجرای کد را بهبود بخشد و امکانات استفاده از خود زبان را گسترش دهد. فکر میکنم در سالهای آینده باید مراقب توسعه آن باشیم، که میتواند نتایج بهتری بهویژه در زمینه برنامههای کاربردی تحت وب داشته باشد.