Wednesday, July 6, 2011

বোকা কম্পিউটারের চালাকি - ২ : কম্পিউটারের ভাষা

সংবিধিবদ্ধ সতর্কীকরণঃ এই লেখা কম্পিউটারবোদ্ধাদের জন্য নহে।

১ম পর্বে দেখিয়েছিলাম – কম্পিউটারকে কিভাবে ০(শূন্য) আর ১(এক) এর মাধ্যমে ইনস্ট্রাকশন দিতে হয়। বড় জটিল সে ইনস্ট্রাকশন, তাই না? এমনভাবে ইনস্ট্রাকশন দেয়া মোটেও আমাদের মতো সাধারণ মানুষের কম্মো নয়, কি বলেন? তবে শুরুটা কিন্তু ওভাবেই ছিল। একারণে তখন কিন্তু তা আমাদের নাগালের মধ্যেও ছিল না। ভাগ্য ভালো, এখন আর সেভাবে হাজার-হাজার-লাখ-লাখ ০ আর ১ লিখতে হয় না। এখন কীভাবে লিখা হয় সেদিকেই নজর দিব আজকে।

একটা অতীব সত্য কথা বলি। কম্পিউটার কিন্তু এখনো ০ আর ১ দিয়ে গঠিত ইনস্ট্রাকশন ছাড়া অন্য কিছু বুঝে না। এটাই তার ভাষা। আমরা বাঙালিরা যেমন বাংলা ছাড়া আর কোন ভাষা বুঝি না (ইংরেজি বা অন্য কোন ভাষাকে আসলে আগে বাংলায় অনুবাদ করে নেই, এরপর বুঝি), তেমনি কম্পিউটারও তার ভাষা ছাড়া অন্য কিছু বুঝে না। ভিন্নভাবে ইনস্ট্রাকশন দিলে সে আগে নিজের ভাষায় রূপান্তর করে নেয়। কম্পিউটারের এই ভাষার কেতাবি নাম হলো – মেশিন ল্যাংগুয়েজ [উইকি]।

কিন্তু, মেশিন ল্যাংগুয়েজে কথা বলা তো মেশিনের কাজ। বোরিং আর যান্ত্রিক। এইসব সংখ্যা দিয়ে কথা বলতে কি আমাদের ভাল লাগে? আমরা তো কথা বলি শব্দ দিয়ে, সংখ্যা দিয়ে না। আচ্ছা, এমন যদি হতো কোন একটা যন্ত্র আমাদের শব্দগুলোকে কম্পিউটারের সংখ্যায় কনভার্ট করে দিচ্ছে, তাহলে ভাল হতো না? এমন কনভার্টার কিন্তু আসলেই আছে। এর নাম কম্পাইলার [উইকি]

চলুন কম্পাইলারের কাজটা একটু দেখে নেই। গত পর্বের আমাদের সিম্পল কম্পিউটারের ইনস্ট্রাকশনগুলোর কথা মনে আছে? ১৫ আর ২০ এর যোগের ইনস্ট্রাকশন ছিল – ০০০১ ০০১৫ ০০২০ (বাইনারিতে কনভার্শনের আগে)। এখানে প্রথম ০০০১ হলো যোগের কার্যনম্বর (কেতাবি নামঃ অপ্‌কোড [উইকি]), আর পরবর্তী ০০১৫ আর ০০২০ হলো যোগের সংখ্যা দু’টি। এই ইনস্ট্রাকশনকে আমাদের পরিচিত ইংরেজি ভাষায় লিখতে বললে হয়তো লিখতাম –

ADD 15,20

তাই না? কম্পাইলার এই ইংরেজি ভাষার ইনস্ট্রাকশনকে নিচের নিয়মে মেশিন ল্যাংগুয়েজে অনুবাদ করতে পারে-

১) প্রথমে ADD কে যোগের কার্যনম্বরে (০০০১) কনভার্ট করবে।
২) এরপর কমার দুই পাশের সংখ্যা দু’টোকে ৪ অংকের সংখ্যায় রূপান্তর করবে (০০১৫, ০০২০)
৩) এরপর তিনটা সংখ্যা একসাথে করবে – ০০০১০০১৫০০২০। ব্যস! হয়ে গেলো।

