افزایش سرعت PHP با HPHPc و HHVM

افزایش سرعت PHP

PHP-Code-Snippets-708x400

فیس بوک وقتی که متوجه شد زبان Interpreter (مفسری) PHP برای سایت غول پیکری مثل فیسبوک کند شده است.آنها به جای اینکه هزینه ی زیادی برای خرید سرورهای بیشتر متحمل بشن.از یک مبدل به اسم hip hop استفاده کردند.این مبدل در واقع یک Trans-compiler یا به اختصار Transpiler بود.Hip Hop Trans-compiler یک source-to-source compiler است که به آن HPHPc هم میگویند. HPHPc کد مبدا php را به کد مقصد ++c تبدیل میکند.و کد ++c هم توسط کامپایلر ++g به کد باینری تبدیل میشود و با سرعت خیلی بیشتری اجرا میشود. فیس بوک ادعا میکند با استفاده از HPHPc سرعت سایت اش ۶ برابر افزایش پیدا کرده.و با افزایش سرعت اجرایی سایت، هزینه های خرید سرور بسیار کاهش پیدا کرده و بار پردازنده های این شرکت سبک تر شد.فیس بوک HPHPc را در سال 2010 تحت لایسنس PHP منتشر کرد.(لایسنس PHP هم متن باز هستش ولی copy-left نیست و شبیه BSD License هستش).
شرکت فیس بوک در سال ۲۰۱۳ به جای مبدل hip hop از ماشین مجازی Hip Hop Virtual machine استفاده کرد. این ماشین مجازی در واقع یک just-in-time کامپایلر است.JIT در فارسی کامپایل درجا ترجمه شده.و به کامپایل پویا(Dynamic Compile ) هم معروف است.در واقع JIT و Dynamic Compile و Virtual machine همگی یک مفهوم را دارند.


زبان جاوا خروجی ماشین کد(Machine code)نمیدهد.و خروجی زبان جاوا بایت کد(Byte code) هستش.و این بایت کد یک زبان میانی(Intermediate language) است که توسط ماشین مجازی جاوا به صورت JIT تبدیل به ماشین کد میشود.
مایکروسافت هم به تقلید از جاوا هنگام کامپایل کد سی شارپ خروجی ماشین کد نمیدهد و خروجی کامپایل سی شارپ (MSIL=Microsoft Intermediate Language) هستش.و بعد توسط Common Language Runtime به ماشین کد تبدیل میشود و اجرا میشود.
CLR مایکروسافت مانند JVM جاواست.و MSIL مایکروسافت همان Byte Code جاواست.
Hip Hop Virtual machine فیس بوک هم عملکردی شبیه به JVM و یا CLR دارد. HipHop bytecode هم همان کد میانی فیسوک است.
اما مایکروسافتی که سیاست انحصاری دارد و نمیخواهد Cross-platform‌باشد چرا از زبان میانی و JIT کامپایل استفاده کرده!؟ شاید سیاست این شرکت استفاده از زبان سی شارپ برای کد نویسی دسکتاپ و موبایل است(Cross platform).هرچند مایکروسافت در سیستم عامل های موبایل موفق نبود ولی حالا شانس خود را با ویندوز فون و Windows 8 RT بر روی معماری ARM میخواهد امتحان کند و بازار موبایل را هم در چنگ بگیرد!

