Saturday, February 14, 2009

যন্ত্র গণকের যন্তর মন্তর - ১

ভূমিকা
(সরাসরি চলে যান প্রথম পাঠে)




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

ঘটনাচক্রে আমার বিদ্যা লাভ করা হয় এই গণক প্রকৌশলেই। প্রোগ্রামিং শেখার শুরুটা আমার কাগজে কলমে, মানে কম্পিউটার কেনার আগেই প্রোগ্রামিং শেখা শুরু করি, মাস খানেক পরে সারা জীবনের বৃত্তির টাকাগুলো ভেঙে কম্পিউটার কেনা হয়। সে এক যুগ আগের কথা।

এই এক যুগ ধরে কম্পিউটার প্রোগ্রামিং শেখার বই এক গাদা দেখলাম। সেই হার্বার্ট শিল্ড থেকে শুরু করে ডেইটেল অ্যান্ড ডেইটেল সহ অনেক লেখকের লেখা সি বা জাভা শেখার বই পড়েছি, পড়িয়েছি। কিন্তু সবগুলো বইয়েরই একটা সাধারন বৈশিষ্ট্য, তা হলো, বইগুলোতে “প্রোগ্রামিং” শেখানো হয়না, যা শেখানো হয় তা হলো সংশ্লিষ্ট ভাষাটির বৈশিষ্ট্য, এবং তা দিয়ে কীভাবে প্রোগ্রাম লেখা যায়।

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

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

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


পাঠ ১

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


তাহলে, কম্পিউটার এতো সব সমস্যার সমাধান কীকরে করে? এর মূলে রয়েছে অ্যালগরিদম, বা গণনা পদ্ধতি। সহজ ভাষায় বলতে গেলে কম্পিউটার সমস্যা সমাধান করতে পারে, তার একমাত্র কারণ হলো, আমরাই সমস্যাগুলোকে ছোট ছোট ভাগে ভেঙে দেই, আর কীভাবে সমাধান করতে হবে, তাও কম্পিউটারকে বাতলে দেই। এই “বাতলে দেয়া বুদ্ধি”টুকু বাদে কম্পিউটার কেবলই সিলিকন-জার্মেনিয়ামের কিছু যন্ত্রাংশের সমাহার।


কম্পিউটার তাহলে কেনো এতো সফল? তার কারণ একটাই, আমাদের বাতলে দেয়া পদ্ধতিতে ছোট ছোট কাজগুলো প্রচন্ড দ্রুতগতিতে কম্পিউটার করতে পারে। হিসাব নিকাশ করার জন্য কম্পিউটারের যে সার্কিট বা বর্তনী রয়েছে, তাতে প্রতি সেকেন্ডে লাখ লাখ থেকে কোটি কোটি ওরকম হিসাব করা যায়। তাই আমাদের বাতলে দেয়া পদ্ধতিতে ছোট ছোট সেই ধাপগুলো কম্পিউটার চোখের নিমেষে করে ফেলে।


কম্পিউটার প্রোগ্রামিং এর মূল কথা হলো সমস্যা সমাধানকে ছোট ছোট ধাপে ভেঙে ফেলা। একেবারে বড় সমস্যা সমাধান হয়তো কঠিন, কিন্তু সমস্যাটাকে সমাধানযোগ্য ছোট ছোট ধাপে ভাগ করে ফেলতে পারলেই কম্পিউটারের মতো নির্বোধ যন্ত্র দিয়ে সেটা সমাধান করা যাবে।

আজ আমরা একটা গাণিতিক সমস্যা দিয়ে এই ব্যাপারটা বোঝার চেষ্টা করবো। ধরা যাক, আপনাকে বলা হলো ১ থেকে ৫ পর্যন্ত সংখ্যাগুলোর যোগফল বের করতে হবে, অর্থাৎ ১+২+৩+৪+৫=? । কাজটা খুবই সহজ, ক্লাস ২ এর বাচ্চাদের দিলে আধা মিনিটেই জবাব দিয়ে দেবে, প্রশ্ন হলো কম্পিউটারকে কীভাবে বোঝাবো সেটা। তার আগে আপনি নিজে ভেবে দেখুন, আপনাকে কাজটা করতে দিলে কীভাবে সেটা করবেন।

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