আপনি-আমি ০০১০০০১৫০০২০ লেখার চেয়ে ADD 15,20 লিখতেই স্বচ্ছন্দ বোধ করবো, তাই না? এর মূল কারণ হলো – আমরা সংখ্যার চেয়ে শব্দ মনে রাখতে পারি সহজে। এইভাবে মেশিন ল্যাংগুয়েজের সংখ্যার জায়গায় কিছু পরিচিত শব্দ বসিয়ে আরেকটা ল্যাংগুয়েজ তৈরি করতে পারি, যেটাকে কম্পাইলার আবার মেশিন ল্যাংগুয়েজে অনুবাদ করতে পারে। এই নতুন ল্যাংগুয়েজটাকে বলে অ্যাসেম্বলি ল্যাংগুয়েজ [উইকি]। এটা মূল মেশিন ল্যাংগুয়েজের অনেক কাছাকাছি, তবে মানুষের জন্যও কিছুটা বোধগম্য।

বিভিন্ন স্তরের প্রোগ্রামিং ল্যাংগুয়েজ 
বিভিন্ন স্তরের প্রোগ্রামিং ল্যাংগুয়েজ। ছবি কৃতজ্ঞতাঃ http://www.webopedia.com/

যোগ, বিয়োগ, গুণ, ভাগ আর মনিটরে ফলাফল দেখানোর ইনস্ট্রাকশনগুলো অ্যাসেম্বলি ল্যাংগুয়েজে কেমন হতে পারে দেখি –

অপারেশন: মেশিন ল্যাংগুয়েজ ইনস্ট্রাকশন :অ্যাসেম্বলি ল্যাংগুয়েজ ইনস্ট্রাকশন
১৫+২০ :০০০১ ০০১৫ ০০২০ADD 15, 20
১০০-৩৩ :০০০২ ০১০০ ০০৩৩SUBTRACT 100, 33
৪৫x২৯ :০০০৩ ০০৪৫ ০০২৯MULTIPLY 45, 29
৬০÷৪০০০৪ ০০৬০ ০০০৪DIVIDE 60, 4
ফলাফল দেখানো :০০০৫ ০০০০ ০০০০PRINT

(উল্লেখ্যঃ এ লেখার ইনস্ট্রাকশনগুলো নমুনা মাত্র, হুবহু এভাবে মেশিন/অ্যাসেম্বলি ল্যাংগুয়েজ লেখা হয় না, তবে উদাহরণগুলো মূল ল্যাংগুয়েজের কাছাকাছি।)

এইবার এক বদলোকের কথা শুনি। সে যোগ-এর অনুবাদ ADD না করে করেছে SUM, বিয়োগের অনুবাদ করেছে DEDUCT। কমার বদলে লিখেছে AND। তার লেখা ইনস্ট্রাকশনগুলো এইরকম

SUM 15 AND 20
DEDUCT 100 AND 30

এখন কি হবে? আমাদের উপরের বানানো কম্পাইলার তো SUM/DEDUCT বুঝে না, এটা অনুবাদও করতে পারে না। আবার কমার দুই পাশের সংখ্যা দু’টো আলাদা করে, AND এর দু’পাশের না। আসলে, এখানে যার যা খুশি লিখতে পারবে না। প্রতিটা ল্যাংগুয়েজের কিছু নিয়ম-কানুন আছে, নিজস্ব শব্দভান্ডার আছে। সবাইকে এইসব নিয়ম-কানুন মেনে চলতে হবে। কম্পিউটারের ল্যাংগুয়েজের এইসব নিয়ম-কানুনই হলো তার সিন্‌ট্যাক্স [উইকি]। সিন্‌ট্যাক্স ঠিক রেখে ইনস্ট্রাকশন দিতে হবে। আমাদের স্বাভাবিক ভাষার ব্যাকরণের মতোই অনেকটা- কিছু অর্থহীন শব্দ একের পর এক বসিয়ে দিলেই হলো না, ব্যাকরণ মেনে বসাতে হবে।

সিন্‌ট্যাক্স ঠিক রেখে অ্যাসেম্বলি ল্যাংগুয়েজে কমান্ড দেয়া মেশিন ল্যাংগুয়েজের চেয়ে কিছুটা সহজতর হলেও, তা আমাদের স্বাভাবিক ল্যাংগুয়েজ থেকে অনেক দূরের ল্যাংগুয়েজ। এরকম ল্যাংগুয়েজকে বলে লো-লেভেল ল্যাংগুয়েজ [উইকি]। এই ল্যাংগুয়েজগুলো বিভিন্ন ধরনের কম্পিউটারের ক্ষেত্রে (যেমন- INTEL প্রসেসর, AMD প্রসেসর ইত্যাদি) বিভিন্ন রকম হতে পারে। আরেক ধরনের ল্যাংগুয়েজ আছে যেগুলো সব ধরনের কম্পিউটারের জন্যই একই রকম এবং আমাদের স্বাভাবিক ল্যাংগুয়েজের আরো কাছাকাছি। এগুলোকে বলে হাই-লেভেল ল্যাংগুয়েজ [উইকি]। প্রোগ্রামিং ল্যাংগুয়েজ [উইকি] বলতে মূলতঃ আমরা এই হাই-লেভেল ল্যাংগুয়েজকেই বুঝে থাকি। খুব পরিচিত আর জনপ্রিয় হাই-লেভেল ল্যাংগুয়েজের মধ্যে C, C++, Java, C#, Pascal, Fortran, HTML, JavaScript অন্যতম। আরো নাম জানার খায়েশ থাকলে এখানে দেখতে পারেন।

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