اما از بحث اصلی دور نشویم.سوالاتی که در ذهن من شکل گرفت این ها هستند :
1. تفاوت کامپایل استاتیک(Static Compile) و مفسر (Interpreter ) و ماشین مجازی (Virtual Machine) چیست؟
2. چرا فیس بوک Hip Hop Trans-Compiler را رها کرد و به سمت Hip Hop Virtual machine رفت؟
3. hip hop virtual machine نسبت به JVM و CLR چه مزیتی دارد؟
4. ماشین مجازی HIP HOP فیس بوک چه مزیتی به HPHPc و مفسر PHP دارد؟
5. ماشین مجازی HIP HOP قرار است با PHP کار کند یا با زبان جدید HACK که توسط خود Facebook ساخته شده؟ سرنوشت PHP مفسری که ماشین مجازی ندارد چه میشود؟
6. زبان Hack فیس بوک و ماشین مجازی آن توسط چه فریم ورکی به کار گیری میشود؟و آیا Facebook بعد از انتشار و گسترش زبان Hack به زبان PHP وفادار خواهد ماند یا به زبان Hack کوچ میکند؟

پاسخ سوالات (ممکن است جواب های من اشتباه باشد.اگر اشتباهی دارم لطفا گوشزد کنید)
۱-تفاوت کامپایل استاتیک و مفسر (Interpreter ) و (Virtual Machine) چیست؟
کامپایل استاتیک : در کامپایلرهای خیلی قدیمی کامپایلر Source Code شما را میخواند و آن را به کدهای اسمبلی تبدیل میکرد و کدهای اسمبلی را در یک فایل بر روی دیسک ذخیره میکرد.بعد اسمبلر(Assembler) فایل را میخواند و از روی کدهای اسمبلی کدهای ماشین(کده های باینری) را تولید میکرد.ولی کامپایلرهای امروزی کد اسمبلی را در حافظه اصلی به صورت موقت نگه میدارند و خودشان کار اسمبلر را هم انجام میدهند و کدهای اسمبلی درون حافظه را میخوانند و مستقیم به کد باینری(ماشین کد اجرایی) تبدیل میکنند.به همین خاطر گاهی گفته میشود که کامپایلر ++c کدهای شما را ابتدا به کد اسمبلی تبدیل میکند و بعد آن را اسمبلر به کد اجرایی (باینری) تبدیل میکند.و گاهی نیز حرفی از اسمبلر زده نمیشود و میگویند در زبان ++c کامپایلر بعد از کامپایل ماشین کد اجرایی تولید میکند.( کد اسمبلی بسیار به کد ماشین نزدیک است و اسمبلی در واقع همان کد ماشین است که Notation آن متفاوت است و تبدیل از کد اسمبلی به کد ماشین اصلا دشوار نیست چون فقط یک نگاشت از mnemonic به صفر و یک است . و اسمبلر هیچ گاه پیچیدگی کامپایلر را ندارد. پس در زمان اجرا چندان تاثییرگذار نیست و به همین خاطر اغلب صحبتی از آن نیست! )
مفسر در واقع هیچ کامپایلی رو انجام نمیده.و خطوط برنامه توسط مفسر خط به خط خوانده میشود و تفسیر میشود و بعد اجرا میشود.
Virtual Machine دو مرحله کامپایل دارد.در کامپایل مرحله اول کدهای سطح بالای شما که به زبان انسان نزدیک است(human readable source code) را به کدهای سطح میانی(IL) که به زبان ماشین نزدیک است ولی زبان ماشین(صفر و یک) نیست تبدیل میکند.(machine-readable byte code). در کامپایل مرحله دوم هم کدهای میانی(بایت کد) توسط ماشین مجازی طی فرآیند Just-in-time Compile به کدهای ماشین(صفر و یک) تبدیل میشود.و روی ماشین اجرا میشود.
مقایسه این ۳ شیوه از نظر سرعت و کارایی ( Performance ) :
بدیهی است که Static Compile (مثل کامپایلر زبان سی) که ماشین کد تولید میکند خیلی سریع تر و بهینه تر است.اما مشکل Static Compile این است: «ماشین کدی که کامپایلر استاتیک تولید میکند وابسته به ماشین(Machine or Architecture Dependency) است.به همین خاطر سورس کدی که به ماشین کد تبدیل شده فقط بر روی ماشین مقصد کار میکند.برای مثال کد ماشینی که از زبان سی کامپایل شده و به صورت exe است فقط بر روی معماری intel/x86 کار میکند.و اگر همین ماشین کد بر روی معماری arm قرار بگیرد پردازنده توانایی اجرای ماشین کد معماری Intel/X86 را ندارد.»
ولی زبان های مفسری که اغلب Dynamic Typing هستند(مثل php,python,perl) این مشکل رو ندارند.چون سورس کد شما اصلا کامپایل نمیشه.و سورس کد شما توسط مفسری که بر روی ماشین مقصد قرار داره خط به خط خوانده میشود و تفسیر میشود و اجرا میشود.(منظور از تفسیر این است که خط به خط کد شما به آپ -کد اسمبلی ماشین مقصد تفسیر میشود و بعد op-code اسمبلی آن ماشین توسط اسمبلر ترجمه میشود ).در این جا مشکل انتقال برنامه از یک ماشین به ماشین دیگر کم رنگ تر شده.کافی است برای هر معماری ما یک مفسر مخصوص به آن معماری بنویسیم.و به این ترتیب کد منبع بر روی هر ماشینی که مفسر ما بر روی آن قرار گرفته اجرا میشود.اما مشکل این روش کندی آن است.در مفسرها هر بار که برنامه اجرا میشود مفسر خط به خط سورس کد را میخواند (مثلا سورس کد PHP) را میخواند و آن را به آپ کد اسمبلی assembly opcode تفسیر میکند.و بعد op-code ها توسط اسمبلر(Assembler) به ماشین کد تبدیل میشود و بعد توسط پردازنده اجرا میشود.پس بدیهی است که مفسرها هیچ وقت کارایی کامپایلرهای استاتیک ر ا ندارند.به همین خاطر فیسبوک Hip Hop Trans-compiler را ساخت تا کدهای PHP را به کدهای ++c تبدیل کند.
ماشین مجازی از نظر سرعت و کارایی نه به اندازه ی مفسرها کند است.و نه به اندازه کامپایلرهای استاتیک سریع است.اگر چه ماشین مجازی سرعت کامپایلرهای استاتیک را ندارد.ولی در عوض مستقل از ماشین(Machine In-dependency) است.مثل بایت کدهای جاوا که به کمک JVM های مختلف بر روی موبایل و کامپیوتر(لینوکس و ویندوز و مک) و پردازنده های توکار (Embedded Processors) اجرا میشود.
علت اینکه ماشین مجازی(Just-in-time Compile ) سریعتر از مفسر(Interpreter) است چیست؟
علت این است که کامپایل کردن از بایت کد به ماشین کد خیلی سریعتر از تفسیر کردن سورس کد به ماشین کد است.چون سورس کد به زبان انسان نزدیک است و از زبان ماشین دور است.ولی بایت کد به زبان ماشین نزدیک است.
بدیهی است که مفسرها باید خط به خط کد شما را توسط Token بخوانند و بعد آن را تجزیه(Parse) کنند و بعد آن چند مرحله تحلیل را انجام بدهند.(Lexical and Syntax and Semantic Analyzer) و بعد تولید کد و بعد بهینه سازی کد اسمبلی و بعد تولید ماشین کد مسیر پیچیده تر و طولانی تری است و به همین دلیل مفسرها کند تر از Virtual machine هستند.شاید دلایل دیگری هم وجود دارد که من آنها را نمیدانم!

