[Bangla] JIT in PHP

JIT in PHP

PHP নামটি প্রথম শুনি ২০০৯ সালে, আর প্রথম পিএইচপি কোড লিখি ২০১০ সালে। সেই শুরুতেই একটি হোচট খাই যখন শুনি “PHP is a dying language”। মনের ভিতর কেমন একটা খা খা করে উঠে। তারপরেও সবার কথা উপেক্ষা করে শুরু করি পিএইচপি শেখা। কর্মজীবন শুরু করি পিএইচপি দিয়েই (যদিও কর্মস্থলে অন্যান্য ভাষা নিয়েও কাজের সুযোগ হয়েছে)। কিন্তু যখনই শুনতাম পিএইচপি এর জুগ শেষ তখনই পিএইচপি’র গভীরে যাওয়ার চেষ্টা করেছি। আর গভীরে গিয়ে খারাপ খুজতে গিয়ে জেনেছি অনেক কিছু, খুজে পেয়েছি পিএইচপির আসল সৌন্দর্য্য। তাই সেই ভালো লাগা থেকেই সবসময় নজর রাখতাম পিএইচপি’র সকল আপডেটগুলোতে, খুজতে চেষ্টা করেছি মানুষজন কেন এটিকে খারাপ বলে, আদৌকি পিএইচপি কোর টিম এর সমাধান করবে? এর মাঝে পিএইচপির আপডেট অনেকদিন বন্ধ থাকায় খুব হাতাশ লাগছিলো। তখনই গুঞ্জন শুরু হয় PHP7 নিয়ে। রিলিজ হয় PHP7, অভাবনিয় পরিবর্তন ও নতুন সংযোজন আসে এই ভার্সনে। ঠিক তখনই জানতে পারি PHP Core Contributor দের PHP8 নিয়ে পরিকল্পনা, প্রায় ২ বছর ধরে প্রায় প্রতি সপ্তাহেই আমি এর আপডেট নেই। জানি নতুন কি কি আসছে এই ভার্সনে। খুবই এক্সাইটেড আমি এই ভার্সন নিয়ে। এটিই হয়তো হতে যাচ্ছে পিএইচপি যুগের সবথেকে সেরা সংস্করন। তো চলুন আজকে জেনে নেই এই ভার্সনটির সবথেকে এক্সাইটেড ফিচারটি। বলে নেয়া ভালো আমার লেখায় অনেক ভুল ত্রুটি থাকতে পারে, সেটি ক্ষমা সুন্দর দৃষ্টিতে দেখে ধরিয়ে দিতে সহায়তা করবেন আশা করি।

পিএইচপি ৫.৫ এর পরে বেশ অনেক দিন এর আপডেট বন্ধ ছিলো। অবশ্য এই ভার্সনটিই পিএইচপিকে আধুনিকতার ছোয়া দিয়েছে। অবজেক্ট অরিয়েন্টেড প্রোগ্রামিং এর পূর্নাঙ্গ স্বাদ এই সংস্করনেই মানুষজন পেয়েছে। এর দীর্ঘদিন পরে আসে ৫.৬, এই ভার্সনেও বেশ পরিবর্তন আসে তবে এটি ছিলো ৫.৫ এর আদলেই। এর পরেই বিশাল পরিবর্তন নিয়ে রিলিজ হয় পিএইচপি ৭.০। এই ভার্সনটিতে পিএইচপি এর আমূল পরিবর্তন আসে। এর ভিতরে সবথেকে বড় যে পরিবর্তনটি আসে সেটি হলো স্ট্রিক্টলি টাইপড ফিচার (অর্থাৎ মেথড আর্গুমেন্ট ও রিটার্নে এর টাইপ বলে দেয়া যাবে)। এটিই পিএইচপি যুগের সব থেকে হাই পারফর্মড ভার্সন, যা বিগতদিনের ভার্সনগুলোর তুলনা ৩ অথবা তার অধিক ফাস্টার। এই ভার্সনটিতে পিএইচপির অধিকাংশ কোর ফিচারগুলোকে রিরাইট করা হয়েছে। ফলে পিএইচপি আবারও প্রান ফিরে পায় এবং নতুন উদ্যমে এগোতে শুরু করে। এখন চলছে PHP 7.4 ভার্সন, এটিকে মূলত বলা হয় PHP8 এর প্রস্তুতিমূলক একটি সংস্করন। আর আজকে আমরা এই পিএইচপি ৮ নিয়েই জানবো।

