Developers
Developers
خواندن ۶ دقیقه·۵ سال پیش

افزایش 45 برابری سرعت PHP 8 نسبت به PHP 7

کامپایلر JIT در PHP نسخه 8
کامپایلر JIT در PHP نسخه 8


کامپایل JIT چیست؟

کامپایل JIT به اختصار رسیده کلمات Just In Time است، JIT یک تکنیک است که کدهای نرم‌افزار ما را در حال اجرا کامپایل (Compile) یا جمع‌آوری می‌کند که می‌توان در عوض کامپایلرهای دیگر از آن استفاده کرد.

شاید تا به حال اسم JIT به گوشتان نخورده است پس اجازه دهید اول توضیح بدهیم که JIT چیست؟ شاید شما از قبل می‌دانستید که PHP یک زبان تفسیر شده است، به این معنا که کد شما قبل از اجرا شدن نیازی به کامپایل (Compile) شدن ندارد مثل زبان‌های C و ++C. در عوض آن، PHP کد شما را می‌خواند و آن را اجرا می‌کند به عبارت دیگر شما کدی نمی‌نویسید که درون کدهای سطح پایین کامپایل شود تا توسط کامپیوتر اجرا بشوند، اما شما یک سند (Script) از کدها را به PHP می‌دهید تا اجرا شوند.

زبان PHP یک ماشین مجازی به اسم Zend VM دارد، چرا آن را ماشین مجازی صدا می‌زنیم؟ چون مثل کامپیوتر شما برای اجرا کردن کدها عمل می‌کند، بر اساس توضیح بالا خواندن و اجرا کردن کد بر عهده‌ی ماشین مجازی است. اما قبل از آن کد شما توسط PHP خوانده و به کدهای عملیاتی (Opcode) (کدهای عملیاتی یا Opcode زبانی است که Zend VM آن را متوجه می‌شود و توسط Zend Vm ترجمه می‌شوند) و بعد از آن Zend VM می‌تواند کدهای عملیاتی (Opcode) را ترجمه کند. در زیر شما یک تصویر را برای درک بیشتر مشاهده می‌کند.