۲- چرا فیس بوک Hip Hop Trans-Compiler را رها کرد و به سمت Hip Hop Virtual machine رفت؟
دقیقا جواب این سوال را نمیدانم.ولی فکر میکنم کار کردن با ماشین مجازی و توسعه ماشین مجازی هم برای فیس بوک راحت تر است و هم برای برنامه نویسی که میخواهند از این ماشین مجازی استفاده کند.همچنین با ماشین مجازی میتوان هم کدهای PHP را سریعتر اجرا کرد و هم کدهای زبان Hack را.چون ماشین مجازی هر دو زبان را میتواند به HipHop Byte code‌ تبدیل کند و بعد آن را به صورت JIT بر روی هر ماشینی اجرا کند.

۳- hip hop virtual machine نسبت به JVM و CLR چه مزیتی دارد؟
در مورد سرعت و کارایی ماشین مجازی های Hip Hop و Java و CLR نمیتوانم حرفی بزنم! چون آنها را مقایسه نکرده ام!

4-ماشین مجازی HIP HOP فیس بوک چه مزیتی به HPHPc و مفسر PHP دارد؟
مهندسین فیسبوک ادعا میکنند که سرعت HHVM دو برابر سرعت HPHPc است!!!(من متعجبم از این ادعای فیسبوک.چون بر روی کاغذ ماشین کدهایی که توسط HPHPc تولید میشود سریعتر از بایت کدهای HHVM است.چون ماشین کد صفر و یک است و مستقیم بر روی پردازنده Execute میشود.ولی بایت کد باید باز هم به صورت درجا کامپایل شود!)
همچنین Facebook ادعا میکندHHVM نه برابر سریع تر از PHP است.اما آنها معتقدند زمانی سرعت سایت PHP‌ شما ۹ برابر میشود که اندازه سایت شما خیلی بزرگ باشد.و برای سایت هایی با اندازه استاندارد(Standard size web sites) حداکثر افزایش سرعت ۵ برابر است.