ভিন্ন প্রসঙ্গঃ এখন গুগল ট্রান্সলেটর অনেক ভাষার অনুবাদ করতে পারে। এমনকি বাংলা ভাষার মতো জটিল ভাষাকেও অনুবাদ করা শুরু করেছে। ইস, যদি গুগল ট্রান্সলেটর আমাদের ন্যাচারাল ল্যাংগুয়েজকে (যেমনঃ ইংরেজি) কোন একটা প্রোগ্রামিং ল্যাংগুয়েজে (যেমনঃ সি) অনুবাদ করতে পারতো!

Friday, July 1, 2011

বোকা কম্পিউটারের চালাকি-১ : শূন্য আর একের খেলা

সংবিধিবদ্ধ সতর্কীকরণঃ এই লেখা কম্পিউটারবোদ্ধাদের জন্য নহে।

আপনি কখনো গাধা পুষেছেন? মনে হয় পোষেননি। সমস্যা নেই। তবে যদি কখনো পোষেন, তাহলে আপনাকে এখনি একটা জরুরি পরামর্শ দিয়ে রাখি। গাধার সামনে কখনো কম্পিউটারকে ‘গাধা’ বলে গালি দিবেন না। কেন? কারণ আপনার পোষা গাধাটি ‘মাইন্ড’ করতে পারে। কম্পিঊটারের তো অত বুদ্ধি নেই যে আপনি তাকে ‘গাধা’ বলবেন, এটা গাধা জাতির জন্য চরম অবমাননাকর বৈকি। ভাবছেন, আমার মতলবটা কী? আমার মতলব খুব সোজা-সাপ্টা। আমি বলতে চাই – কম্পিউটারের বুদ্ধিমত্তা বলে কিছু নাই। আপনার মনে হয় মানতে সমস্যা হচ্ছে। জানেন, আমারও সমস্যা হতো! ভাবতাম কম্পিউটার খুব বুদ্ধিমান একটা যন্ত্র; তাকে যা করতে বলা হয় সবই পারে। যতটুকু মনে পড়ে… এস,এস,সি, পাশের ঠিক পরের কথা। সাইনবোর্ডে যখন দেখলাম – ‘কম্পিউটারে চক্ষু পরীক্ষা করা হয়’ যন্ত্রটার প্রতি শ্রদ্ধা বেড়ে গেল। কম্পিউটার ডাক্তারিও শিখে গেছে। (চুপে চুপে বলে রাখি- আমার যখন চশমার দরকার হলো তখন আমি সেই ডাক্তারের কথা মনে আনিনি, অনেক টাকা লাগবে ভেবে।) শুনেছি কম্পিউটার নাকি রকেটও চালাতে পারে! ভাবতাম- না জানি আরো কত কী পারে!

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

কেবল ০ আর ১ দিয়ে কম্পিউটার তবে এত জটিল সব কাজ করে কীভাবে ভাবছেন? বেটার আসলে দুইটা ভাল গুণ আছে- ১)অনেক দ্রুত কাজ করতে পারে। ২)কাজে ভুল করে না। এই দুই গুণের কারণেই বেটার আজ এত প্রতাপ।

০ আর ১ দিয়ে কিভাবে ইন্সট্রাকশন হয় তা বোধ হয় বুঝা গেলো না। আমাদের কাছে ০১১০১০১১১১০১০০১০০০০১০১১১০১১০০১০১০১০০১১১০০০০০১১ সংখ্যাটি কেবল ০ আর ১ দিয়ে গঠিত একটি সংখ্যা মনে হলেও কম্পিউটারের কাছে এটা একটা ইন্সট্রাকশন। এবারও মনে হয় পরিষ্কার হলো না। দেখি একটু পরিষ্কার করতে পারি কিনা। তার আগে ছোট্ট একটা কথা বলে রাখি – আমরা ১, ২, ৩, ৪, ১০০, ২০০, ১০০০, ২০০০, ১ লাখ, ২ লাখ যত সংখ্যা জানি সব সংখ্যাকেই বাইনারি (বাংলায়- দ্বিমিক) পদ্ধতিতে প্রকাশ করা যায়।

