_Blog

Post Thumbnail

জাভাস্ক্রিপ্ট একচুয়ালি কী? - জাভাস্ক্রিপ্ট বিহাইন্ড দা সিন

April 25, 2023 by Shahriar Ahmed Shovon

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

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

জাভাস্ক্রিপ্ট একটি হাই-লেভেল, প্রোটাইপ-বেজড অবজেক্ট ওরিয়েন্টেড, মাল্টি-প্যারাডাইম, ইন্টারপ্রেটেড বা জাস্ট ইন টাইম কম্পাইল্ড, ডাইনামিক,** সিঙ্গেল থ্রেডেড**, গার্বেজ কাল্কেটেড প্রোগ্রামিং ল্যাঙ্গুয়েজ সেই সাথে আছে ফার্স্ট-ক্লাস ফাংশন এবং নন-ব্লকিং ইভেন্ট লুপ কনকারেন্সি মডেল [১]

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

হাই-লেভেল

মূলত প্রোগ্রামিং ল্যাঙ্গুয়েজ গুলো তিন ধরনের হয়ে থাকে। লো-লেভেল, মিড-লেভেল এবং হাই-লেভেল ল্যাঙ্গুয়েজ। এই লেভেল হিসেবে ভাগ করা হয়েছে এবস্ট্রাকশন[২] এর উপর নির্ভর করে। হাই-লেভেল ল্যাঙ্গুয়েজে প্রোগ্রাম লেখার সময় আপনাকে কম্পিউটারের রিসোর্স যেমন মেমোরি, প্রসেসর এর সাথে ডিল করতে হবে না আপনি শুধু আপনার কোড লিখলেই সেটা কাজ করবে। কিন্তু লো-লেভেল বা মিড-লেভেল ল্যাঙ্গুয়েজ এ এই মেমোরি, প্রসেসর এর সঙ্গে আপনাকে ডিল করতে হবে। আর যেহেতু জাভাস্ক্রিপ্ট হাই-লেভেল ল্যাঙ্গুয়েজ তাই এখানেও প্রোগ্রাম লেখার সময় আপনাকে মেমোরি, প্রসেসর বা অন্যান্য রিসোর্স নিয়ে ভাবতে না।

প্রোটোটাইপ বেজড

জাভাস্ক্রিপ্টের প্রিমিটিভ ভ্যারিয়েবল গুলো বাদ দিয়ে সবকিছুই মূলত একেক্টা অবজেক্ট। আর জাভাস্ক্রিপ্টের কোন ক্লাস কে ইনহেরিট করার সময় এর প্রোটোটাইপকেই মূলত ইনহেরিট করা হয় যার কারণে একে প্রোটোটাইপ বেজড বলা হয়। অবজেক্ট ওরিয়েন্টেড কি এইটা বোঝাতে হলে সম্পুর্ন একটা সিরিজ লেগে যাবে। সময় হলে আমরা এই বিষয়ে বিস্তারিত জেনে নেব।

মাল্টি-প্যারাডাইম

প্যারাডাইম হচ্ছে দৃষ্টিভঙ্গি তবে এখানে প্যারাডাইম মানে হচ্ছে কোড স্ট্রাকচার বা কোড স্টাইল। মূলত ৩ ধরনের কোড প্যারাডাইম দেখা যায়।

১। প্রসিডিউরাল - প্রসিডিউরাল মানে সিম্পল এক্সপ্রেশন আছে আবার মাঝে মধ্যে কিছু ফাংশন ও আছে এরকম কোড স্ট্রাকচার।

২। ফাংশনাল - ফাংশনাল কোড স্ট্রকাচারে সবকিছুকেই ফাংশন হিসেবে লেখা হয়।

৩।** অবজেক্ট ওরিয়েন্টেড** - অবজেক্ট ওরিয়েন্টেড স্ট্রাকচারে মূলত ক্লাস-অবজেক্ট বেজড কোড লেখা হয়। এবং এর ক্লাসের মধ্যে ফাংশন গুলো থাকে মেথড হিসেবে।

অনেক ল্যাঙ্গুয়েজ আছে শুধু ফাংশনাল এবং প্রসিডিউরাল আবার অনেক ল্যাঙ্গুয়েজ শুধু অবজেক্ট ওরিয়েন্টেড। তবে জাভাস্ক্রিপ্ট মাল্টি অর্থাৎ একাধিক প্যারাডাইম সাপোর্ট করে। জাভাস্ক্রিপ্ট প্রসিডিউরাল, ফাংশনাল এবং ওওপি ৩ ধরনের স্ট্রাকচার-ই সাপোর্ট করে।

ইন্টারপ্রেটেড বা জাস্ট ইন টাইম কম্পাইল