۵-ماشین مجازی HIP HOP قرار است با PHP کار کند یا با زبان جدید HACK که توسط خود Facebook ساخته شده؟ سرنوشت PHP مفسری که ماشین مجازی ندارد چه میشود؟
فیسبوک کدهای ماشین مجازی HHVM را در GitHub به صورت متن باز قرار داده تا کسانی که دوست دارند سرعت وب سایت PHP خود را افزایش دهند از آن استفاده کنند و یا آن را بهبود ببخشند. ماشین مجازی HHVM توانایی اجرای کدهای Hack و PHP‌را دارد.و ۹۹ درصد کدهای PHP توسط HHVM پشتیبانی میشود.و تیم توسعه دهنده HHVM قصد دارد که در آینده از ۱۰۰ درصد کدهای PHP پشتیبانی کند.

۶-زبان Hack فیس بوک و ماشین مجازی آن توسط چه فریم ورکی به کار گیری میشود؟و آیا Facebook بعد از انتشار و گسترش زبان Hack به زبان PHP وفادار خواهد ماند یا به زبان Hack کوچ میکند؟
نمیدونم چه فریمورکی از زبان جدید Hack پشتیبانی میکنه! زبان Hack‌ زبان جدیدی است و فکر میکنم هنوز فریم ورکی از آن پشتیبانی نمیکند!(اگر شما با فریم ورکی آشنا هستید که این زبان را پشتیبانی میکند یا قصد دارد در آینده این زبان را پشتیبانی کند آن را بیان کنید.) زبان Hack از زبان PHP مشتق شده و سینتکس آن بسیار به PHP شبیه است و تفاوت آن با PHP این است که فقط چندین ویژگی جدید به آن اضافه شده تا کد با کیفیت تری بنویسید.حتی شما میتونید کدهای Hack را به صورت ترکیبی با کدهای PHP بنویسید.در سورس کد شما هر جا که کد PHP نوشتید باید آن را با php?> شروع کنید.و هر قسمت از کد شما که کد Hack است میتوانید آن را با hh?> شروع کنید.به این ترتیب کوچ کردن از PHP‌ به Hack خیلی راحت تر میشود.تیم توسعه فیسبوک معتقد است که آنها برای طراحی زبان Hack به صورت ترکیبی از مطالعات رسمی و آکادمیک و از تجربیات تجاری و صنعتی خود استفاده کرده اند.و پروژه توسعه Hack هم به صورت Open Source هستش.
یکی از معایب زبان PHP تعریف متغیرها به صورت ضمنی(Implicit) است.PHP سنتی به دلیل dynamically typed بودن کار برنامه نویس را راحت میکند و متغیرهای آن بسیار منعطف است و یک متغیر میتواند هر مقداری را در خود نگه دارد.ولی این ویژگی اگرچه باعث سادگی و راحتی استفاده از متغیرها شده است ولی تعریف ضمنی متغیرها باعث خطاهای زمان اجرا میشود. در زبان های C و Java تعریف متغیر فقط به صورت صریح(Explicit) است. یعنی شما حتما باید تعیین کنید متغیر integer است یا decimal و یا boolean است !؟ این ویژگی احتمال خطاهای زمان اجرا را کم تر میکند.
در زبان Hack شما میتوانید متغیرها را implicit و explicit تعریف کنید.یعنی هم مثل زبان جاوا میتوانید نوع متغیر را explicit تعریف کنید و خیالتان راحت باشد که خطایی به خاطر نوع آن متغیر رخ نمیدهد. و هم میتوانید مثل زبان PHP متغیر را implicit (بدون نوع) تعریف کنید.زبان Hack یک زبان gradual typing است چون که هم dynamic typing است و هم static typing است.همچنین در این زبان نوع داده ای به اسم Collection اضافه شده که در واقع همان آرایه است که عناصر آن دارای نوع از پیش تعریف شده هستند.
یکی دیگر از ویژگی های خوب زبان Hack برنامه نویسی ناهمگام (Asynchronous Programming) است.PHP سنتی Synchronous programming (برنامه نویسی همگام) آن کارایی را کاهش میدهد و زمان را تلف میکند.چون در PHP نمیتوانید همزمان چند I/O tasks را به صورت پارالل اجرا کنید.و باید منتظر بمانید تا Task‌ اول اجرایش تمام شود تا Task‌ دوم را بتوانید اجرا کنید.(به اسکریپتی فکر کنید که میخواهد از چندین سایت اطلاعاتی را بخواند و جمع آوری کند). در زبان Hack به کمک کلمات کلید await and async keywords میتوانید کدهایی را بنویسید که قابلیت اجرای پارالل دارند. همچنین از دیگر قابلیت های زبان Hack کلاس ها Generics هستند.