PHP 8

পিএইচপি ৮, সম্ভাব্য রিলিজের সময় এবছরের(২০২১) শেষের নাগাদ। এই ভার্সনটিতে পিএইচপির আমূল কিছু পরিবর্তন আসবে। বিগতদিনের অনেক ডিপ্রিকেটেড ফিচার এই ভার্সনটিতে রিমুভ করা হবে। যুক্ত হবে অনেক মডার্ন ফিচার। আর এই মডার্ন ফিচারগুলোর মধ্যে সবথেকে এক্সাইটেড ফিচার হচ্ছে JIT(Just In Time) কম্পাইলার।

JIT কি জিনিস?

সাধারনত পিএইচপি ইন্টারপ্রেটার রানটাইমে পিএইচপি কোডকে পার্স করে OPCodes এ রূপান্তর করে, এটি খুবই লো লেভেলের এবং এই কোডটি Zend VM দ্বারা ইন্টারপ্রেট হয়। আর এই কাজটি পিএইচপি প্রত্যেক রিকুয়েস্টেই করে থাকে। কিন্তু JIT রানটাইমেই ইন্টারপ্রেটের পরিবর্তে OPCodes কোড থেকে কম্পাইল করে মেশিন কোডে রুপান্তর করে ফেলবে। এটি Java JVM অথবা .Net এর CLR এর মতো। এটি এমন একটি টেকনিক যেটি কোডের কোনো একটি অংশকে কম্পাইল করে ফেলতে পারবে এবং পরবর্তিতে সেই কোডের পরিবর্তে কম্পাইলড অংশকে ব্যবহার করতে পারবে।

JIT কেন?

Dmitry Stogov ও Zeev Suraski এর মতে পিএইচপি ইতিমধ্যেই অপটিমাইজেশনের দক্ষতার দিক থেকে এর শেষ সিমানায় পৌছে গেছে। সোর্স: https://wiki.php.net/rfc/jit

First, we believe we’ve reached the extent of our ability to improve PHP’s performance using other optimization strategies. In other words – we can’t further improve the performance of PHP unless we use JIT

তাই JIT ব্যতিত পিএইচপিকে উন্নত করা প্রায় অসম্ভব।

JIT আসলে কি ওয়েবসাইট আরও ফাস্টার হবে?

সম্ভবত না, কিছু ক্ষেত্রে আগের থেকে একটু স্লোয়ারও হতে পারে। যদিও JIT এর উদ্দেশ্য ওয়েবসাইট ফাস্টার করা নয়। বরং এর উদ্দেশ্য লং রান, সিপিইউ ইন্টেনসিভ সিনারিওতে কাজ করা যা বর্তমানের তথাকথিত পিএইচপিতে সম্ভব নয়। নিচের ডেমোটি দেখতে পারেন:

তাহলে এই JIT দিয়ে আমরা কি করিবো?

