بر اساس گفته های مختلف، نسخه ی هشتم زبان PHP در ماه دسامبر امسال (سال 2020) ارائه خواهد شد که دارای تغییرات زیادی است. در واقع بسیاری از RFC های PHP در حال حاضر تایید شده اند. بنابراین می توانیم برخی از آن ها را بررسی کنیم اما به هر حال قسمتی از تغییرات PHP 8 هنوز تایید نشده اند و نمی توان در مورد آن ها نظر قطعی داد. هدف این مقاله تنها آشنا کردن شما با برخی از تغییرات PHP 8 می باشد بنابراین بدون مقدمه وارد بحث می شویم.
معروف ترین و پر سر و صداترین قابلیت معرفی شده در PHP 8 قابلیتی به نام Just-in-time (JIT) compiler است اما این کامپایلر چه کاری می کند؟ RFC مربوطه می گوید:
“PHP JIT is implemented as an almost independent part of OPcache. It may be enabled/disabled at PHP compile time and at run-time. When enabled, native code of PHP files is stored in an additional region of the OPcache shared memory and op_array→opcodes[].handler(s) keep pointers to the entry points of JIT-ed code.”
بنابراین JIT قسمتی از OPcache است و شما می توانید با اختیار خود آن را فعال یا غیرفعال کنید. برای اینکه بخواهیم با JIT بهتر آشنا شویم و مطلب بالا را دقیقا برایتان ترجمه کنم، ابتدا باید بدانیم که PHP چطور یک اسکریپت را از اول تا آخر اجرا می کند. البته قبل از نام بردن از چهار مرحله باید با چند تعریف ساده آشنا باشید:
machine code: زبان های برنامه نویسی برای راحت شدن کار توسعه دهندگان ایجاد شده اند و معمولا طوری طراحی شده اند که تا حدی به زبان انسان نزدیک باشند. مشکل اینجاست که کامپیوترها نمی توانند این دستورات را بخوانند، بنابراین تمام زبان های برنامه نویسی باید به machine code تبدیل شوند. machine code کدهای باینری و هگزادسیمالی هستند که برای CPU آشنا هستند بنابراین می توانند به صورت مستقیم توسط CPU اجرا شوند. تبدیل اسکریپت و کدهای شما به machine code، بسته به زبان برنامه نویسی، یا توسط کامپایلرها و یا توسط مفسرها انجام می شود.
opcode: در هنگام اجرای یک اسکریپت، کدهای اسکریپت شما به opcode تبدیل می شوند که کدهایی میانی و low-level هستند (یعنی به زبان کامپیوتر یا machine code نزدیک تر هستند و تبدیل آن ها به machine code زمان کمتری می برد). شما می توانید opcode های PHP را در این لیست مشاهده کنید.
حالا می توانیم اجرا شدن اسکریپت های PHP را در چهار مرحله ی اصلی بررسی کنیم:
تمام مراحل بالا در تصویر زیر خلاصه شده است:
همچنین یک نمونه برای درخت AST را در تصویر زیر می بینید:
با این حساب قابلیت OPcache (که ربطی به نسخه ی جدید ندارد) چطور PHP را سریع تر می کند؟ برای پاسخ به این سوال باید بحث را به سه قسمت جداگانه تقسیم کنیم:
ما در این جلسه با مورد اول و در جلسه ی بعدی با موارد دوم و سوم آشنا خواهیم شد بنابراین بهتر است بدون مقدمه شروع کنیم.
زبان PHP یک زبان تفسیری (interpreted language) می باشد؛ یعنی زمانی که درخواستی برای سرور ارسال می شود، اسکریپت ما با ترتیب ذکر شده (parse شدن و کامپایل شدن و الی آخر) اجرا می شود. مسئله اینجاست که کامپایل شدن و parse شدن اسکریپت ما در هر درخواست، دوباره اجرا می شود. برخی از زبان های برنامه نویسی دیگر Compiled language هستند. مهم ترین تفاوت زبان های interpreted و compiled این است که سورس کد زبان های compiled توسط یک کامپایلر به machine code (کدهایی که به صورت مستقیم برای کامپیوتر قابل فهم باشند) تبدیل می شوند اما سورس کد زبان های interpreted با هر درخواست دوباره کامپایل می شود که می تواند باعث به هدر رفتن منابع CPU شود. چطور؟
تصور کنید هر بار که اسکریپت شما اجرا می شود، سورس کد باید دوباره به machine code کامپایل شود اما اگر شما سورس کد خود را تغییر نداده باشید، machine code های جدید برابر با machine code های قبلی خواهند بود! به عبارتی ما منابع خود را هدف دادیم و با استفاده از CPU دوباره همان راهی را رفتیم که قبلا رفته بودیم و اصلا نیازی به این کار نبود. اگر می توانستیم به نوعی جلوی این مشکل را بگیریم، سرعت برنامه بسیار بالا می رفت! از نسخه ی 5.5 زبان PHP قابلیت OPcache ارائه شده است و به صورت پیش فرض فعال است. وب سایت رسمی PHP در این باره می گوید:
“OPcache improves PHP performance by storing precompiled script bytecode in shared memory, thereby removing the need for PHP to load and parse scripts on each request.”
به زبان ساده تر با استفاده از OPcache اسکریپت شما فقط یک بار اجرا می شود (چهار مرحله ی اجرایی PHP فقط در دفعه ی اول اجرا خواهد شد) و سپس opcode ها یا machine code در مموری ذخیره می شود تا در درخواست های بعدی نیازی به کامپایل شدن دوباره ی اسکریپت نداشته باشیم. در واقع کامپایل شدن دوباره ی اسکریپت فقط زمانی رخ می دهد که PHP متوجه شود، اسکریپت شما نسبت به دفعه ی قبل تغییر کرده است، بدین صورت می توانیم جلوی هدر رفتن منابع سرور را بگیریم.
سایر قسمتهای این مبحث را در لینکهای زیر مطالعه کنید:
تغییرات جدید نسخه 8 زبان PHP (قسمت دوم)
تغییرات جدید نسخه 8 زبان PHP (قسمت سوم)
تغییرات جدید نسخه 8 زبان PHP (قسمت چهارم)
تغییرات جدید نسخه 8 زبان PHP (قسمت پنجم)
تغییرات جدید نسخه 8 زبان PHP (قسمت ششم)
دیدگاههای شما (3 دیدگاه)
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.