পর্ব-৩/১০০
জাভা ভার্চুয়াল মেশিন (JVM) এবং JDK, JRE & JVM এর মধ্যে পার্থক্য
জাভা একটি উচ্চ স্তরের(high level) প্রোগ্রামিং ভাষা। উচ্চ স্তরের ভাষাতে লেখা একটি প্রোগ্রাম কোন মেশিনে সরাসরি চালানো যায় না। প্রথমে এটিকে ঐ বিশেষ মেশিনের উপযোগী ভাষায় অনুবাদ করার প্রয়োজন হয়। Javac কম্পাইলার এই অনুবাদের কাজটি করে থাকে, এটি জাভা প্রোগ্রামকে ইনপুট হিসাবে (.java ফাইল ধারণকারী সোর্স কোড) নেয় এবং উক্ত প্রোগ্রামকে মেশিন কোডে অনুবাদ বা রূপান্তর করে (যা বাইট কোড বা .class ফাইলকে নির্দেশ করে)।
জাভা ভার্চুয়াল মেশিন (JVM) একটি ভার্চুয়াল মেশিন যা প্রকৃত মেশিনে (আপনার কম্পিউটারে) থাকে এবং JVM এর মেশিন ভাষা হল বাইট কোড। এটি কম্পাইলারের কাজকে সহজ করে দিয়েছে কারণ এটি প্রত্যেক প্রকার মেশিনের জন্য নিজ নিজ মেশিন কোডের পরিবর্তে JVM এর বুঝার জন্য বাইট কোড তৈরি করতে পারে। কম্পাইলার দ্বারা উৎপন্ন বাইট কোডকে JVM সংকলন(execute) করে এবং আউটপুট প্রদান করে। JVM এর কারণেরই মূলত জাভা প্ল্যাটফর্ম হতে স্বাধীন।
সুতরাং, এটি এখন আমাদের কাছে পরিষ্কার যে, JVM এর প্রাথমিক কাজ হল কম্পাইলার কর্তৃক উৎপাদিত বাইট কোড সম্পাদন(execute) করা। প্রতিটি অপারেটিং সিস্টেমের জন্য ভিন্ন ভিন্ন JVM থাকলেও বাইট কোড সম্পাদন করার পরে তারা যে আউটপুট দেয় তা অন্য সকল অপারেটিং সিস্টেমের জন্যও একই রকম। অর্থাৎ Windows এ উৎপন্ন বাইট কোড Mac OS এ রান করানো যেতে পারে। একইভাবে এর বিপরীতটাও করা যায়।। তাই আমরা জাভাকে প্ল্যাটফর্ম হতে স্বাধীন ভাষা বলে থাকি। নীচের চিত্রটিতে একই জিনিস দেখা যাবে:
সুতরাং সবকিছু সংক্ষেপে: জাভা ভার্চুয়াল মেশিন (JVM) হল ভার্চুয়াল মেশিন যা প্রকৃত মেশিমে (আপনার কম্পিউটারে) চলে এবং যা জাভা বাইটি কোড সম্পাদন(execute) করে। JVM জাভা সোর্স কোড বোঝে না, তাই আমাদের javac কম্পাইলার এর প্রয়োজন হয় যা *.java ফাইলগুলিকে কম্পাইল করে *.class ফাইলে রূপান্তর করতে বাধ্য করে। রূপান্তরিত কোড মূলত বাইট কোড যা JVM বুঝতে সক্ষম। JVM জাভাকে বহনযোগ্য (portable) করে তোলে ফলে কোড একবার লিখে যে কোন প্লাটফর্মে চালানা যায়। অর্থাৎ প্রতিটি অপারেটিং সিস্টেমের জন্য ভিন্ন ভিন্ন JVM থাকলেও বাইট কোড সম্পাদন করার পরে তারা যে আউটপুট দেয় তা অন্য সকল অপারেটিং সিস্টেমের জন্যও একই রকম।
JVM আর্কিটেকচার
চলুন দেখা যাক JVM কিভাবে কাজ করে:
Class Loader: ক্লাস লোডার .class ফাইলটি পড়ে এবং method area তে বাইট কোড সংরক্ষণ করে।
Method Area: সমস্ত থ্রেড জুড়ে JVM এর একটি সাধারণ Method Area থাকে। এটি constant pool, field, method local data, method code, constructor code ইত্যাদি শ্রেণিবদ্ধ উপাদান ধারণ করে যেগুলো ক্লাসে এবং objects/interface এর সূচনায় ব্যবহৃত হয়। এই method area সাধারণত JVM স্টার্ট-আপের সময় তৈরি হয়। এটি Heap area এর অংশ।
Heap: হিপ হল JVM মেমরির একটি অংশ যেখানে object বরাদ্দ হয়। JVM প্রতিটি .class ফাইলের জন্য একটি ক্লাস অবজেক্ট তৈরি করে।
Stack: স্ট্যাকও JVM মেমরির একটি অংশ তবে Heap এর মত নয়। এটি অস্থায়ী ভেরিয়েবলগুলি সংরক্ষণের জন্য ব্যবহার করা হয়।
PC Registers: কোন নির্দেশনাটি নিষ্পন্ন (executed) হয়েছে এবং কোনটি নিষ্পন্ন হতে যাচ্ছে তা ট্র্যাক রাখে। নির্দেশাবলী থ্রেড দ্বারা নির্বাহ(executed) হওয়ায় প্রতিটি থ্রেডে একটি পৃথক পিসি রেজিস্টার থাকে।
Native Method stack: একটি নেটিভ মেথড ভার্চুয়াল মেশিনের runtime data area অ্যাক্সেস করতে পারে।
Native Method interface: এটি জাভা কোডটি কল করতে বা স্থানীয় অ্যাপ্লিকেশনগুলির দ্বারা কল করতে সক্ষম করে। নেটিভ অ্যাপ্লিকেশন এমন একটি প্রোগ্রাম যা হার্ডওয়্যার এবং OS এর সিস্টেমের জন্য নির্দিষ্ট।
গার্বেজ সংগ্রহ: জাভা কোড দ্বারা একটি শ্রেণির উদাহরণ স্পষ্টভাবে তৈরি করা হয় এবং ব্যবহারের পরে এটি স্বয়ংক্রিয়ভাবে মেমরি পরিচালনার জন্য আবর্জনা সংগ্রহের মাধ্যমে স্বয়ংক্রিয়ভাবে ধ্বংস হয়ে যায়।
Native Method interface: এটি জাভা কোডকে native application এর মাধ্যমে কল করতে সক্ষম করে। নেটিভ অ্যাপ্লিকেশন এমন একটি প্রোগ্রাম যা সিস্টেমের হার্ডওয়্যার এবং OS এর জন্য নির্দিষ্ট।
Garbage collection: জাভা কোড দ্বারা স্পষ্টভাবে একটি class এর উদাহরণ(instance) তৈরি করা হয় এবং memory management এর জন্য ব্যবহারের পরে garbage collection এর মাধ্যমে স্বয়ংক্রিয়ভাবে এটি ধ্বংস হয়ে যায়।
JVM বনান JRE বনান JDK
JRE: JRE একটি environment যাতে জাভা ভার্চুয়াল মেশিন রান করে। JRE তে জাভা ভার্চুয়াল মেশিন (JVM), ক্লাস লাইব্রেরি এবং অন্যান্য ফাইল রয়েছে। কিন্তু এতে কম্পাইলার এবং ডিবাগার ইত্যাদি ডেভেলপমেন্ট টুলস নাই।
যার মানে হল আপনি JRE তে কোড রান করতে পারেন তবে আপনি JRE তে কোড বিকাশ এবং সংকলন(develop and compile) করতে পারবেন না।
JVM: উপরের বর্ণনা অনুযায়ী ক্লাস, লাইব্রেরি এবং JRE দ্বারা সরবরাহকৃত ফাইলগুলি ব্যবহার করে JVM প্রোগ্রাম রান করে।
JDK: JDK হল JRE এর একটি সুপারসেট। এতে JRE এর সবকিছু সহ কম্পাইলার, ডিবাগার ইত্যাদি ডেভেলপমেন্ট টুলসও রয়েছে।