আসসালামু আলাইকুম, আশা করি সকলেই ভালো আছেন, ট্রিকবিডি এর আমি নিয়মিত লেখক না হলেও যখন ই নতুন কিছু জানতে পারি যা আমার অনেক ভালো লাগে সেটা নিয়েই লিখার চেষ্টা করি। তাছাড়া অন্যান্য ব্লগ গুলোর জন্য লেখা বা আরো কিছু কাজের জন্য এখানে নিয়মিত লেখা হয়না। তবে আজকে আমার অনেক দিনের পুরোনো একটা প্রশ্নের উত্তর পেলাম যেটা নিয়ে না লিখে আর পারলাম না। আমার মতো অনেকের মনেই এই প্রশ্ন থাকতে পারে যে কোনো প্রোগ্রামিং ভাষা অন্য একটি প্রোগ্রামিং ভাষা দিয়ে লিখা হয়ে থাকলে প্রথম প্রোগ্রামিং ভাষাটির উৎপত্তি কিভাবে হয়েছিল?
প্রোগ্রামিং ভাষা
প্রোগ্রামিং ভাষা তো আসলে লেখা হয় না। যেটা লেখা হয়, সেটা হলো একটা কম্পাইলার বা অনুবাদক।
একটা ভাষায় লেখা বিভিন্ন কোড কিভাবে একটি সুনির্দিষ্ট মডেলের প্রসেসরের কাছে বোধগম্য করে তোলা হবে, সেই কাজটি আসলে করে একটি কম্পাইলার। কম্পাইলার যেভাবে একটি ভাষা বুঝবে, আপনাকে সেভাবেই প্রোগ্রাম লিখতে বলা হয়।
কম্পাইলার
এখন কম্পাইলার নিজেই যেহেতু একটি সফটওয়্যার প্রোগ্রাম, তাই সেটিকে লিখতে হয়। ধরুন, জাভা একটি ভাষা, তার সিনট্যাক্স ঠিক করা হয়েছে মানুষের সুবিধার জন্য। এখন জাভাতে আপনি কিছু একটা লিখলেন, সেটাকে মেশিনের কাছে পাঠযোগ্য করার জন্যে অনুবাদ করতে হবে। এই অনুবাদ করার প্রোগ্রামটি আপনি যেকোন ভাষাতেই লিখতে পারেন।
এখন কথা প্রসঙ্গে মনে করুন, ফোরট্রান হলো প্রথম দিককার একটা প্রোগ্রামিং ভাষা, যার কোন কম্পাইলার ছিল না। সেরকম সময়ে, ওই ভাষার জন্যে বেঁধে দেয়া কীওয়ার্ড এবং সিনট্যাক্স মেনে আপনি কিছু কোড একটা সাদা কাগজে লিখলেন। ভাষা আছে, কোডও হলো, কিন্তু অনুবাদক নেই। তাহলে তো ওই কোড কম্পিউটার বুঝবে না। আমাদের এই প্রশ্নে উল্লেখিত সমস্যা তো এটাই, তাই না? প্রথম প্রোগ্রামিং ভাষাতে লেখা একটি প্রোগ্রাম একটি কম্পিউটার বুঝবে কিভাবে!
প্রথম প্রোগ্রামিং ভাষাতে লেখা একটি প্রোগ্রাম একটি কম্পিউটার বুঝবে কিভাবে
এর উত্তর হলো, প্রথম দিকে (১৯৪৬-১৯৬০) অনুবাদের কাজগুলো কোন কম্পিউটার প্রোগ্রাম করতো না, মানুষ নিজেই করত। অর্থাৎ মানুষ নিজেই ছিল অনুবাদক বা কম্পাইলার। প্রোগ্রামারদের কাজ ছিল যুক্তি সাজিয়ে কোড লিখে সমস্যা সমাধান করা, তারপর সেই অনুযায়ী কোড লেখা। আর কম্পাইলারগণের কাজ ছিল একটা তালিকা ধরে সেটাকে মেশিন কোডে অনুবাদ করা। এজন্যে সেই যুগের কম্পাইলারগনকে-
- ওই ভাষার কীওয়ার্ড এবং সিনট্যাক্স জানতে হতো।
- প্রসেসরের স্পেসিফিকেশন জানতে হতো।
- মেশিন কোডে অনুবাদের কৌশল জানতে হতো।
- পাঞ্চকার্ডে মেশিন কোড উঠিয়ে রান করাতে হতো।
- সারারাত কাজ করে সকালে রিপোর্ট দিতে হতো।
সেই গল্পে পরে আসছি। কিন্তু তার আগে আমরা একটু গভীরভাবে বিষয়টা অনুধাবনের চেষ্টা করব। তার জন্যে আমরা জানতে চাইব যে, একটা প্রোগ্রাম আসলে জিনিসটা কেমন। মেশিন কোডই বা কীরকম যে তার আর কোন অনুবাদ লাগে না, মেশিন তাকে পড়ামাত্রই বুঝতে পারে! তার জন্যে চলুন আজ থেকে ২০-৩০ বছর পিছনে ফিরে যাই। মানে ১৯৯০-৯৯ সালের কথা বলছি।
মেশিন কোডের ধারনা
১৯৮০-৯০ দশকের জনপ্রিয় বিনোদন মাধ্যম ক্যাসেট প্লেয়ার আপনারা হয়ত অনেকেই দেখে থাকবেন। নিজে চোখে না দেখলেও ক্যাসেট প্লেয়ারের কথা শুনে থাকবেন। নিচের ছবিটা দেখুন।
ক্যাসেট টেপ। ছবির উৎস: google.com
এবার একটু ঠান্ডা মাথায় ভাবুন যে ক্যাসেট প্লেয়ার কিভাবে কাজ করে। নিজে নিজে একটু ভাবুন। তারপর নিচের ধাপগুলোর সাথে মিলিয়ে নিন-
- ক্যাসেটের মধ্যে একটা লম্বা ফিতার গায়ে সংকেত খোদাই করা থাকে। মনে করুন এগুলো হলো মেশিন কোড।
- এই ক্যাসেটটিকে প্লেয়ারের মধ্যে রাখলে, একটা মেকানিক্যাল মোটর একপাশ থেকে ফিতাটাকে টানতে শুরু করে।
- ফিতাটি যখন এপাশ থেকে ওপাশে যেতে থাকে, তখন একটা রিডার ফিতার শরীরে খোদাই করা সংকেতগুলোকে ধারাবাহিকভাবে পড়ার সুযোগ পায়।
- রিডার যেটা যেটা পড়ছে, সেই অনুযায়ী বিদ্যুৎ সংকেত ক্যাসেট প্লেয়ারের মাইকে চলে যেতে থাকে।
- তখন বিদ্যুৎ সংকেতের উপস্থিতিতে, মাইক একটা কম্পনশীল চুম্বককে বিদ্যুতের সাহায্যে কাঁপিয়ে বিদ্যুৎশক্তিকে শব্দে পরিনত করে।
ব্যাস হয়ে গেল। এখানে কোথাও কি আপনি প্রোগ্রামিং বিষয়টাকে দেখতে পাচ্ছেন? না, এখানে কোথাও প্রোগ্রামিং নেই। তবে-
- ক্যাসেটের ফিতায় সংকেত লেখার জন্যে খুব প্রিমিটিভ টাইপের হলেও একটা স্ট্যান্ডার্ড অর্থবাহী কৌশল ব্যবহার করা হয়েছে।
- আর ক্যাসেটের ফিতার গতিও খুব নির্দিষ্ট। তার মানে ক্যাসেট প্লেয়ারের সাহায্যে ক্যাসেটের ফিতা থেকে নির্দিষ্ট সময়ে নির্দিষ্ট পরিমান ডেটা পড়া হয়।
এর পরের যুগে আমরা যেসব সিডি বা ডিভিডি ব্যবহার করেছি, সেগুলোও মূলত একই পদ্ধতিতে কাজ করে। এগুলো বরং আরও পুরনো ধারনার উপর ভিত্তি করে তৈরী করা হয়েছিল। কিন্তু সে যাই হোক, ক্যাসেটের কথায় ফিরে যায়।
ক্যাসেটের রিডার হেডটির বৈশিষ্ট্য হলো, এটি ক্যাসেটের ফিতার উপর নজর রাখার সময় ক্যাসেটের যে স্থানে যেমন সংকেত পায়, সেই অনুযায়ী হালকা-ভারি বিদ্যুৎ সংকেত তৈরী করতে পারে। এই যন্ত্রের কাজই হলো ফিতাকে স্পর্শ করে যেমন যেমন অনুভুতি হচ্ছে, তেমন তেমন পাওয়ারের বিদ্যুৎ সঞ্চালন করা।
এরপর বিদ্যুত-সংকেত তৈরী করা-মাত্র সেই সংকেত চলে যায় হেডের সাথে সংযুক্ত তড়িৎ বর্তনীতে। বর্তনীর অপর প্রান্তে আছে মাইক, যেখান থেকে শব্দ উৎপন্ন হচ্ছে।
তার মানে ফিতার উপরে লেখা সংকেতগুলো ক্রমান্বয়ে পড়া হচ্ছে, এবং প্রায় সাথে সাথেই সেগুলো হেডের সাথে সংযুক্ত পথে শব্দযন্ত্রে যেয়ে আছাড় খেয়ে পড়ছে, মানে শব্দযন্ত্র গৃহীত বিদ্যুতের ম্যাগনিটিউড মূলত ক্যাসেট থেকেই নিয়ন্ত্রন করা হচ্ছে।
এখানে সংকেত পড়া, সংকেত পাঠানো, শব্দ উৎপন্ন করা, পুরোটাই অ্যানালোগ পদ্ধতিতে হচ্ছে। কয়েকটি ভিন্ন ভিন্ন ডিভাইসের ভিন্ন ভিন্ন কাজের সমন্বয়ের মাধ্যমে পুরো প্রক্রিয়াটি সম্পন্ন হচ্ছে। এখানে প্রোগ্রাম করার কিছু নেই, ডিভাইসগুলো ওভাবেই সংযুক্ত করা হয়েছে।
কম্পিউটার সংকেত
কম্পিউটার হলো এমন একটা মেশিন, যাকে চালু করে দিলে এরকম একটা নির্দিষ্ট জায়গায় জমা করে রাখা তথ্য-সংকেতের সারি থেকে একেকটা করে বাইট (আসলে আরেকটু বেশি) পড়া হতে থাকবে এবং সেই তথ্য-সংকেতগুলোকে বৈদ্যুতিক বর্তনীর সাহায্যে কোথাও পাঠানো হতে থাকবে। এভাবে পাঠিয়ে যে কী হবে, তা কিন্তু ওই কম্পিউটার জানে না, শুধু সয়ংক্রিয়ভাবে একটার পর একটা সংকেত পড়তে থাকে, আর পড়ার সাথে সাথে সেটাকে কোন একটি নির্দিষ্ট ডিভাইসের কাছে পাঠাতে থাকে।
এই পর্যন্ত যে বললাম, এখানেও তো প্রোগ্রামিং এর তেমন কিছু নেই, তাই না?
এখন আবার একটু ক্যাসেট প্লেয়ারের কথায় ফিরে যায়। এবার মনে করুন, ক্যাসেট প্লেয়ারটি আরেকটু উন্নত প্রজাতির। তার মানে এর ডানে-বামে দুইটি মাইক আছে। ক্যাসেট কিন্তু একটাই। এমতবস্থায় ক্যাসেট প্লেয়ারের রিডার ডিভাইস ক্যাসেটের ফিতা থেকে যা কিছু পড়ছে, একটু কৌশল করে তার একটাকে বামের মাইকে, আরেকটাকে ডানের মাইকে পাঠাচ্ছে। তারপর আবার একটাকে বামে, আর অন্যটাকে ডানে পাঠাচ্ছে। এভাবেই স্টেরিও সাউন্ড তৈরী হচ্ছে।
এর জন্যে কি তাকে প্রোগ্রামিং বুঝতে হচ্ছে? মোটেই না। ওকে শুধু বলে দেয়া হয়েছে সংকেত পড়তে আর পাঠাতে। পাঠানোর পথে একটি ফিল্টার সংকেতগুলোকে ডানে বা বামে ভাগ করে দিচ্ছে। অত্যন্ত সোজা-সাপ্টা বিষয়। সংকেতের মধ্যেই বিদ্যমান কিছু একটা দেখে সয়ংক্রিয়ভাবেই দুটি ভিন্ন পথে তথ্যবন্টন হতে পারে।
মেশিন ভাষা নিয়ে আরেকটু ভাবুন
এই পর্যন্ত বুঝতে আপনাদের কারোরই কোন সমস্যা হওয়ার কথা নয়। এখন তাহলে সমস্যাটিকে আরেক ধাপ জটিল করি।এবার আপনি একসাথে তিনটি বা চারটি মাইক নিয়ে চিন্তা করতে পারেন।
অথবা মনে করুন, চারটি ডিভাইসের সবগুলোই মাইক না। বরং ৪ টি ডিভাসের মধ্যে রয়েছে-
- দুইটি মাইক,
- একটি মেমোরি, আর
- একটি ইকুয়ালাইজার ডিসপ্লে
ক্যাসেটের রিডারকে যদি কোনভাবে বোঝাতে পারেন যে, সে যা পড়বে তার মধ্যে-
- একটি ব্লক বামের মাইকে পাঠাবে,
- অন্যটিকে ডানের মাইকে পাঠাবে,
- অধিকন্তু সবগুলিকেই ইকুয়ালাইজার ডিসপ্লেতে পাঠাবে,
- আর মেমোরি সুইচ অন করা থাকলে সবগুলিকে মেমোরিতেও পাঠাবে।
আর দুই মাইকে সংকেত যাওয়ার পথে দুটি ভলিউম রেগুলেটর আছে। সেগুলো দিয়ে মাইক দুটোর ভলিউম স্বতন্ত্রভাবে নিয়ন্ত্রন করা যায়।
এই অবস্থায় গান শোনার অভিজ্ঞতা আগের থেকে অনেক ভালো হবে নিশ্চয়। কিন্তু আপনারা নিশ্চয়ই বুঝতে পারছেন যে, এই বাড়তি নিয়ন্ত্রণ অর্জন করতে ক্যাসেটের রিডারকে বিশেষ কোন প্রোগ্রামিং দক্ষতা দেখাতে হবে না। শুধু একটি বিশেষ মুহূর্তে একটি বিশেষ রাস্তা খোলা থাকলেই সংকেতগুলো সেদিকে যাবে, রাস্তা বন্ধ থাকলে যাবে না। সেই অনুযায়ী ভিন্ন ভিন্ন সময়ে ভিন্ন ভিন্ন কাজ (বা কাজের সমষ্টি) সম্পন্ন হতে থাকবে।
অপর দিকে কম্পিউটারের কথা যদি ধরেন, তারও কিন্তু এরকম রিডার আছে, মাইক আছে, সাথে আরো অনেকগুলো নানান ধরনের নানান কাজের যন্ত্র আছে। এসব যন্ত্রের
- কোনটা হয়ত শব্দ উৎপন্ন করে,
- কোনটা গানিতিক যোগ করে,
- কোনটা বাতি জ্বালায়,
- কোনটা ত্রিকোনমিতিক কাজ করে,
- কোনটা আবার একটা সংখ্যা-মানকে মেমরিতে পাঠায়,
- কোনটা হয়ত ডিস্কে পাঠায়,
- ইত্যাদি।
অপারেশন কোড বা অপকোড
একটা কম্পিউটার প্রোগ্রামের মেশিন-কোডের মধ্যে (ক্যাসেটের তুলনায়) অতিরিক্ত যে জিনিসটা থাকে তাকে বলা হয় অপারেশন কোড বা অপকোড। অর্থাৎ, কম্পিউটারকে সারিবদ্ধভাবে যে সংকেতগুলো পড়তে বলা হচ্ছে, তার মধ্যে দুই ধরণের তথ্য থাকে।
- কিছু থাকে অপকোড, যার মানে হলো এখন কী করতে হবে। এই অনুযায়ী বিভিন্ন রাস্তা খুলবে বা বন্ধ হবে।
- আর কিছু থাকে তথ্য। এগুলো অর্থহীন মান। অপকোড অনুযায়ী সিদ্ধান্ত হবে যে, এই অর্থহীন ডেটাগুলো কোথায় পাঠাতে হবে।
অপকোডগুলো দৈর্ঘ্য-প্রস্তে সব একইরকম, কিন্তু তাদের মান আলাদা। অপকোড পড়ামাত্র তার মান অনুযায়ী রিডারের সাথে সংযুক্ত সবগুলো পথের মধ্যে কোন একটা নির্দিষ্ট পথ খুলে যায়। ওই পথের অপর প্রান্তে ওই অপকোডের উপযুক্ত কাজটি করে দেয়ার যন্ত্রটি আছে।
- তাহলে অপকোড আপনাকে বলে দিচ্ছে যে, কোন পথটি খুলতে হবে।
- আর তার পরেই আছে ডেটা, যার অর্থ হলো এই মুহূর্তে যে পথ খোলা, সেই পথে কী পাঠাতে হবে।
এই তো হয়ে গেল, এখানেও তো প্রোগ্রামিংএর কিছু নেই। শুধু নির্দিষ্ট গতিতে তথ্য পড়া আর অনেকগুলো রাস্তার কোন একটিতে সেই তথ্যকে পাঠানো।
মোটের উপর এও তো সেই ক্যাসেট প্লেয়ারই হলো। তাই না? কিন্তু অপকোডগুলো প্রসেসরের স্পেসিফিকেশন অনুযায়ী হয়। আর এভাবে অপকোড দিয়ে ডাইনামিক্যালি রাস্তাঘাট নিয়ন্ত্রন করতে পারাকেই (সাথে আরো কিছু ডিজিটাল যুক্তি প্রয়োগের ক্ষমতাকে) আমরা নাম দিয়েছি প্রোগ্রাম্যাবল ডিভাইস বা কম্পিউটার।
প্রোগ্রামিং জিনিসটা কী!
এবার তাহলে ভালো করে একবার দেখা যাক, প্রোগ্রামিং জিনিসটা কী! আবার তাহলে ক্যাসেটের ফিতার কথা ভাবুন।
এখন আপনি একটি লম্বা ক্যাসেটের ফিতায় এরকম সারিবদ্ধভাবে অসংখ্য অপকোড আর ডেটা লিখে নিতে পারলেই, সেটাকেই আমরা একটা প্রোগ্রাম বলতে পারি।
সর্বনিম্ন স্তরে কম্পিউটারের বোধগম্য নির্দেশনা দেয়ার বা প্রোগ্রামের ভাষা এই সারিবদ্ধভাবে খোদাই করা সংকেতগুলো। এই ভাষাটিকে আলাদা করে একটি প্রোগ্রামিং ভাষা হিসেবে লেখার কিছু নেই, কম্পাইল করারও কিছু নেই।
একটা স্পেসিফিকেশন থাকে শুধু। সেই অনুযায়ী সাজালেই প্রসেসর বুঝতে পারবে। যা যা লেখা থাকবে ফিতার গায়ে, একটি নির্দিষ্ট গোত্রের প্রসেসর সেই তথ্যগুলোকে একেকটি নির্দিষ্ট নির্দেশনা হিসেবে বুঝতে পারে।
প্রসেসর ওখান থেকে তথ্য নিতে থাকবে, এবং প্রসেসরকে স্পেসিফিকেশন মোতাবেক সেগুলো কাউকে না কাউকে পাঠাতে থাকবে। এখানেও প্রোগ্রামিং ভাষা ব্যবহার করার কিছু নেই। আপনাকে যেটা বুঝতে হবে সেটা হলো-
- কোন ডিভাইসে কী পাঠাতে চান এবং
- সেগুলো প্রসেসরকে কীভাবে বোঝাতে চান, ব্যাস।
এটা করার জন্যে আপনাকে প্রোগ্রামার হতে হবে না, তবে
- প্রসেসরকে জানতে হবে,
- কম্পিউটারকে জানতে হবে,
- কী করতে চান সেটা জানতে হবে।
- এরপর ক্যাসেটের ফিতার গায়ে সেগুলো সাজিয়ে লিখতে হবে।
এটাকেই বলা হয় মেশিন-ল্যঙ্গুয়েজ। এটা সর্বনিম্ন স্তরের প্রোগ্রামিং ভাষা। কম্পিউটার নিজে এখনো কেবল এই একটি ভাষা-ই বুঝতে পারে।
আধুনিক কম্পিউটার
আধুনিক কম্পিউটার একটি প্রোগ্রামকে ক্যাসেট প্লেয়ার বা হার্ডডিস্ক থেকে সরাসরি পড়ে না। প্রথমে প্রোগ্রামটিকে মেমোরিতে লোড করে নেই, তারপর ওই প্রোগ্রামের ইন্সট্রাকশনগুলো একের পর এক পড়তে থাকে। এই প্রোগ্রামের অপকোডগুলো বলে দেয় একটি তথ্য ওই প্রোগ্রামের কাছ থেকেই নিতে হবে, নাকি অন্য কোথাও থেকে পড়তে হবে, আর কোথায় পাঠাতে হবে। বাকি কাজ, সংযুক্ত বৈদ্যুতিক বর্তনির গুণাগুণ অনুযায়ী হয়ে যায়। কম্পিউটার যেমন তথ্য অনেক দিকে পাঠাতে পারে, তেমনি পড়তেও পারে অনেক উৎস থেকে।
কম্পিউটার একসাথে একাধিক কাজ করে না। বরং কখন কোন রাস্তাটা খোলা থাকছে তার উপর নির্ভর করছে তথ্য কোথায় যাবে আর কোথা থেকে পড়তে হবে। এই যে কোথাও পাঠানো আর সেখান থেকে ফেরত আনা (নাও আনতে পারে), এর মাঝখানে একটি ঘটনা ঘটে যাবে, মানে যোগ বা গুন হয়ে যাবে বা শব্দ উৎপন্ন হয়ে যাবে। সব কাজের জন্যেই আলাদা আলাদা যন্ত্র (হার্ডওয়্যার) আছে, আর সব যন্ত্রেরই একটি করে গানিতিক ঠিকানা দেয়া থাকে। কম্পিউটার জানে না যে সে যাকে তথ্য পাঠাচ্ছে, সে এটা নিয়ে কী করবে। প্রোগ্রামের নির্দশনায় তথ্য যেখানে পাঠানোর কথা ছিল, সেখানে পাঠিয়ে দেয়ার ওর কাজ।
প্রোগ্রাম
এখন এইযে সারিবদ্ধ নির্দেশনার মালা, এটাই হলো একটা প্রোগ্রাম। একে লিখতে কোন ভাষা জানা লাগে না। শুধু কোন প্রসেসর কোন সংখ্যাকে কিভাবে চেনে তা জানলেই হয়। যেকোন মানুষ ওই প্রসেসর সম্পর্কে একটু পড়াশোনা করে নিলেই, তারপর এরকম লম্বা লম্বা ফিতায় শুধু সংখ্যা আর সংখ্যা লিখে পাঠিয়ে দেবে কম্পিউটারের পাঠযন্ত্রে। ব্যাস প্রোগ্রামিং করাও হলো, কম্পিউটারকে সেটা বোঝানোও হলো, কাজও করানো গেল। এই ভাষাতেই কাজ করে কম্পিউটার। এই ভাষার জন্ম মানে আসলে একটি প্রসেসরের ডিজাইন। এর নাম মেশিন ল্যাংগুয়েজ, যন্ত্রের ভাষা। একেবারে ক্যাসেটের ফিতার গায়ে পর্যায়ক্রমে খোদাই করা সংকেতের মত।
কম্পাইলার
এর উপরে ভিত্তি করে একটি উঁচু-স্তরের প্রোগ্রামিং ভাষা আপনি যেভাবে ইচ্ছা সেভাবে লিখতে পারেন। কিন্তু আপনার সেই ভাষায় লেখা প্রোগ্রামকে কম্পিউটারের ভাষায় (মেশিন কোড) রূপান্তরিত করে দেয়ার জন্যে একটি কম্পাইলার লিখতে হবে। সেই কম্পাইলার আপনার প্রোগ্রামকে চালানোর জন্যে না, বরং আপনার প্রোগ্রামটিকে কম্পিউটারের ভাষায় রূপান্তর করে দেয়ার জন্য। পঞ্চাশের দশকে এই অনুবাদের কাজগুলো মানুষ নিজে হাতে করত। তাদেরকেই তখন কম্পাইলার বলা হতো। পরে কম্পাইলার নিজেই একেকটি প্রোগ্রাম হয়ে গেছে।
মেমরি
এখন আবার একটু ক্যাসেট প্লেয়ারে ফিরে যাই। মনে করুন আপনার ক্যাসেট প্লেয়ারটি একসাথে দুটো ক্যাসেট থেকে সংকেত পড়তে পারে। মনে করুন, প্রথমে একটি ক্যাসেট থেকে পড়ে যা কিছু তথ্য পেল, সেগুলো নিয়ে সে তেমন কিছুই করল না, শুধু একটা মেররিতে পর্যায়ক্রমে জমা করে রেখে দিল। মেমরীতে জমা করতে তো বাঁধা নেই, শুধু মাইকে না পাঠিয়ে মেমরীতে পাঠালেই হবে। কিন্তু মেমরীতে কেন জমা করল তার কারণটা একটু বলি।
ক্যাসেটের সমস্যা হলো যে আপনাকে সবসময় একই ক্রমে পড়তে হবে। এক স্থানে পড়তে পড়তে লাফ দিয়ে আরেক যায়গায় যাওয়া কঠিন। ক্যাসেট প্লেয়ারে যারা একটা গান শুনতে শুনতে ট্র্যাক পরিবর্তন করেছেন, তারা জানেন। কিন্তু মেমরি (আসলে Random Access Memory) তে রাখলে আপনি পরবর্তিতে মেমরির যেকোন স্থানে দ্রুত জাম্প করে সেখান থেকে পড়তে পারবেন। মেমরির প্রতিটি ঘরের একটি আলাদা ঠিকানা আছে, মেমরির একটি নিজস্ব গেটম্যান (পাহারাদার) আছে। আমরা যদি তাকে বলি R 20034, তাহলে সে বোকার মত 20034 নং ঘরের সাথে বহির্গামী দরজাকে সংযুক্ত করে বলে- এই নাও। আর যদি বলি W 20040 5534, তাহলে সে 20040 নং ঘরের প্রবেশপথ খুলে দেয়, ফলে সেখানে 5534 লেখা হয়ে যায়। যাইহোক, এরকম একটা মেমরিতে আমাদের একটা ক্যাসেট কপি হয়ে গেল। এবার অন্য ক্যাসেট থেকে পড়ার পালা।
যথারীতি ওই ক্যাসেট থেকে একটার পর একটা নির্দেশনা আসছে, তথ্য আসছে, ঠিকানা আসছে আর বোকা প্লেয়ারটা সেই মোতাবেক উদ্দীপনা প্রদর্শন করছে। এর মধ্যেই ধরেন কিছু অপকোড আছে এরকম যে কিনা মেমরি থেকে কিছু পড়তে বলে। এইযে দেখুন এখন একটা প্রোগ্রাম অন্য একটি মেমরিতে রাখা প্রোগ্রাম থেকে তথ্য নিতে শুরু করে দিল। আপনি চাইলে একটি প্রোগ্রাম দিয়ে অন্য একটি প্রোগ্রামের প্রতিটি তথ্যকে একটু নেড়েচেড়ে গোলমাল করে আবার মেমরিতে যথাস্থানে রেখে আসতে পারেন। মেমরিতে রাখতে পারলে ডিস্কেও রাখতে পারবেন। সেখান থেকে পড়ে আবার মেমরিতে ঢুকিয়ে দিতে পারবেন। এটাই কম্পাইলার করে।
আপনি যে প্রোগ্রামটা উচুমানের কোন ভাষায় লিখছেন, সেটাও আসলে কিছু তথ্যের সারি, যাকে আমরা সহজ ভাষায় পড়তে পারি। আর একটা নির্দিষ্ট ক্যাসেটের মাধ্যমে ওকেও একটা প্রোগ্রামে রূপান্তর করে ফেলতে পারি। তাহলে প্রথম যে প্রোগ্রামটিকে আপনি লিখলেন, যে ভাষাতেই লেখেন, সেই ভাষা থেকে কম্পিউটারের বোধগম্য করতে আপনার একটি ক্যাসেট প্রস্তুত করে নিতে হবে। প্রথমবারের কাজটা তো অবশ্যয় আপনাকে ওর হাতে পায়ে ধরে করতে হবে। ক্যাসেটের ফিতার গায়ে নির্দেশনার সবগুলো ধাপ আপনাকে লিখতে হবে, কম্পিউটার যেটা নিজে থেকে বুঝতে পারে, একেবারে সেই ভাষায়।
পরিশেষে
আশা করি বোঝাতে পেরেছি, পরে নিজে পড়ে আরো গুছিয়ে সহজ করে লেখার চেষ্টা করব। তবে একটা কথা আমরা হয়ত সকলেই জানি, প্রথম দিককার ভাষাগুলো মানুষের বোধগোম্য শব্দ ছিল খুব কমই, তাই সেগুলোকে অনুবাদ করার জন্যে সহজ সরল কনভার্শন টেবিল মুখস্ত করতে হতো। আগেই বলেছি যে, একসময় অনুবাদের এই কাজগুলো মানুষ নিজে হাতে করত এবং ওই মানুষগুলোকেই বলা হতো কম্পাইলার, এবং এদের প্রায় সবাই ছিলেন নারী।
সারাদিন বসে বসে প্রোগ্রামাররা কোন একটা আদিম ভাষায় প্রোগ্রাম লিখতেন, কাগজে কলমে লিখতেন, কম্পিউটার ধরা তো দুরের কথা, কম্পিউটার যে ঘরে থাকত সেখানেও তাদের ঢুকতে দেয়া হতো না। সারাদিন খাতাপত্রে প্রোগ্রাম লিখে সন্ধ্যায় সেগুলো দিয়ে আসতেন কম্পাইলারদের কাছে। কম্পাইলারগন সেগুলোকে চার্ট দেখে দেখে মেশিন কোডে রূপান্তর করতেন, তারপ সেই কোডকে পাঞ্চ কার্ডে উঠাতেন, তারপর কম্পিউটার (আধুনিক ক্যাসেট প্লেয়ার) কে বলতেন- পড়ো, পড়লেই বুঝতে পারবে কী করতে হবে, আর কাজ শেষে ফলাফল একটা ডিসপ্লেতে দেখাতে হবে।
পাঞ্চ কার্ড। ছবির উৎস: উইকিপিডিয়া
তাহলে সব কথার সারসংক্ষেপ হলো-
- প্রথম ভাষা মেশিন কোড, সেটা কম্পিউটার সবসময় জানে। কম্পিউটার সেভাবেই তৈরি। এই ভাষা লিখতে অন্য কোন ভাষা লাগত না, এখনো লাগে না। যেকোন প্রসেসরের স্পেসিফিকেশন দেখে তার জন্যে বাইট বাইট ইন্সট্রাকশন সাজিয়ে সেগুলোকে কম্পিউটারে ছেড়ে দিলেই কাজ হবে।
- মেশিন কোডের বাইরে প্রথম যে ভাষাটি (বা ভাষাগুলো) মানুষ ব্যবহার করত, সেগুলো লেখার কিছু নেই। সেগুলো শুধুমাত্র প্রোগ্রামারদের সাথে কম্পাইলারদের মনের ভাব আদান প্রদানের ভাষা। তার জন্যে একটা ডিকশনারি বানিয়ে নিলেই হলো।
- এখনো সবকিছু এরকম ডিকশনারি ধরেই হয়। শুধুমাত্র কম্পাইলারগন আর আগের মত নেই। আপনি যে ভাষাতেই লেখেন, সেটা দিনশেষে অনুবাদ হয়ে সেই মেশিন কোডই হবে।
- প্রোগ্রামিং ভাষা নিজে কোন প্রোগ্রাম নয়। এটা একটা গ্রামার মাত্র। এখন সেই গ্রামার মেনে আপনার লেখা কোডকে মেশিন কোডে রূপান্তর করার দায়িত্ব অন্য একটি প্রোগ্রাম বা মানুষ যে কেউই করতে পারে।
The post কোনো প্রোগ্রামিং ভাষা অন্য একটি প্রোগ্রামিং ভাষা দিয়ে লিখা হয়ে থাকলে প্রথম প্রোগ্রামিং ভাষাটির উৎপত্তি কিভাবে হয়েছিল? appeared first on Trickbd.com.