তো, যা বলছিলাম। কম্পিউটারের কাছে আসলে প্রতিটা ০ আর ১ এর বিশেষ অর্থ থাকে। এই ০ আর ১ দিয়ে গঠিত ইন্সট্রাকশনের মাধ্যমেই কম্পিউটার বুঝে কখন কোন্ কাজটা করতে হবে।

ধরুন খুব সাধারণ একটা কম্পিউটার বানাতে যাচ্ছি যেটা ৫ টা কাজ করতে পারে।
    ১) যোগ
    ২) বিয়োগ
    ৩) গুণ
    ৪) ভাগ
    ৫) ফলাফল মনিটরে দেখানো

বাইনারির কথা ভুলে যাই আপাতত। চলুন প্রতিটা কাজকে নাম্বারিং করে ফেলি আগে। ১ নম্বর কাজ মানে যোগ, ২ নম্বর কাজ মানে বিয়োগ, এভাবে ৩, ৪ আর ৫ মানে গুণ, ভাগ আর ফলাফল মনিটরে দেখানো। যোগ-বিয়োগ-গুণ-ভাগ প্রত্যেকটাতেই ২ টা করে সংখ্যা লাগে, তাই না? যেমন ১৫+২০, ১০০-৩৩, ৪৫x২৯, ৬০÷৪। একটা ইন্সট্রাকশন দিতে হলে তাই ৩টা জিনিস লাগবে।

একটি ইন্সট্রাকশনের ৩ টি অংশ

    ১) কত নম্বর কাজ করতে হবে তা বলতে হবে।
    ২) ১ম সংখ্যাটা কত তা বলতে হবে।
    ৩) ২য় সংখ্যাটা কত তা বলতে হবে।

১৫ আর ২০ যোগ করার ইন্সট্রাকশনটা নিচের মতো হতে পারে কিনা দেখুনতো।

১৫+২০ এর ইন্সট্রাকশন (১৫+২০)

এখানে প্রথম ঘরের ১ মানে যোগ করতে হবে, পরের ২ ঘর বিবেচনা করলে বুঝা যাবে ১৫ আর ২০ যোগ করতে হবে।

আরেকটা উদাহরণ দেখি – ১০০ থেকে ৩৩ বিয়োগ করার ইন্সট্রাকশন দেয়ার চেষ্টা করি। প্রথম ঘরে কাজের (বিয়োগ) এর নম্বর ২ দিতে হবে, পরের দুই ঘরে ১০০ আর ৩৩। তাই না?

১০০-৩০ এর ইন্সট্রাকশন  (১০০-৩০)


নিচের ২ টা ইন্সট্রাকশনের অর্থ বুঝা যায় কিনা দেখেন।

৪৫x২৯ এর ইন্সট্রাকশন  (৪৫x২৯)

৬০÷৪ এর ইন্সট্রাকশন  (৬০÷৪)


ফলাফল মনিটরে দেখানোর ইন্সট্রাকশন তাহলে কেমন হবে? ১ম ঘরে না হয় কাজের নম্বর ৫ (ফলাফল মনিটরে দেখানোর কাজের নম্বর) বসালাম, বাকি দুই ঘর কি ফাঁকা থাকবে? ফাঁকাতো রাখা যাবে না, তাহলে ০ বসিয়ে দিলাম এমনিতেই, যেগুলোর কোন অর্থ নাই।

ফলাফল মনিটরে দেখানোর ইন্সট্রাকশন (ফলাফল মনিটরে দেখানো)


ইনস্ট্রাকশনগুলো তাহলে সংখ্যা হিসেবে কেমন দেখাবে? (উপরের ছবিগুলোর সাথে মিলিয়ে নিন)

১৫+২০ : ১১৫২০
১০০-৩৩ : ২১০০৩৩
৪৫x২৯ : ৩৪৫২৯
৬০÷৪ : ৪৬০৪
ফলাফল দেখানো : ৫০০


ঝামেলা হয়ে গেলো যে! ১৫+২০ এর সংখ্যাগত ইন্সট্রাকশন ১১৫২০ এর প্রথম ১ দেখে না হয় বুঝলাম এটা যোগ, কিন্তু পরে সংখ্যা দুটি কি কি? ১৫ আর ২০? নাকি ১ আর ৫২০? নাকি ১৫২ আর ০? কিভাবে বুঝা যেতে পারে? আরেকটা নিয়ম দরকার। ধরে নিলাম কোন সংখ্যায় ৪ ডিজিটের বেশি থাকবে না। সংখ্যাগুলোর আগে শূন্য (০) বসিয়ে ৪ অংকের সংখ্যা বানাতে হবে। তাহলে ১৫ আর ২০ এর যোগের ইন্সট্রাকশন হবে নিচের মতো-