با این اوصاف ما در قدم اول به یک کامپایل (Compile) نیاز داریم و در قدم بعدی به یک مترجم. برای صرفه جویی در زمان به اصطلاح یک چیزی به اسم (OPCache (Opcode Cache داریم که قدم‌های مختلف کامپایل کردن را ذخیره می‌کند تا دفعه‌ی بعدی نیازی به دوباره کامپایل کردن کدها نباشد.

تا الان PHP این گونه کار می‌کرد، خب حالا باید درباره‌ی کامپایلر JIT در PHP صحبت کنیم. از قبل JIT توسط کامپایلر قابل دسترس بوده است به این معنا که کد ما  به کد ماشین یا سطح پایین تبدیل می‌شود تا اجرا شود. JIT بر پایه Just In Time است به این معنا که به جای اینکه اول کامپایل کند و بعد کدهای ما را اجرا کند، زمانی که شما نیاز به اجرا کردن کدهای خود دارید در آن موقع شروع به کامپایل کردن کدها می‌کند.

برای PHP به جای اینکه کدها به ماشین مجازی Zend VM برای اجرا کردنشان بروند، کامپایلر JIT کدهای PHP ما را به کدهای سطح پایین کامپایل، و اجرا می‌کند پس ما دیگر به مترجم نیازی نداریم، البته کد سریع‌تر از قبل هم اجرا می‌شود.

اگر دانش‌ بالایی نسبت به کدهای سطح پایین دارید می‌توانید کدهای نوشته شده برای JIT که در مخزن گیت‌هاب وجود دارد را مشاهده و شروع به خواندن کنید.

آیا PHP را سریع‌تر می‌کند؟

زیو (Zeev) یکی از توسعه دهندگان هسته PHP یک دمو (Demo) را منتشر کرده است که سرعت PHP را با JIT نشان می‌دهد که چقدر سریع‌تر شده است در مقایسه با ورژن قبلی آن، درون این ویدیو کدی وجود دارد که در حال ساختن یک تصویر سه بعدی است.

https://www.aparat.com/video/video/embed/videohash/ZP0dO/vt/frame

اما خب هیچکس از PHP برای ساختن تصویر سه بعدی استفاده نمی‌کند. دلیل اینکه این کد خیلی سریع‌تر اجرا شد این بود که این کد به کد ماشین یا کد سطح پایین کامپایل شده است و مستقیما توسط CPU اجرا شده است که نشان می‌دهد دیگر نیازی به مترجم یا Interpreter وجود ندارد.

کامپایل JIT را برای چه می‌خواهیم؟

بعد از PHP 7 کارایی PHP بیشتر از هر زمانی نگران کننده شده است، باید از HHVM فیسبوک که مخفف عبارت HipHop Virtual Machine که در حال استفاده از کامپایلر JIT است،

باید از OpCache، ساختمان داده یا Data Structures و هر چیزی که باعث شدند، PHP کم کم بهینه‌تر شود و به بالاترین کارایی برسد تشکر کرد.

علاوه بر آن PHP برای زبان سمت سرور یک گزینه کاملا مناسب در نظر گرفته شده است. PHP دیگر مثل گذشته کند نیست، زمانش رسیده است که به توانایی‌های PHP اضافه کنیم مثل تحلیل و بررسی داده‌ها (Data analysis)، رندر (Render) کردن عکس‌های سه بعدی (3D) و دو بعدی (2D).

در گذشته کدهایی با کارایی بالا توسط زبان‌های برنامه‌نویسی C و ++C به جای پیکیج (Package) زبان PHP نوشته می‌شد. برای مثال phpredis همیشه 6 - 7 برابر از predis سریع‌تر است، اگر کد PHP به جای ترجمه شدن کامپایل بشود ما پکیج‌های PHP را خواهیم داشت که همان سرعت و کارایی را دارند که با زبان‌های برنامه‌نویسی مانند C و ++C نوشته شده‌اند.

بنابراین کامپایلر JIT انتخاب شد چون جالب‌ترین و بهترین جهت یا مسیر است.

امنیت در JIT

کامپایل JIT کد عملیاتی (OpCode) را به کد ماشین کامپایل می‌کند و آن‌ها را اجرا می‌کند اما دلایل مشکلات امنیتی این است که حافظه (Memory) یا باید قابل نوشتن (Writable) باشد یا قابل اجرا (Executable) شدن که به اصطلاح آن‌ها را با علامت‌های W^X نشان می‌دهند.

زمانی که PHP شروع به اجرا شدن می‌کند، سپری که مانع نوشتن یا Writable در JIT است را می‌توان با استفاده از ()mprotect غیر فعال کرد، به این معناست که JIT شروع به کامپایل کردن کد می‎کند و آن را درون حافظه (Memory) می‌نویسد این سپر  برای جلوگیری از بهره‌برداری‌های احتمالی از آن در حین اجرا محافظت می‌کند تا غیر قابل نوشتن باشد.

جمع بندی:

در PHP 8 شاهد تغییرات جدیدی خواهیم بود که PHP را در لیست زبان‎‌هایی که ارزش یادگیری و استفاده دارند نگه می‌دارد و باعث می‌شود که محبوبیت بیشتری بین توسعه دهندگان پیدا کند. شاید یکی از تغییراتی بسیار خوب PHP همان کامپایلر JIT باشد که باعث می‌شود PHP سریع‌تر باشد تا بتواند پا به حوضه‌های دیگر نیز باز کند همه‌ی توسعه دهنگان بی‌صبرانه منتظر نسخه جدید PHP هستند.

منبع:
https://7learn.com/programming/php/jit-compiler-in-php

phpphp 8برنامه نویسیطراحی وبjit
دانشمندان چیزی را که قبلا وجود داشته کشف میکنند اما برنامه نویسان چیزی که قبلا وجود نداشته را خلق میکنند.
شاید از این پست‌ها خوشتان بیاید