2.2 জাস্ট ইন টাইম(JIT) কম্পাইলার

 

আমরা প্রোগ্রামাররা যে যার প্রয়োজন অনুযায়ী বিভিন্ন ধরনের প্রোগ্রামিং ভাষা ব্যবহার করে থাকি। যে ভাষাই ব্যবহার করিনা কেন, সেটি কিন্তু কম্পিউটারের কাছে বোধগম্য নয়। অর্থাৎ প্রোগ্রামারদের এবং কম্পিউটারের কথা বলার ভাষা সম্পূর্ণ আলাদা এবং এরা কেউ কারো ভাষা বোঝেনা! বাস্তব জীবনে এই সমস্যার সমাধান আমরা কিভাবে করি? খুবই সহজ, আমরা একজন দোভাষীকে ডেকে নিয়ে আসি যে একজনের কথা আরেকজন কে অনুবাদ করে দেয়। প্রোগ্রামিং এর জগতেও ব্যাপারটা ঠিক এভাবেই কাজ করে। প্রোগ্রামিং ল্যংগুয়েজগুলোকে মেশিন ল্যাংগুয়েজে রুপান্তর করার জন্য আমাদের প্রধানত দুই ধরনের দোভাষী প্রোগ্রাম আছে। একটি হলো কম্পাইলার এবং অপরটি ইন্টারপ্রেটার। দুইটির কাজ কিন্তু একই, হাই লেভেল ল্যাংগুয়েজকে মেশিন কোডে রুপান্তর করা। তাহলে এই দুটির পার্থক্য কি? জাস্ট ইন টাইম কম্পাইলেশন বুঝতে হলে এদের পার্থক্য এবং সুবিধা অসুবিধাগুলো জানা আমাদের জন্য খুব দরকারি।

ইন্টারপ্রেটারঃ

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

কম্পাইলারঃ

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

ইন্টারপ্রেটার ও কম্পাইলার দুটোর সুবিধা অসুবিধাই আমরা জানলাম। এখন আপনাদের কাছে আমার একটি প্রশ্ন – কোনটা বেশি ভালো? ইন্টারপ্রেটার নাকি কম্পাইলার? এই প্রশ্নের উত্তর আসলে এত সহজে দেয়া সম্ভব না। কারণ দুটির ব্যবহার ও সুযোগ সুবিধা ভিন্ন। সবচেয়ে ভালো হতো যদি আমরা কম্পাইলার এবং ইন্টারপ্রেটার এই দুইটিরই ভালো দিকগুলো একসাথে পেতাম। এই চিন্তা থেকেই ‘জাস্ট ইন টাইম (JIT)’ এর আবির্ভাব। 

JIT কম্পাইলার এর ‘জাস্ট ইন টাইম’ পার্টটা দিয়ে আসলে ইন্টারপ্রেটার বোঝায়। অর্থাৎ জাস্ট ইন টাইম কম্পাইলেশন একইসাথে ইন্টারপ্রেটার এবং কম্পাইলারের কাজ করে। জাভাস্ক্রিপ্টকে আমরা সবাই একটি ইন্টারপ্রেটার ল্যংগুয়েজ হিসেবেই চিনি। জাভাস্ক্রিপ্ট ইঞ্জিনের শুরুর দিকে শুধুমাত্র ইন্টারপ্রেটার ব্যবহৃত হলেও এখন কিন্তু জাভাস্ক্রিপ্ট ইঞ্জিনও JIT ব্যবহার করে। JIT বোঝার জন্য আজকের এই লেখায় আমরা জাভাস্ক্রিপ্ট ইঞ্জিনের প্রেক্ষাপটে JIT কিভাবে কাজ করছে সেটি নিয়ে আলোচনা করবো। 

মনিটর / প্রোফাইলারঃ

জাভাস্ক্রিপ্ট কোড ইঞ্জিনের ভেতর প্রথমে একটি ইন্টারপ্রেটারের ভেতর দিয়ে যায়। ইন্টারপ্রেটার যখন লাইন ধরে ধরে কোড এক্সিকিউট করতে থাকে, প্রোফাইলার তখন কোন স্টেটমেন্ট কতবার করে রান হচ্ছে এটা হিসাব করে রাখে। কোডের একই অংশ যদি একাধিকবার এক্সিকিউট হয় প্রোফাইলার তখন এটিকে ‘ওয়ার্ম (Warm)’ হিসেবে শনাক্ত করে। এই সংখ্যাটি আরো বাড়তে থাকলে এক সময় এটিকে ‘হট কোড’ বলা হয়। অর্থাৎ আমাদের প্রোগ্রামের যে অংশগুলো সবচেয়ে বেশি সংখ্যকবার রান করছে মনিটর/প্রোফাইলার সেগুলোকে বের করে আনে। 

