Email: info@jugbd.org

জাভা সত্যিই কী ধীরগতির?

জাভা সত্যিই কী ধীরগতির?


জাভা কোড প্রথমে বাইটকোডে কম্পাইলড হয়, তারপর সেটিকে জাভা ভার্চুয়াল মেশিন এক্সিকিউট করে। বাইটকোড হচ্ছে এক ধরনের অন্তর্বর্তীকালীন ভাষা যা কিনা ঠিক মানুষের পাঠ উপযোগী নয়, আবার মেশিনের জন্যও নয়। এটি শুধুমাত্র জাভা ভার্চুয়াল মেশিন (JVM)পড়তে পারে। বাইটকোডকে এক্সিকিউট করার জন্য জাভা ভার্চুয়াল মেশিন জাস্ট ইন টাইম (JIT) কম্পাইলার ব্যবহার হরে। JIT বাইটকোডকে সরাসরি ইন্টারপ্রেট(interpret) করে। এটি রানটাইমে বাইটকোডকে ইন্টারপ্রেট করে মেশিন কোডে রূপান্তরিত করে যা কিনা সিপিইউ রান করে। এখানে একটি ইন্টারেস্টিং প্রশ্ন হতে পারে, জাভা কি তাহলে ইন্টারেপ্রেটেট ভাষা নাকি কম্পাইল্ড ভাষা? উত্তর কিন্তু দুটোই। জাভা একই সঙ্গে কম্পাইলড এবং ইন্টারপ্রেটেড(compiled & interpreted) ভাষা

ওপরের লাইনগুলো পড়ে আপনি মনে করতেই পারেন যে, JIT আসলে জাভাকে ধীর করে দিচ্ছে, কারণ এটি প্রোগ্রাম যখন চলে তখন ইন্টারপ্রেট করছে। এই উপসংহারটি হয়তো স্বজ্ঞামূলক (intuitive), তবে সঠিক নয়। JIT আসলে অনেক ভালোভাবেই কাজ করে।

C/C++-কে সাধারণভাবে ধরা হয় যে, এটি জাভা প্রোগ্রামিং ভাষা থেকে ভালো পারফর্ম করে। জাভা যেহেতু অনদ্যাফ্লায়(on the fly) এক্সিকিউট করে, এজন্য অনেকটা এভাবে চিন্তা করা হয়। কোডকে মেশিন কোডে রূপান্তরিত করার জন্য আসলে খুব বেশি সময় লাগে না, তারপরও যদি কোনো ভাষার কোডকে এক্সিকিউট করার আগে মেশিন কোডে রূপান্তরিত করতে না হয়, তাহলে ধরা হয়, সেই ভাষা দ্রুতগামী। মজার ব্যাপার হচ্ছে কোন কম্পাইলারই কিন্তু টপনচ (top notch) অ্যাসেম্বলি(assembly) প্রোগ্রামারদের মতো যারা কিনা কোনো হার্ডওয়্যারকে টার্গেট করে মেশিন কোডকে সরাসরি ম্যানিপুলেট(manipulate) করতে পারে, তাদের মতো মেশিন কোড তৈরি করতে পারে না, যা কিনা অনেক বেশি পার্ফরমেন্ট (performant) হবে। C/C++ কিংবা জাভা সবগুলোরই কিছু না কিছু সমস্যা আছে। জাভাকে রান করার আগে অনদ্যাফ্লায় মেশিন কোড তৈরি করতে হয়, C/C++ এর কোডও কিন্তু অনেকটা সাধারণভাবেই কম্পাইলড হয়। এছাড়া C/C++ এ কিন্তু সরাসরি একটি নির্দিষ্ট হার্ডওয়্যারকে টার্গেট করে কোড লেখা হয় না সবসময়।

মজার ব্যাপার হচ্ছে, জাভা ভার্চুয়াল মেশিন কিন্তু খুবই বুদ্ধিমান(intelligent) এনভায়রনমেন্ট এবং JIT নিজেও খুবই বুদ্ধিমান কম্পাইলার। উদাহরণস্বরূপজেভিএম জানে যে কোন মেথড কতবার কল করা হচ্ছে, কারণ জেভিএম মেথড কল গণনা(count) করে, পরিসংখ্যান রাখে। যখন এই সংখ্যা একটি নির্দিষ্ট সীমার(threshold) বাইরে চলে যায়, তখন সেই মেথডের মেশিন কোড জেভিএম রেখে দেয়, পরের বার আবার কল করা হলে, সেটি আর সেই মেথডকে ইন্টারপ্রেট না করে সরসরি সেই রেখে দেওয়া মেশিন কোডকে দিয়ে দেয় যা কিনা বারবার বাইটকোড থেকে মেশিনকোডে ট্রান্সলেশন করার ব্যয়(cost) কমিয়ে দেয়। আরও মজার ব্যাপার হচ্ছে, JIT কম্পাইলার, যে সব কোড খুব বেশিবার ব্যবহার করা হয়, সেগুলোকে অপটিমাইজ(optimize) করে। এছাড়াও JIT নানা ধরনের স্ট্যাটিসটিক্স কালেক্ট করে থাকে। গবেষণায় দেখা গেছে যে, 80% সময়ে আসলে মোট কোডবেইসের(codebase) 20% কোড এক্সিকিউট হয়। সুতরাং এই 20% কোডগুলো যদি আলাদা করা যায়, এবং এদেরকে অপটিমাইজ(optimize) করা যায়, তাহলে কিন্তু অনেক কর্মক্ষমতা বৃদ্ধি করা যাবে। ব্যাপার হচ্ছে JIT আসলে তাই করে। এটি এই 20% কোড(hotcode)কে আলাদা করতে পারে এবং এদেরকে অপটিমাইজ করতে পারে। ওরাকলের জাভা ভার্চুয়াল মেশিন হটস্পট(hotspot)-এর নাম হয়তো অনেকেই জানি, এটির নামকরণ করা হয়েছে এই জন্য যে, এটি এই হটস্পটগুলোকে আলাদা করতে পারে। জাভা যেহেতু জেভিএম এর জন্য লেখা হয়, এবং JIT সেটিকে মেশিন কোডে রূপান্তরিত করে, এটি কিন্তু রানটাইমে হার্ডওয়্যারের ইনফরমেশন অ্যাকসেস করতে পারে এবং তার উপর ভিত্তি করে অপটিমাইজ মেশিন কোড তৈরি করে পারে, যা কিনা C/C++ এর ক্ষেত্রে অনেক সময়ই সম্ভব হয়ে উঠে না।

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

I [Bazlur] help junior software developers to master the top coding and collaboration skills so they get hired to work on amazing projects.

Have any Question or Comment?

Leave a Reply

Your email address will not be published. Required fields are marked *

5 mistakes Java developers make that prevent them from working on awesome projects

Subscribe to Blog via Email

Enter your email address to subscribe to this blog and receive notifications of new posts by email.

Join 1,211 other subscribers

%d bloggers like this: