جشنواره فطر سون لرن

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

دسته بندی: برنامه نویسی
زمان مطالعه: 6 دقیقه
۲۷ اردیبهشت ۱۳۹۹

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

فهرست محتوای این مقاله

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) را ترجمه کند. در زیر شما یک تصویر را برای درک بیشتر مشاهده می‌کند.

مراحل اجرای کد در PHP

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

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

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

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

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

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

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

JIT در PHP

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 هستند. اگر نظری در رابطه به این موضوع دارید خوشحال می‌شویم که با ما و سایر کاربران وب سایت سون لرن به اشتراک بگذارید.

اگر به یادگیری بیشتر در زمینه‌ی PHP علاقه داری، با شرکت در دوره‌ی آموزشی متخصص PHP در کمتر از یکسال به یک متخصص PHP تبدیل می‌شوی که آماده‌ی استخدام، دریافت پروژه، کسب درآمد و یادگیری مباحثی مثل لاراول هستی.

چه امتیازی به این مقاله می دید؟
نویسنده امیر صالحی
عاشق دنیای برنامه نویسی و چالش های بزرگش

نظرات کاربران

اولین دیدگاه این پست رو تو بنویس !

ارسال دیدگاه
خوشحال میشیم دیدگاه و یا تجربیات خودتون رو با ما در میون بذارید :