প্রতিটা সংখ্যা ৪ অংকের

ছবি আঁকা কষ্টকর বলে পরের ছবিগুলো আর দিচ্ছি না। আশা করছি বুঝতে পারছেন। এভাবে প্রতিটি সংখ্যাকে ৪ অংকের ধরলে ইন্সট্রাকশনগুলো দাঁড়ায়  -

১৫+২০ : ০০০১০০১৫০০২০
১০০-৩৩ : ০০০২০১০০০০৩৩
৪৫x২৯ : ০০০৩০০৪৫০০২৯
৬০÷৪ : ০০০৪০০৬০০০০৪
ফলাফল দেখানো : ০০০৫০০০০০০০০

খেয়াল করে দেখুন, ইন্সট্রাকশনগুলোতে এখন আর কোন দ্ব্যর্থবোধকতা নেই। প্রতি ৪টি অংক একটি সংখ্যা প্রকাশ করছে। এখানেই কম্পিউটারের এক ধরনের সীমাবদ্ধতা – কম্পিউটারের বড় সংখ্যার একটা সীমা থাকে, কারণ সংখ্যা প্রকাশের অংকের একটা সীমা থাকে। (এই সীমা দূর করার অন্য জটিল বুদ্ধি আছে, সেদিকে যাচ্ছি না এখন।)

এখন তাহলে চলুন আমাদের কম্পিউটারকে আজকের তারিখের (৩০শে জুন, ২০১১) দিন আর মাসের যোগফল বের করে তা মনিটরে দেখানোর ইন্সট্রাকশন দিয়ে দেই…

১ম ইন্সট্রাকশন: ০০০১০০০৬০০৩০ (০৬ আর ৩০ যোগ করা হচ্ছে)
২য় ইন্সট্রাকশন: ০০০৫০০০০০০০০ (ফলাফল মনিটরে দেখানো হচ্ছে)
একসাথে লিখলে হবে – ০০০১০০০৬০০৩০০০০৫০০০০০০০০

এখন কেবল এগুলোকে ইন্সট্রাকশনগুলোকে বাইনারিতে প্রকাশ করলেই কেল্লা ফতে। তবে বাইনারিতে ৪ অংকের মাধ্যমে সর্বোচ্চ ১৫ পর্যন্ত লেখা যায়। তাই বড় সংখ্যার যোগ-বিয়োগ করতে হলে বেশি অংকের সংখ্যা বানাতে হবে। ৮ অঙ্কের বাইনারি সংখ্যা দিয়ে ২৫৫ পর্যন্ত লিখা যায়। যেহেতু আমাদের উদাহরণে সর্বোচ্চ সংখ্যা ১০০ তাই ৮ অংকের বাইনারি সংখ্যা হলেই হবে। স্বাভাবিক ডেসিমেল সংখ্যাকে কিভাবে বাইনারিতে রূপান্তর করা যায় তা না হয় অন্য কোন দিন অন্য কোন সময়ে বলবো। বাইনারিতে প্রতিটি ইন্সট্রাকশন তাহলে হবে ২৪ অংকের (৩ সংখ্যার প্রতিটি ৮ অংকের)। নিচে কেবল ০ আর ১ এর সমন্বয়ে বাইনারিতে তারিখের দিন আর মাসের ইন্সট্রাকশনগুলো কেমন হবে দেখে নেই -

১ম ইন্সট্রাকশন: ০০০০০০০১০০০০০১১০০০০১১১১০
২য় ইন্সট্রাকশন: ০০০০০১০১০০০০০০০০০০০০০০০০

একসাথে করবো?
০০০০০০০১০০০০০১১০০০০১১১১০০০০০০১০১০০০০০০০০০০০০০০০০।
বাপরে বাপ! ২ টা ইন্সট্রাকশনই এত্ত বড়!

এভাবে একটার পর একটা ইন্সট্রাকশন লিখে দিলে কম্পিউটার কাজ করতে পারে। জেনে হয়তো অবাক হবেন – শুরুর দিকে মানুষজন এইভাবেই ০ আর ১ লিখে কম্পিউটারকে কাজ করাতো। এখন অবশ্য তা করে না। কিভাবে করে? অন্য কোন দিন না হয় সেদিকে যাওয়া যাবে।