اما زبان Hack زبان PHP‌ را از بین میبرد؟ به نظر من زبان PHP‌در خطر است.چون که حتی در نسخه ۷ هم شاید نتواند به دستاوردهای زبان Hack‌برسد.و برای خودش ماشین مجازی داشته باشد.
زبان جدید سمت سرور node.js هم ماشین مجازی ندارد و از ماشین مجازی جاوا استفاده میکند.ماشین مجازی جاوا توانایی اجرای زبان های غیر جاوای زیادی رو داره(مثل زبان جاوا اسکریپت.برای مثال Nodyn که به کمک آن میتوانید کدهای جاوا اسکریپت فریمورک node.js را روی ماشین مجازی جاوا یا JVM اجرا کنید) و شاید PHP‌هم برای باقی عمرش وابسته به HHVM زبان Hack‌باشه !
البته زبان Hack و ماشین مجازی HHVM‌ راه طولانی رو در پیش داره و هنوز در محیط ویندوز هم ماشین مجازی نداره و فقط نسخه لینوکسی داره.در صورتی که برخی از برنامه نویس های PHP‌در ویندوز از فریم ورک های ویندوزی و XAMP استفاده میکنند.

نویسنده مطلب
علی پامناری

دیدگاه کاربران

این وب سایت متعلق است به آذین وب (طراحی سایت در اصفهان) و تمامی حقوق آن محفوظ است.

طـبق ماده 12 فصل سوم قانون جرائم رایانه ای هرگونه کپی برداری از قالب پیگرد قانونی دارد.