JavaScript কখনোই বর্তমানের মতো হওয়ার জন্য তৈরি করা হয়নি। ১৯৯৫ সালে, Brendan Eich Netscape-এ বসে মাত্র দশ দিনে একটি প্রোটোটাইপ তৈরি করেছিলেন। দশ দিন। একটি ভালো স্পেসিফিকেশন লেখার জন্য এটি খুব সামান্য সময়, কোটি কোটি ডিভাইসে চালানোর মতো একটি প্রোগ্রামিং ল্যাঙ্গুয়েজ ডিজাইন করা তো দূরের কথা। এর ফলে এমন একটি ভাষা তৈরি হয়েছিল যার quirks বা অদ্ভুত বৈশিষ্ট্যগুলো প্রায় তিন দশক পরেও ডেভেলপারদের সমস্যায় ফেলে। তবুও সেই তাড়াহুড়ো করে তৈরি করা ভাষাটি সফটওয়্যার ইতিহাসের সবচেয়ে বেশি ব্যবহৃত রানটাইমে পরিণত হয়েছে। এটি চমৎকার হওয়ার কারণে নয়, বরং ওয়েব যখন এটি প্রয়োজন ছিল ঠিক তখনই ব্রাউজারের ভেতরে পৌঁছে গিয়েছিল বলে জয়ী হয়েছে।
তাড়াহুড়ো করে জন্ম
নব্বইয়ের দশকের মাঝামাঝি সময়ের ব্রাউজার যুদ্ধগুলো মোটেও বন্ধুত্বপূর্ণ প্রতিযোগিতা ছিল না। Netscape-এর তাদের Navigator ব্রাউজারে Java-র পাশাপাশি চালানোর জন্য একটি হালকা ওজনের স্ক্রিপ্টিং ল্যাঙ্গুয়েজ প্রয়োজন ছিল। Eich-কে এমন কিছু তৈরি করার দায়িত্ব দেওয়া হয়েছিল যা দেখতে অনেকটা Java-র মতো হবে যাতে নির্বাহীরা সন্তুষ্ট হন, কিন্তু তা সাধারণ নন-প্রোগ্রামারদের জন্য ওয়েব পেজে ব্যবহার করা সহজ হবে। সময়সীমা ছিল অবাস্তব। তিনি Mocha তৈরি করেন, যা শীঘ্রই LiveScript নামে পরিচিত হয় এবং অবশেষে Java-র জনপ্রিয়তা কাজে লাগানোর জন্য একটি মার্কেটিং কৌশল হিসেবে JavaScript নাম দেওয়া হয়।
সেই তাড়াহুড়ো করে জন্ম নেওয়া প্রক্রিয়াটি স্থায়ী কিছু ক্ষত রেখে গেছে। Type coercion এখনও নতুনদের বিভ্রান্ত করে যখন plus operator কোনো সতর্কতা ছাড়াই string এবং number-কে যুক্ত করে ফেলে। মূল ইমপ্লিমেন্টেশনে একটি বাগের কারণে typeof null রিটার্ন করে "object", যা ওয়েব ভেঙে যাওয়ার ভয়ে কেউ ঠিক করার সাহস পায় না। Automatic semicolon insertion নিঃশব্দে ত্রুটি (silent failures) ঘটায়। var দিয়ে ডিক্লেয়ার করা ভেরিয়েবলগুলো এমনভাবে স্কোপ লিক করে যা অনেকটা অনিশ্চিত মনে হয়। এগুলো কোনো বিমূর্ত ডিজাইনের ত্রুটি নয়। এগুলো হলো প্রতিদিনের বিরক্তি যা সরাসরি ১৯৯৫ সালের মে মাসের সেই দুই সপ্তাহের দৌড়ঝাঁপের সাথে যুক্ত।
এক অদ্ভুত বংশলতিকা
JavaScript-কে গভীরভাবে লক্ষ্য করলে আপনি তিনটি ভিন্ন বংশলতিকার সংমিশ্রণ দেখতে পাবেন। এর সিনট্যাক্স অনেকটা Java থেকে ধার করা। কার্লি ব্রেসেস (curly braces), if স্টেটমেন্ট এবং for লুপ যারা C-style ল্যাঙ্গুয়েজ থেকে আসছেন তাদের কাছে পরিচিত মনে হবে। কিন্তু এর গভীরে আচরণটি সম্পূর্ণ ভিন্ন।
এই ল্যাঙ্গুয়েজের আসল কম্পিউটেশনাল প্রাণ来自于 Scheme থেকে, যা Lisp-এর একটি ডায়ালেক্ট। এখান থেকেই JavaScript first-class functions পেয়েছে, যার অর্থ হলো ফাংশনগুলোকে আর্গুমেন্ট হিসেবে পাস করা যায়, অন্য ফাংশন থেকে রিটার্ন করা যায় এবং ভেরিয়েবলে অ্যাসাইন করা যায়। এটি আমাদের closures প্রদান করেছে, যা একটি ইননার ফাংশনকে তার আউটার ফাংশন শেষ হওয়ার পরেও সেই আউটার ফাংশনের স্কোপ অ্যাক্সেস করার অনুমতি দেয়। আপনি যদি কখনও কোনো callback লিখে থাকেন বা কোনো event listener যুক্ত করে থাকেন, তবে আপনি Scheme থেকে উত্তরাধিকারসূত্রে পাওয়া DNA ব্যবহার করেছেন।
এরপর আছে অবজেক্ট মডেল, যা Self থেকে এসেছে। কঠোর ক্লাসের মাধ্যমে ক্লাসিক্যাল ইনহেরিটেন্সের পরিবর্তে JavaScript prototypes ব্যবহার করে। একটি অবজেক্ট সরাসরি অন্য একটি অবজেক্টের সাথে যুক্ত হতে পারে এবং প্রপার্টি লুকআপের কাজ উপরের দিকে পাঠিয়ে দিতে পারে। আপনি Object.create ব্যবহার করে একটি অবজেক্ট তৈরি করতে পারেন এবং কোনো ক্লাস সংজ্ঞায়িত না করেই চেইন তৈরি করতে পারেন। আধুনিক JavaScript-এ class কিওয়ার্ড যোগ করা হয়েছে, তবে এটি মূলত এই অন্তর্নিহিত prototype মেকানিজমের ওপর একটি syntactic sugar মাত্র।
পেজ সাজানো থেকে সিরিয়াস টুল হিসেবে বিবর্তন
প্রথম কয়েক বছর JavaScript ছোটখাটো কাজ করত। এটি সার্ভারে সাবমিট করার আগে ফর্ম ইনপুট যাচাই করত। মাউস হোভার করলে ছবি পরিবর্তন করত। এটি ছিল একটি খেলনা, কোনো টুল নয়। ব্রাউজার ইমপ্লিমেন্টেশনগুলো অসামঞ্জস্যপূর্ণ ছিল, তাই ডেভেলপাররা প্রায়ই Netscape এবং Internet Explorer-এর জন্য আলাদা আলাদা কোড লিখতেন।
ECMAScript-এর মাধ্যমে মানককরণ (standardization) এই গতিপথ বদলে দেয়। এই স্পেসিফিকেশন ব্রাউজার ভেন্ডরদের একটি সাধারণ লক্ষ্য প্রদান করেছিল, যা ধীরে ধীরে সবচেয়ে খারাপ অসামঞ্জস্যতাগুলো দূর করে দেয়। এরপর এলো Ajax।
Ajax, যা Asynchronous JavaScript and XML-এর সংক্ষিপ্ত রূপ, এটি কোনো একক নতুন প্রযুক্তি ছিল না বরং এটি ছিল বিদ্যমান অংশগুলোর সমন্বয়ে গঠিত একটি প্যাটার্ন। এর মূল উপাদান ছিল XMLHttpRequest অবজেক্ট, যা ব্রাউজারকে পুরো পেজ রিলোড না করেই ব্যাকগ্রাউন্ডে সার্ভার থেকে ডেটা চাওয়ার সুযোগ দিত। যখন Google ২০০৫ সালে Maps এবং ২০০৪ সালে Gmail লঞ্চ করল, ব্যবহারকারীরা হঠাৎ ব্রাউজার ট্যাবের ভেতরে ডেস্কটপ-এর মতো রেসপন্সিভনেস অনুভব করতে শুরু করল। ওয়েব পেজগুলো অ্যাপ্লিকেশন হয়ে উঠল। JavaScript আর কেবল সাজসজ্জার উপকরণ রইল না; এটি হয়ে উঠল মূল খাবার।
গতি এবং উচ্চাকাঙ্ক্ষা
পারফরম্যান্স বা গতি ছিল একসময় JavaScript-এর সবচেয়ে বড় রসিকতার বিষয়। শুরুর দিকের ইন্টারপ্রেটারগুলো ছিল ধীরগতির। তারপর Google ২০০৮ সালে Chrome-এর সাথে V8 ইঞ্জিন রিলিজ করে এবং সেই রসিকতা আর মজার রইল না। V8 just-in-time compilation প্রবর্তন করে, যা JavaScript-কে লাইন বাই লাইন ইন্টারপ্রেট করার পরিবর্তে রানটাইমে মেশিন কোডে রূপান্তর করে। এটি ডায়নামিক অবজেক্টের ক্ষেত্রেও প্রপার্টি অ্যাক্সেস দ্রুত করতে hidden classes এবং inline caching প্রবর্তন করে। অন্যান্য ব্রাউজারগুলো তাদের নিজস্ব হাই-স্পিড ইঞ্জিন দিয়ে এর জবাব দেয় এবং ভাষাটি হঠাৎ করেই প্রকৃত কম্পিউটেশনের জন্য যথেষ্ট দ্রুত হয়ে ওঠে।
সেই গতি পরবর্তী পরিবর্তনের পথ প্রশস্ত করেছিল। Ryan Dahl ২০০৯ সালে Node.js রিলিজ করেন, যেখানে তিনি V8-কে ব্রাউজার থেকে আলাদা করে একটি event-driven, non-blocking input-output মডেলে আবদ্ধ করেন। ওয়েব সার্ভারগুলো প্রতিটি ইনকামিং রিকোয়েস্টের জন্য একটি নতুন থ্রেড তৈরি করত, যা অতিরিক্ত কনকারেন্সির চাপে ভেঙে পড়ত। Node.js একটি event loop এবং asynchronous callbacks ব্যবহার করে একটি মাত্র থ্রেডে হাজার হাজার সমসাময়িক কানেকশন সামলাতে সক্ষম হয়। JavaScript ক্লায়েন্ট থেকে সার্ভার, বিল্ড টুলস এবং শেষ পর্যন্ত সবকিছুর মধ্যে ছড়িয়ে পড়ে।
সর্বব্যাপী ভাষা
এখন JavaScript এমন সব জায়গায় চলে যেখানে এর স্রষ্টা কখনও কল্পনাও করেননি।
ফ্রন্টএন্ডে, React এবং Vue আধুনিক ইন্টারফেস তৈরির ধরন বদলে দিয়েছে। ব্রাউজারে ব্যয়বহুল ফুল-পেজ রিলোড ছাড়াই স্টেট পরিবর্তনের প্রতিক্রিয়ায় কম্পোনেন্টগুলো আপডেট হয়। ব্যাকএন্ডে, Node.js API এবং রিয়েল-টাইম সার্ভিসগুলোকে চালিত করে, অন্যদিকে Bun-এর মতো নতুন রানটাইমগুলো দ্রুত প্যাকেজ ম্যানেজমেন্ট এবং বিল্ট-ইন বান্ডলিং নিয়ে পরীক্ষা-নিরীক্ষা করছে।
React Native JavaScript কোডকে নেটিভ প্ল্যাটফর্ম ভিউতে রূপান্তর করে, যা ডেভেলপারদের Swift এবং Kotlin-এ দুটি সম্পূর্ণ আলাদা কোডবেস বজায় না রেখেই iOS এবং Android-এর জন্য মোবাইল অ্যাপ্লিকেশন তৈরি করতে সাহায্য করে। Electron ডেস্কটপ সফটওয়্যার তৈরির জন্য ওয়েব প্রযুক্তিগুলোকে একটি Chromium শেলের মধ্যে আবদ্ধ করে, আর এভাবেই Slack এবং Visual Studio Code আপনার ল্যাপটপে পৌঁছে। এমনকি এই ভাষাটি ক্লাউড ফাংশন এবং এজ কম্পিউটিং ওয়ার্কারের মধ্যেও অবস্থান করে, যা ডিস্ট্রিবিউটেড নেটওয়ার্কের মাধ্যমে এন্ড-ইউজারের মাত্র কয়েক মিলিসেকেন্ডের মধ্যে লজিক কার্যকর করতে পারে।
প্রাচুর্যের প্যারাডক্স
সর্বব্যাপী হওয়ার একটি মূল্য আছে। এর ইকোসিস্টেম বিশাল, আর এই বিশালতা উদ্বেগের সৃষ্টি করে। আপনি শেষটির কনফিগারেশন শেষ করার আগেই একটি নতুন বিল্ড টুল চলে আসে। ফ্রেমওয়ার্কগুলোর জনপ্রিয়তা ঋতু পরিবর্তনের মতো দ্রুত ওঠানামা করে। আপনি JavaScript জগত না ছেড়েই প্রায় যেকোনো সমস্যার সমাধান করতে পারেন, কিন্তু তার আগে আপনাকে ডজনখানেক highly opinionated সমাধানের মধ্য থেকে একটি বেছে নিতে হবে। ডিপেন্ডেন্সি ট্রিগুলো অনেক গভীর এবং ভঙ্গুর হয়ে ওঠে। অ্যারে লেফট-প্যাডিং করার একটি প্যাকেজ যদি রেজিস্ট্রি থেকে হারিয়ে যায়, তবে তা হাজার হাজার ডাউনস্ট্রিম প্রজেক্টকে অচল করে দিতে পারে।
এর কোনোটিই আকস্মিক নয়। JavaScript অগোছালো কারণ ওয়েব নিজেই অগোছালো। এটি ব্যাকওয়ার্ড কম্প্যাটিবিলিটি, তাড়াহুড়ো করে তৈরি করা স্ট্যান্ডার্ড এবং প্রতিযোগিতামূলক ইমপ্লিমেন্টেশন ইন্টারেস্টের একটি জৈব স্তরের মতো। তবুও সেই অগোছালো অবস্থাই এই ভাষাকে শক্তিশালী করে তুলেছে। ওয়েব সর্বত্র বিদ্যমান, আর ডিফল্টভাবে JavaScript প্রতিটি ব্রাউজারের ভেতরে থাকায় এটি একটি ইউনিভার্সাল রানটাইমের সবচেয়ে কাছাকাছি জিনিস।
এটি অনেক আগেই কেবল একটি স্ক্রিপ্টিং ভাষা হওয়া থেকে বেরিয়ে এসেছে। JavaScript এখন সফটওয়্যারের জন্য একটি বৈশ্বিক প্ল্যাটফর্ম, যা মাত্র দশ দিনে তৈরি হয়েছিল এবং একটি অদৃশ্য চুক্তিতে আবদ্ধ—যেটি হলো ওয়েব যেন আগের তৈরি করা জিনিসগুলোকে ভেঙে না ফেলে। এর শক্তির পাশাপাশি এর ক্ষতগুলোকেও জানুন, তাহলেই আপনি আধুনিক ইন্টারনেটের ইতিহাস শিখতে পারবেন।