আমরা কি এমন একটি JIT চেয়েছিলাম? হ্যা, এটি একটি ভালো প্রশ্ন যে তাহলে এই JIT দিয়ে কি হবে? মূলত প্রথমত পিএইচপি ডিজাইন করা হয়েছিল ওয়েবসাইট ডেভলপমেন্টের জন্য, কিন্তু আধুনিক চাহিদা পূর্ন করার জন্য পিএইচপিকে এই ফিলোসফি থেকে বেরিয়ে আসতে হবে। টিপিক্যাল ওয়েবসাইট ডেভলপমেন্টে এখন আর পিএইচপি আটকে নেই। তারই ধারাবাহিকতায় JIT এসেছে। JIT আসলে পিএইচপির অনেকগুলে নতুন দ্বার উন্মোচন হবে, যেমন:

  • মাইক্রোসার্ভিস ডেভলপমেন্ট
  • মেশিন লার্নিং
  • লং রানিং জব প্রোসেসিং
  • 3D/2D ইমেজ প্রোসেসিং,
  • সিপিইউ ইন্টেনসিভ প্রোগ্রাম
  • এসিনক্রোনাস প্রোগ্রাম
  • সবথেকে মজার ব্যপার এটি ইমপ্লিমেন্ট হলে পিএইচপি দিয়েই পিএইচপি’র বিল্ট-ইন লাইব্রেরী লেখা যাবে।

বর্তমানে পিএইচপি দিয়ে এগুলো ইফিসিয়েন্ট ওয়েতে সম্ভব নয়, এগুলো সম্ভব হবে যদি JIT ইমপ্লিমেন্ট হয়।

পিএইচপি ৭.৪ ভার্সনেই মূলত অপশনাল হিসেবে JIT আসার কথা ছিলো। কিন্তু বেশিরভাগ কন্ট্রিবিউটরদের ভোটে সেটি ভার্সন ৮ এ চলে গেছে। এর একটি কারন ছিলো JIT কম্পাইলারের কমপ্লেক্স ডিজাইন, তার থেকেও বড় বিষয় JIT সম্পর্কে খুব বেশি মানুষেস ধারনা না থাকা। পিএইচপি কোর টিমে খুব কম লোকই JIT নিয়ে বিস্তর জানেন। এদের ভিতর JIT এর পূর্নাঙ্গ জ্ঞান আছে শুধু Dmitry Stogov এর, যিনি এই প্রোজেক্টটি লিড দিচ্ছেন। যেহেতু সবাই এটি ডেভলপ করতে করতে শিখছেন, তাই ভার্সন ৭ এ এটিকে রিলিজ দেয়া হয়নি যাতে কোনো মেজর ইস্যু আসলে তাৎক্ষনিক সমাধান পিছিয়ে না যায়।

পিএইচপি JIT ডেভলপের জন্য DynASM ব্যবহার করা হয়েছে, যেটি মূলত Lua এর জন্য ডেভলপ করা হয়। এটি অনেক লাইটওয়েট ও অপটিমাইজড। বর্তমানে পিএইচপি POSIX প্লাটফর্মে x86 ও x86_64 এবং Windows প্লাটফর্ম সাপোর্ট করে। এছাড়াও DynASM ARM, ARM64, MIPS, MIPS64 and PP সাপোর্ট করে, তাই থিওরিটিক্যালি পিএইচপিকে এখন জনপ্রিয় সব প্লাটফর্মে সাপোর্ট করানো সম্ভব।
JIT কে OPCache এর পুরো সতন্ত্র অংশ হিসেবে ডেভলপ করা হচ্ছে, যা পিএইচপি কম্পাইল টাইম ও রান টাইমে এনাবল বা ডিজাবল করা যাবে।

এই প্রোজেক্টির সোর্স এবং ডেভলপমেন্ট আপডেট এখন https://github.com/zendtech/php-src/tree/jit-dynasm/ext/opcache/jit লিংকে পাবেন। পিএইচপি ৮ রিলিজের সময় এটিকে মূল রিপোজিটরির সাথে মার্জ করা হবে।

আশা করি পিএইচপি ৮ এর নতুন এই ফিচার ও JIT পিএইচপিকে নতুন যুগে নিয়ে যাবে, নতুন পিএইচপিকে বুঝে ওঠার জন্য এখন থেকেই আপ টু ডেট থাকুন, ধন্যবাদ 🙂

References