تغییرات جدید نسخه 8 زبان PHP چیست؟ (قسمت اول)

What's New in PHP 8? - Part 1

26 خرداد 1399
تغییرات جدید نسخه ی 8 زبان PHP چیست؟ (قسمت اول)

بر اساس گفته های مختلف، نسخه ی هشتم زبان PHP در ماه دسامبر امسال (سال 2020) ارائه خواهد شد که دارای تغییرات زیادی است. در واقع بسیاری از RFC های PHP در حال حاضر تایید شده اند. بنابراین می توانیم برخی از آن ها را بررسی کنیم اما به هر حال قسمتی از تغییرات PHP 8 هنوز تایید نشده اند و نمی توان در مورد آن ها نظر قطعی داد. هدف این مقاله تنها آشنا کردن شما با برخی از تغییرات PHP 8 می باشد بنابراین بدون مقدمه وارد بحث می شویم.

کامپایلر JIT

معروف ترین و پر سر و صداترین قابلیت معرفی شده در 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 را در چهار مرحله ی اصلی بررسی کنیم:

  • Lexing/Tokenizing: در این مرحله که مرحله ی اول می باشد، مفسر (interpreter) زبان PHP وارد عمل شده، تمام اسکریپت را خوانده و توکن هایی را می سازد.
  • Parsing: مفسر چک می کند که آیا اسکریپت نوشته شده با قواعد نحوی (syntax rules) مطابقت دارد یا خیر و سپس از توکن های ساخته شده در مرحله ی قبل برای ساخت چیزی به نام Abstract Syntax Tree (به اختصار AST) استفاده می کند. AST به زبان ساده یک نمای سمبلیک درختی و سلسله مراتبی از سورس کد شما است.
  • Compilation: مفسر در این مرحله در درخت AST گردش کرده و node های آن را به opcode های سطح پایین Zend تبدیل می کند. این opcode های سطح پایین شناسه هایی عددی هستند که نوع دستورات اجرا شده توسط ماشین مجازی Zend را مشخص می کنند (اطلاعات بیشتر در این لینک).
  • Interpretation: در این مرحله opcode ها تفسیر شده و در ماشین مجازی Zend یا همان Zend VM اجرا می شوند.

تمام مراحل بالا در تصویر زیر خلاصه شده است:

مراحل اجرای دستور در زبان PHP - تغییرات PHP 8
مراحل اجرای دستور در زبان PHP

همچنین یک نمونه برای درخت AST را در تصویر زیر می بینید:

مثالی از درخت AST
مثالی از درخت AST

با این حساب قابلیت OPcache (که ربطی به نسخه ی جدید ندارد) چطور PHP را سریع تر می کند؟ برای پاسخ به این سوال باید بحث را به سه قسمت جداگانه تقسیم کنیم:

  • افزونه ی OPcache چیست؟
  • preloading چیست؟
  • درک بهتر JIT

ما در این جلسه با مورد اول و در جلسه ی بعدی با موارد دوم و سوم آشنا خواهیم شد بنابراین بهتر است بدون مقدمه شروع کنیم.

افزونه OPcache چیست؟

زبان 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 متوجه شود، اسکریپت شما نسبت به دفعه ی قبل تغییر کرده است، بدین صورت می توانیم جلوی هدر رفتن منابع سرور را بگیریم.

نحوه ی اجرای دستورات در صورت استفاده از opcache و کش کردن دستورات در PHP
نحوه ی اجرای دستورات در صورت استفاده از opcache و کش کردن دستورات در PHP


سایر قسمت‌های این مبحث را در لینک‌های زیر مطالعه کنید:

تغییرات جدید نسخه 8 زبان PHP (قسمت دوم)
تغییرات جدید نسخه 8 زبان PHP (قسمت سوم)
تغییرات جدید نسخه 8 زبان PHP (قسمت چهارم)
تغییرات جدید نسخه 8 زبان PHP (قسمت پنجم)
تغییرات جدید نسخه 8 زبان PHP (قسمت ششم)

نویسنده شوید

دیدگاه‌های شما (3 دیدگاه)

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.

afshin
23 آبان 1399
واقعا جای اینجور مقالات بین محتوای سایت های ایرانی خالیه مطلب کاربردی و قوی بود

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.

Mehran
24 تیر 1399
چه جالب . مرسی از روکسو

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.

سینا قاسمی
28 خرداد 1399
درود بر شما

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.