আমরা প্রায় সবাই একটা কথা জানি যে কম্পিউটার শুধু ০ এবং ১ অর্থাৎ মেশিন কোড বুঝতে পারে। আর আমাদের সোর্স কোড কে মেশিন কোডে কনভার্ট করার নাম ই কম্পাইলেশন। আপনার লেখা সোর্স কোড প্রথমে পার্সিং হবে অর্থাৎ এবস্ট্রাকশন ট্রি স্ট্রাকচার নামে একটা ডেটা স্ট্রাকচারে টোকেন হিসেবে আপনার সোর্স কোড গুলো রাখা হবে এবং এরপরে সেই পার্সড স্ট্রাকচার কে কম্পাইলার এর মাধ্যমে মেশিন কোড এ কম্পাইল করা হয়। এই প্রসেসটাই হচ্ছে কম্পাইলেশন। [৩]

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

ডাইনামিক

যদি কখনো সি, সি++ এরকম ল্যাঙ্গুয়েজে কোড করে থাকেন তাহলে দেখবেন কোন কিছু ডিক্লেয়ার যেমন ভ্যারিয়েবল, অবজেক্ট, ফাংশন ইত্যাদির ক্ষেত্রে ভ্যারিয়েবল টাইপ বলে দেয়া দরকার হয়। কিন্তু জাভাস্ক্রিপ্টে সেটার প্রয়োজন হয়না। জাভাস্ক্রিপ্ট এসাইন্ড ভ্যালু দেখেই টাইপ নিজে নিজেই বুঝে ফেলে। আবার রিএসাইন করার মাধ্যমে সেই টাইপ পাল্টেও ফেলা যায়। এইটাই মূলত ডাইনামিক টাইপড ল্যাঙ্গুয়েজ এর সুবিধা। তবে এর অসুবিধাও আছে। যেমন কোড এর বাগ থাকার সম্ভাবনা বৃদ্ধি পায় যেটা স্ট্রিক্ট-টাইপড অর্থাৎ টাইপ বলে দেয়া লাগে এমন ল্যাঙ্গুয়েজে কম হয়। অবশ্য টাইপস্ক্রিপ্ট এর মাধ্যমে আপনি জাভাস্ক্রিপ্টকে স্ট্রিক্ট-টাইপড হিসেবে ব্যবহার করতে পারবেন।

সিঙ্গেল থ্রেডেড

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

গার্বেজ কালেক্টেড

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

ফার্স্ট-ক্লাস ফাংশন

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

ইভেন্ট লুপ

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

নন-ব্লকিং

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

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

রেফারেন্সঃ

[১] “The Complete JavaScript Course 2021 From Zero to Expert!” by Jonas ইউডেমির এই কোর্স থেকে মূলত সংজ্ঞাটা নেয়া।

[২] এবস্ট্রাকশন হচ্ছে প্রোগ্রামিং ল্যাঙ্গুয়েজ কর্তৃক আপনার কম্পিউটার এর রিসোর্স যেমন মেমোরি ( র‍্যাম, স্টোরেজ না ), প্রসেসর ইত্যাদির উপর অটোমেটেড দখল। অর্থাৎ আপনি যদি কোন একটা প্রোগ্রামিং ল্যাঙ্গুয়েজ দিয়ে কম্পিউটারের মেমোরি, প্রসেসর সবকিছু নিয়ন্ত্রণ না করেই একটা প্রোগ্রাম তৈরি করে ফেলতে পারেন তাহলে সেটার এবস্ট্রাকশন ভ্যালু অনেক বেশি। আর যদি প্রোগ্রাম লিখতে গিয়ে এই রিসোর্স গুলো নিজের মতো করে ব্যবহার করতে হয় যেমন একটা ভ্যারিয়েবলের জন্য মেমোরি এলোকেট করতে হয় তাহলে সেই প্রোগ্রামিং ল্যাঙ্গুয়েজের এবস্ট্রাকশন ভ্যালু কম। এই এবস্ট্রাকশন একদম ০’র ঘরে হলে সেটা লো-লেভেল ল্যাঙ্গুয়েজ , ১ অর্থাৎ এবস্ট্রাকশন সুবিধা অনেক বেশি হলে হাই-লেভেল ল্যাঙ্গুয়েজ। আর মাঝামাঝি হলে মিড-লেভেল। এই যেমন সি, সি++ এদের কে বলা যায় মিড-লেভেল ল্যাঙ্গুয়েজ তবে অনেকেই লো-লেভেল ল্যাঙ্গুয়েজ ও বলে থাকে। কারণ, সি বা সি++ এ এবস্ট্রাকশন সুবিধা যেমন ম্যাক্রো, ক্লাস ইত্যাদি আছে আবার সেই সাথে সব ধরনের এবস্ট্রকাকশন সুবিধা যেমন মেমোরি নিয়ে না ডিল করেই ভ্যারিয়েবল, অ্যারে তৈরি করার মতো কাজ গুলো সি, সি++ এ করা যায়না। যার ফলে সি, সি++ কে না লো-লেভেল বলা যায় না বলা যায় হাই-লেভেল। তাই আমি মিড-লেভেল বলতেই পছন্দ করি।

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