বেইজলাইন কম্পাইলারঃ

এখানে কোডের ওয়ার্ম সেকশনগুলোকে বাইটকোডে রুপান্তর করা হয়। এই বাইটকোড পরবর্তীতে একটি ইন্টারপ্রেটার দিয়ে রান করানো হয় যেটা এই ধরনের বাইটকোডের জন্য অপটিমাইজড।

অপটিমাইজিং কম্পাইলারঃ 

মনিটর বা প্রোফাইলার দ্বারা শনাক্ত হওয়া হট পার্টগুলো এই কম্পাইলারের কাছে পাঠানো হয়। এর মূল কাজ হলো হট পার্টগুলোর আরেকটি অপটিমাইজড ভার্সনে সংরক্ষণ করে রাখা যেটি আরো দ্রুত রান করবে। এই কাজটি করার জন্য জাভাস্ক্রিপ্ট ইঞ্জিনে ‘শেইপ’ ধারনাটি ব্যবহৃত হয়। যেমন একই কন্সট্রাক্টর ফাংশন দিয়ে তৈরি করা সব অবজেক্টের একই শেইপ ধরে নেয়া হয় কারণ এদের প্রোপার্টিগুলো একই। ইনলাইন ক্যাশিং করার জন্য এটা গুরুত্বপূর্ন। বেইজলাইন কম্পাইলারে আমরা বাইটকোড নিয়ে কথা বলেছি। বাইটকোড কিন্তু মেশিন কোডের মতো ফাস্ট নয়। অনেক বেশিবার রান হওয়া কোড যদি সরাসরি মেশিন কোডে রূপান্তর করে সেটাকে বার বার ব্যবহার করা যায় তাহলে প্রোগ্রাম অনেক ভালো পারফর্ম করবে। অপটিমাইজিং কম্পাইলার আমাদের জন্য এই কাজটিই করে দেয়। 

তাহলে ব্যপারটা এমন দাড়ালো যে প্রথমে জাভাস্ক্রিপ্ট এর সোর্স কোড বাইটকোডে রূপান্তরিত হয় যেটা একটি ইন্টারপ্রেটার এক্সিকিউট করতে থাকে। এসময় মনিটর বা প্রোফাইলার কোডের ওয়ার্ম ও হটপার্ট  অপটিমাইজিং কম্পাইলারের কাছে পাঠিয়ে দেয় যেটি পরবর্তীতে অপটিমাইজড মেশিন কোডে রূপান্তরিত হয়। এখানে ইন্টারপ্রেটার ও কম্পাইলার দুইটিই ব্যবহৃত হলো প্রোগ্রামের পার্ফরম্যান্স বাড়ানোর জন্য। এটাকেই আমরা জাস্ট ইন টাইম কম্পাইলেশন এর একটি উদাহরণ হিসেবে ধরতে পারি। তবে একটি কথা মাথায় রাখা প্রয়োজন যে বিভিন্ন ব্রাউজার আলাদাভাবে তাদের নিজস্ব JIT তৈরি করেছে। তবে মূল কাজটি কিন্তু একই।

 

উদাহরন
  • JIT কি এবং কেন এসেছে?

জাস্ট ইন টাইম কম্পাইলেশন একইসাথে ইন্টারপ্রেটার এবং কম্পাইলার এর কাজ করে এবং এতে কম্পাইলার এবং ইন্টারপ্রেটার উভয়ের সুবিধা রয়েছে

  • মনিটর / প্রোফাইলার কি করে?

আমাদের প্রোগ্রামের যে অংশগুলো সবচেয়ে বেশি সংখ্যকবার রান করছে মনিটর/প্রোফাইলার সেগুলোকে বের করে আনে

  • বেইজলাইন কম্পাইলার কি করে?

এখানে কোডের ওয়ার্ম সেকশনগুলোকে বাইটকোডে রুপান্তর করা হয়

  • অপটিমাইজিং কম্পাইলার কি করে?

মূল কাজ হলো হট পার্ট গুলোর আরেকটি অপটিমাইজড ভার্সন সংরক্ষণ করে রাখা যেটি আরো দ্রুত রান করবে

  • JIT কেন দ্রুত?

একটি JIT কম্পাইলার দ্রুততর হতে পারে কারণ মেশিন কোডটি সঠিক মেশিনে তৈরি করা হচ্ছে যা এটি চালাবে

এসো নিজে করি
  • কেন JIT JS এর সাথে সম্পর্কিত?
  • JIT এর কি কোন অসুবিধা আছে?
  • আপনি কি শুধু JIT এর ধাপগুলো বলতে পারবেন
  • JIT কেন ইন্টারপ্রেটার চেয়ে দ্রুত
  • কিভাবে JIT কর্মক্ষমতা উন্নত করে