যন্ত্রের সাথে যদিও মানুষের মৌলিক কিছু পার্থক্য আছে, তারপরও কিছু জিনিস মানবিক উদাহরণ দিয়ে বলাটা সহজ। ধরুন, আপনি নতুন একটি দেশের নতুন কোনো শহরে গেছেন। সেখানে ধরুন কথা বলা হয় ফরাসি ভাষায়। ফরাসিটা না জানার কারণে আপনি কথা শুরু করলেন ইংরেজিতে। যার সাথে কথা বলছেন, সেই মানুষটি ইংরেজি জানে ঠিকই, কিন্তু ততটা ভালো না। বেশ অনেকক্ষণ চেষ্টার পর সে আপনার প্রয়োজনটা বুঝবে, কী বলতে চাইছেন সেটা ধরতে পারবে। এবার মনে করুন, সেই মানুষটি দ্বিতীয় ভাষা হিসেবে বেশ ভালোভাবে জার্মান জানে। তাকে জার্মান ভাষায় কিছু একটা বোঝাতে আপনার অনেক কম বেগ পেতে হবে। তবে সবচেয়ে সহজে তাকে কিছু বোঝানো যাবে তার মাতৃভাষা ফরাসিতে। একেবারে নিজের ভাষার ব্যাপারটাই অন্যরকম। মানুষের যেরকম নিজের আলাদা ভাষা থাকে, যন্ত্রের ক্ষেত্রেও ব্যাপারটা সেরকম। তারও একান্ত আপন নিজস্ব একটা ভাষা আছে। তবে সেই ভাষা আমরা কমই ব্যবহার করি। তার বদলে মানুষের জন্য ব্যবহার করতে সহজ সেরকম কোনো একটা ভাষায় লিখে কম্পিউটারের সাথে যোগাযোগ করা হয়। যন্ত্রের নিজস্ব ভাষা থেকে যতটা সরে যাওয়া যায়, কম্পিউটারকে দিয়ে কাজ করানোর দক্ষতা তত কমতে থাকতে। যন্ত্রের এই নিজের ভাষাকে বলা হয় ‘অ্যাসেম্বলি ভাষা’ বা শুধু অ্যাসেম্বলি।
হরেক রকম অ্যাসেম্বলি
সমসাময়িক পৃথিবীর অতি পরিচিত প্রোগ্রামিং ভাষার কয়েকটির নাম সি, সি++, জাভা, পাইথন, লিস্প, পার্ল ইত্যাদি। এগুলোর একেকটার একেকরকম সুবিধা (এবং অসুবিধা), তবে সবচেয়ে বড় সুবিধা হলো এরা বহনযোগ্য। এসব ভাষায় প্রোগ্রাম লেখার পর কী রকম কম্পিউটারে সেটা চলবে তা ভাবার দরকার হয় না। ভাষাটি যত রকম কম্পিউটার সমর্থন করে, তত রকম কম্পিউটারে নিয়ে গেলেই সেই ভাষায় লেখা প্রোগ্রাম কম্পাইল হয়ে চলবে। কম্পাইল ব্যাপারটা আসলে কী? কম্পাইলার নিজে একটি বিশেষ ধরনের প্রোগ্রাম, যার কাজ একটা নির্দিষ্ট ভাষায় লেখা প্রোগ্রামের সোর্স কোড যন্ত্রের ভাষায় রূপান্তর করা। যন্ত্র সি, সি++ বা জাভা বোঝে না। কম্পিউটারের ভেতর বসে যে জিনিসটি সত্যি সত্যি হিসাব কষে, সেই প্রসেসর অনেক রকমের হয়। যেমন ধরুন, এএমডি৬৪, এক্স৮৬, এআরএম ইত্যাদি। প্রত্যেক রকম প্রসেসরের নিজস্ব একটি ‘নির্দেশনা সেট’ থাকে।
এই নির্দেশনাবলি দিয়েই প্রসেসর নিয়ন্ত্রণ করা যায় এবং তাকে দিয়ে প্রয়োজনমাফিক কাজ করিয়ে নেওয়া যায়। সংখ্যানির্ভর এই নির্দেশনাবলি মনে রাখা মানুষের জন্য অত্যন্ত কষ্টসাধ্য। প্রোগ্রাম লেখার জন্য তাই বিভিন্ন নির্দেশনার বিভিন্ন নাম জুড়ে দিয়ে ব্যাপারটা সহজ করা হয়। তাতে যে মোটামুটি রকমের একটি ভাষা দাঁড়িয়ে যায় তাকেই বলা হয় অ্যাসেম্বলি। যেহেতু এই ভাষা একেবারে সরাসরি প্রসেসরের নির্দেশনা সেটের সাথে জড়িত, তাই প্রত্যেক রকম প্রসেসরের অ্যাসেম্বলি ভাষাও আলাদা। মোবাইলে যে এআরএম প্রসেসর ব্যবহৃত হয়, তার অ্যাসেম্বলি দিয়ে লেখা প্রোগ্রামটি আপনার বড় ডেস্কটপ কম্পিউটারে নিয়ে গেলে সেটা পুরোপুরিই অকেজো হয়ে যাবে।
অ্যাসেম্বলি যেহেতু সরাসরি যন্ত্রভাষার সাথে যুক্ত, এই ভাষায় প্রোগ্রাম লেখাটাও সময়সাপেক্ষ এবং বেশ কষ্টকর। এর ফলে ১৯৫৭ সালের দিকেই প্রোগ্রামারদের সুবিধার কথা বিবেচনা করে ফোরট্রান নামের একটি উচ্চতর প্রোগ্রামিং ভাষা গড়া হয়। উচ্চতর এই অর্থে, এই ভাষার কাজকর্ম যন্ত্র থেকে বেশ খানিকটা উঁচুতে। ফোরট্রান দিয়ে প্রোগ্রাম লেখার জন্য কম্পিউটারের কলকব্জা কীভাবে কাজ করে সেটা তেমন একটা জানার প্রয়োজন নেই। এরপর আরও প্রচুর উচ্চতর প্রোগ্রামিং ভাষা এসেছে, কিন্তু ১৯৭২ সালে সি ভাষার আবির্ভাবের আগে এসব ‘সহজ’ ভাষা সিস্টেম ডেভেলপাররা (যারা অপারেটিং সিস্টেম এবং আনুষঙ্গিক প্রোগ্রাম লিখে থাকেন) খুব একটা গুরুত্ব দিয়ে নেননি, কারণ অ্যাসেম্বলি দিয়ে প্রোগ্রাম লেখা কষ্টসাধ্য হলেও তাতে একটা প্রোগ্রামের যেরকম কর্মদক্ষতা হবে, উচ্চতর প্রোগ্রামিং ভাষায় লেখা প্রোগ্রামে সেই দক্ষতা পাওয়া যাবে না।
ঘরোয়া কম্পিউটার জনপ্রিয় হওয়ার আগপর্যন্ত দ্রুতগতির উচ্চ মেমোরি সংবলিত কম্পিউটারের বাজারমূল্য এত বেশী ছিল যে যেখানে প্রোগ্রামের কর্মদক্ষতা গুরুতর, সেখানে অ্যাসেম্বলি ব্যবহৃত হতো। সি ভাষাকে মোটামুটি বলা যায় ‘মাঝারি’ পর্যায়ের ভাষা, কারণ অ্যাসেম্বলি না হওয়া সত্ত্বেও এই ভাষা দিয়ে যন্ত্রের অনেকটাই কাছাকাছি যাওয়া যায়। কিন্তু আমরা এখন একবিংশ শতকের দ্বিতীয় দশকে বাস করছি। নিতান্ত কম দামী কম্পিউটারেও গিগাহার্টজ প্রসেসর এবং গিগাবাইট মেমরি থাকে। সি ভাষার নতুন নতুন সংস্করণ এসেছে, নতুন যুগের প্রোগ্রামিং ভাষার আবির্ভাব হয়েছে যেগুলো উচ্চতর ভাষার অনেক সীমাদ্ধতা কাটিয়ে উঠতে পারে। সবকিছু এখন ‘ক্লাউড’ কেন্দ্রিক। আমাদের এই সময়ে অ্যাসেম্বলি কতটা প্রাসঙ্গিক?
তবুও কথা থেকে যায়
কিছু জিনিস অ্যাসেম্বলি ছাড়া লেখা সম্ভব নয়। কম্পিউটার চালানোর জন্য সবচেয়ে গুরুত্বপূর্ণ প্রোগ্রাম হলো অপারেটিং সিস্টেম, এটা সেরকম একটা উদাহরণ। যৌথভাবে ডেভেলপ হওয়া লিনাক্স কার্নেলের কথা ধরা যাক। প্রচুর রকমের প্রসেসরে এই কার্নেলটি চলে থাকে। প্রত্যেক রকম প্রসেসরের জন্য আলাদা কার্নেল ব্যবহার করা হয়। বাকি সব কোড এক হলেও কিছু কোড থাকে প্রসেসরের উপর নির্ভরশীল, সেগুলো অ্যাসেম্বলি দিয়েই লিখতে হয়। আরেকটি জায়গায় অ্যাসেম্বলি এখনও খুবই গুরুত্বপূর্ণ, সেটা হলো ‘এম্বেডেড’ সিস্টেম বা খুবই ছোট ধরনের কম্পিউটার। এগুলোতে প্রসেসর এবং মেমরি দুই-ই কম থাকে। সর্বোচ্চ ফল নিশ্চিত করার জন্য এগুলোতে অ্যাসেম্বলি দিয়ে প্রোগ্রাম লেখা বাঞ্ছনীয়।
কর্মদক্ষতা ছাড়াও অ্যাসেম্বলির একটি বড় সুবিধা আছে। অ্যাসেম্বলি শেখা মানে যন্ত্র সম্পর্কে গভীরভাবে জানা। উচ্চতর প্রোগ্রামিং ভাষাগুলোতে কম্পিউটারের কলকব্জা আড়াল করে রাখা হয়, কিন্তু অ্যাসেম্বলিতে সবই খোলাখুলি, কোনো রাখঢাক নেই। কাজেই কম্পিউটার কীভাবে কাজ করে সেটা বিস্তারিত জানতে হলে অ্যাসেম্বলির বিকল্প নেই। আমেরিকান গণিতবিদ এবং কম্পিউটার বিজ্ঞানী ডোনাল্ড নুথ তাঁর সমাদৃত ‘দি আর্ট অভ কম্পিউটার প্রোগ্রামিং’ বইয়ের উদাহরণ দেবার জন্য কাল্পনিক একটি অ্যাসেম্বলি ভাষা গড়ে তুলেছিলেন, কারণ অ্যালগরিদমের দ্রুতগতি এবং দক্ষ মেমরি ব্যবহার নিশ্চিত করার জন্য উচ্চতর প্রোগ্রামিং ভাষার উপর তিনি ভরসা রাখতে পারেননি।
আমরা এমন যুগে বাস করি যেখানে সবকিছু হাতের নাগালে। এটা যেমন ভালো, তেমনি এর কিছু খারাপ দিকও থেকে যায়। বাজার থেকে সবজি কিনে এনে রান্না করাটা সহজ, কিন্তু কেউই যদি সবজি কীভাবে ফলাতে হয় সেটা না শেখে, বাজারে সবজিই আর পাওয়া যাবে না। প্রোগ্রামিং নিয়ে যদি আগ্রহী হয়ে থাকেন, অ্যাসেম্বলি ভাষা নিয়ে একটু ঘাঁটাঘাঁটি করে দেখুন। শুধুমাত্র উচ্চতর ভাষায় প্রোগ্রামিং শিখে কম্পিউটারের ভিতরে কী হচ্ছে সেটা যেন অজানা থেকে না যায়, অ্যাসেম্বলি সেই নিশ্চয়তা দিতে পারে।
E. Knuth, Donald (1997). The Art of Computer Programming. 3rd Edition. Volume 1. p. viii-ix
ফিচার ইমেজ: YouTube