হাতে হাতে করার জন্য, ধরা যাক আমরা টেবিলের উপরে ১ থেকে ৫ পর্যন্ত সংখ্যাগুলো রেখেছি, আর ডান হাতে সাময়িক যোগফলগুলো রাখবো। যোগ করার বুদ্ধিটা করলাম এমন, বাঁ হাত দিয়ে টেবিল থেকে একটা সংখ্যা তুলবো, আর সেটাকে ডান হাতে যা ছিলো তার সাথে যোগ করে ডান হাতেই ধরে রাখবো।

যেমন, ১ হতে ৫ পর্যন্ত যোগ করতে হলে, প্রথমে ডান হাতে কিছুই নাই, মানে ০। প্রথম সংখ্যাটি ১। সেটাকে শূন্যের সাথে যোগ করে পেলাম ১।

পরের সংখ্যাটি ২, সেটাকে আমাদের এপর্যন্ত যোগফল ১ এর সাথে সেটাকে যোগ দিলে হয় যোগফল ৩।

পরের সংখ্যাটা ৩, সেটাকে আমাদের এপর্যন্ত যোগফল ৩ এর সাথে যোগ করে পেলাম নতুন ফল ৬।

পরের সংখ্যাটা ৪, সেটাকে আমাদের এপর্যন্ত যোগফল ৬ এর সাথে যোগ করে পেলাম নতুন ফল ১০।

পরের সংখ্যাটা ৫, সেটাকে আমাদের এপর্যন্ত যোগফল ১০ এর সাথে যোগ করে পেলাম নতুন ফল ১৫।

ব্যস, আমাদের যোগফল বের করার কাজটা শেষ, ১ থেকে ৫ এর যোগ ফল দাঁড়ালো ১৫।


উপরের হিসাবের ধাপগুলো দেখলে একটা জিনিষ হয়তো খেয়াল হবে, আমরা একই রকম কাজ (মানে বাঁ হাত দিয়ে টেবিল থেকে সংখ্যা তোলা, আর ডান হাতের সংখ্যাটার সাথে যোগ করার কাজটা) বার বার করছি, কেবল টেবিল থেকে তোলা সংখ্যাটা পালটে যাচ্ছে। আর আমরা এই পুনরাবৃত্তি করছি একটা সীমা পর্যন্ত, মানে ১ থেকে ৫ পর্যন্ত যোগ ফল বের করার ব্যাপার থাকলে টেবিল থেকে ৫ তোলার পরেই থেমে যাচ্ছি। টেবিলের উপরে আরো অনেক সংখ্যা থাকতে পারে, কিন্তু আমরা খেয়াল করে ৫ পর্যন্ত তুলেই থামছি।

এখন দেখা যাক, এই কাজটা বেকুব যন্ত্রগণককে কীভাবে বোঝানো যায় –

ডান হাতে শুরুতে কিছু নাই |

#(প্রথম ধাপ)# ডানহাতে = ০

একেবারে শুরুতে বাম হাতও খালি

#(দ্বিতীয় ধাপ)# বামহাত = ০

আমরা যেটা করবো, তা হলো বাম হাতে একটা একটা সংখ্যা তুলবো, শর্ত ৫ পর্যন্ত তুলার পরে থামবো। প্রতিবারে বাম হাতে আগে যা তুলেছিলাম, তার পরের সংখ্যাটি উঠাবো।

#(তৃতীয় ধাপ)# বামহাত (নতুন মান) = বাম হাতের আগের মান + ১

এইবার ডানহাতে যা ছিলো, তার সাথে বাম হাতেরটা যোগ করে ডান হাতেই রাখবো |

#(চতুর্থ ধাপ)# ডান হাত (নতুন মান) = ডান হাতের পুরানো মান + বাম হাতে যা তুলেছি।

এখন কাজ কি শেষ হয়েছে? মানে বাম হাতে ৫ তুলে ফেলেছি কি? যদি ফেলে থাকি, তাহলে কাজ শেষ, নইলে আবার উপরের ধাপে ফিরে যেতে হবে।

#(পঞ্চম ধাপ)# বাম হাতে যদি ৫ এর চেয়ে ছোট সংখ্যা থাকে, তাহলে কাজ শেষ হয়নি, সুতরাং তৃতীয় ধাপে ফেরত যাই। নইলে কাজ শেষ, পরের ধাপে যাই।

#(ষষ্ঠ ধাপ)# ডান হাতে যা আছে, সেটাই যোগফল, চটপট বলে ফেলি সেটা স্যারকে।

তাহলে ৫ পর্যন্ত যোগ করাটা বোঝা গেলো। ১০০ পর্যন্ত কীভাবে যোগ হবে? একই পদ্ধতি, তাই না? কেবল শর্তের লাইনটিতে ৫ তুলে ফেলেছি কি না তার বদলে আমরা দেখবো ১০০ তুলেছি কি না। সেই একটা সংখ্যা পালটে দিলেই উপরের পদ্ধতিতে ১০০ পর্যন্তও যোগ করা যাবে।

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


এই বুদ্ধিটা একটা সি ল্যাঙ্গুয়েজের প্রোগ্রাম আকারে লিখলে কেমন দাঁড়াবে দেখা যাক,

rightHand = 0 (ডান হাত শুরুতে খালি)

leftHand = 0 (শুরুতে বাম হাতও খালি)

do {
leftHand = leftHand + 1 (বাম হাতে আগের সংখ্যাটা যা ছিলো, তার পরেরটা নিলাম। প্রথম বারে কিছুই ছিলোনা, তার সাথে ১ যোগ করে পেলাম বাম হাতে ১)

rightHand = leftHand + rightHand (ডানহাতে আগে যা ছিলো, তার সাথে বামহাতেরটা যোগ করি, তারপর যোগফলটা ডান হাতেই জমা রাখি।)

} while (leftHand <5)>

do–while দিয়ে লেখা অংশটি একটি লুপ বা চক্রকোড। সেটি চলবে ততক্ষণ, যখন while এর পরের শর্তটি সত্য থাকবে। যতক্ষণ ঐ শর্তটি সত্য থাকবে, প্রোগ্রামটি লুপের শেষ মাথায় পৌছে আবার প্রথম অংশে লাফ দিয়ে যাবে।

বাম হাতে ১ থেকে ৫ পর্যন্ত সংখ্যা তুলে ফেলার পর শেষ বারে শর্তটি ভঙ্গ হবে, (কারণ বাম হাতে ৫), তখন এই লুপ আর চলবে না, লুপ শেষ হয়ে পরের অংশের কাজ শুরু হবে।

ব্যস, এটাই হলো কম্পিউটারে সংখ্যা যোগের একটা প্রোগ্রাম।

------

(ব্যাখ্যা ছাড়া সি কোডটি হবে নিচের মতো)

rightHand = 0;
leftHand = 0;

do {
leftHand = leftHand + 1;
rightHand = rightHand + leftHand;
} while (leftHand<5);>



4 comments:

Zahidur Rahman Sumon said...

Your intention is very good. From the first day of learning programming I actually felt need for such kind of book. If you can continue this topics then it may be a good book for the programming learner.

Wish you for the best.

Sumon

Abdul mannan said...

apnar logic ta amar pachanda hacha.
ami programming shikhta chai aktu help karun
Abdul mannan
Computer Science & Engineering
Dhaka International University

AMIR said...

this is really helpful for me.thank you so much vhia.wish your best luck

milon said...

স্যার, এডভান্স ইউজারদের জন্য কিছু করা যায় না?
এলগরিদমের লজিক কিভাবে বিল্ড আপ করা যায়?