JavaScript चे आज जे स्वरूप आहे, तसे ते कधीही बनण्यासाठी तयार नव्हते. १९९५ मध्ये, Brendan Eich यांनी Netscape मध्ये बसून केवळ दहा दिवसांत एक प्रोटोटाइप तयार केला. दहा दिवस. अब्जावधी उपकरणांना सक्षम करण्यासाठी प्रोग्रामिंग लँग्वेज डिझाइन करणे तर दूरच, एक चांगली स्पेसिफिकेशन (specification) लिहिण्यासाठी सुद्धा हे पुरेसे नाहीत. याचा परिणाम असा झाला की, एक अशी भाषा तयार झाली ज्यामध्ये काही विचित्र त्रुटी (quirks) होत्या, ज्यांचा सामना डेव्हलपर्सना तीन दशकांनंतरही करावा लागतो. तरीही, त्याच घाईघाईत केलेल्या निर्मितीचे सॉफ्टवेअर इतिहासातील सर्वात व्यापकपणे वापरले जाणारे रनटाइम (runtime) बनले. हे केवळ ते उत्कृष्ट होते म्हणून यशस्वी झाले नाही, तर वेबला ज्या क्षणी त्याची गरज होती, त्याच वेळी ते ब्राउझरमध्ये उपलब्ध झाले म्हणून ते जिंकले.

घाईघाईत झालेला जन्म

नव्वदच्या दशकातील ब्राउझर युद्धे ही काही मैत्रीपूर्ण स्पर्धा नव्हती. Netscape ला त्यांच्या Navigator ब्राउझरमध्ये Java सोबत चालू शकेल अशी एक हलकी (lightweight) स्क्रिप्टिंग लँग्वेज हवी होती. एक्झिक्युटिव्हना संतुष्ट करण्यासाठी Java सारखी दिसणारी, पण नॉन-प्रोग्रामर्सना वेब पेजेसमध्ये सहज वापरता येईल इतकी सोपी गोष्ट तयार करण्याची जबाबदारी Eich यांच्यावर सोपवण्यात आली होती. डेडलाईन अत्यंत अवघड होती. त्यांनी Mocha तयार केले, ज्याचे नाव नंतर LiveScript ठेवण्यात आले आणि शेवटी Java ची लोकप्रियता वापरून मार्केटिंग करण्यासाठी त्याचे नाव JavaScript ठेवण्यात आले.

त्या घाईघाईत झालेल्या जन्मामुळे कायमस्वरूपी काही त्रुटी राहिल्या. 'Type coercion' मुळे नवीन शिकणाऱ्यांना अजूनही गोंधळ होतो, जेव्हा + ऑपरेटर कोणत्याही पूर्वसूचनेशिवाय स्ट्रिंग्स (strings) आणि नंबर्सना (numbers) एकत्र जोडतो. मूळ अंमलबजावणीतील एका बगमुळे (bug) typeof null हे "object" रिटर्न करते, आणि वेबची रचना बिघडण्याची भीती असल्याने आता कोणीही तो सुधारण्याचे धाडस करत नाही. 'Automatic semicolon insertion' मुळे काही चुका शांतपणे (silent failures) घडतात. var ने घोषित केलेले व्हेरिएबल्स (variables) अनपेक्षित पद्धतीने स्कोप लीक (scope leak) करतात. या केवळ अमूर्त डिझाइनमधील त्रुटी नाहीत. या दैनंदिन समस्या आहेत ज्यांचा थेट संबंध मे १९९५ मधील त्या दोन आठवड्यांच्या धावपळीशी आहे.

एक विचित्र वंशावळ

JavaScript कडे बारकाईने पाहिले तर तुम्हाला त्यात एकत्र जोडलेल्या तीन वेगवेगळ्या वंशावळी दिसतील. याची सिंटॅक्स (syntax) मोठ्या प्रमाणावर Java कडून घेतलेली आहे. कर्ली ब्रेसेस (curly braces), if स्टेटमेंट्स आणि for लूप्स हे C-style भाषांमधून आलेल्या लोकांसाठी परिचित वाटतात. पण पृष्ठभागाखाली, त्याचे वर्तन पूर्णपणे वेगळे आहे.

या भाषेचे खरे संगणकीय हृदय Lisp ची एक बोलीभाषा असलेल्या Scheme कडून आले आहे. JavaScript ला 'first-class functions' याचमुळे मिळाले, ज्याचा अर्थ असा की फंक्शन्सना आर्ग्युमेंट्स (arguments) म्हणून पास करता येते, इतर फंक्शन्समधून रिटर्न करता येते आणि व्हेरिएबल्सना असाइन करता येते. यामुळेच आपल्याला 'closures' मिळाले, ज्यामुळे एखादे इनर फंक्शन (inner function) बाहेरील फंक्शनचे काम संपल्यानंतरही त्याच्या स्कोपमध्ये प्रवेश करू शकते. जर तुम्ही कधीही 'callback' लिहिले असेल किंवा 'event listener' जोडले असेल, तर तुम्ही Scheme कडून वारसागत मिळालेल्या DNA चा वापर केला आहे.

त्यानंतर 'object model' येतो, जो Self कडून आला आहे. कडक क्लासेससह (rigid classes) पारंपारिक इनहेरिटन्स (inheritance) करण्याऐवजी, JavaScript प्रोटोटाइप्स (prototypes) वापरते. एक ऑब्जेक्ट थेट दुसऱ्या ऑब्जेक्टशी लिंक होऊ शकतो आणि प्रॉपर्टी शोधण्याचे काम वरच्या स्तरावर सोपवू शकतो. तुम्ही Object.create वापरून क्लास परिभाषित न करताही ऑब्जेक्ट्स तयार करू शकता आणि साखळी (chains) बनवू शकता. आधुनिक JavaScript मध्ये class कीवर्ड जोडला गेला आहे, परंतु तो प्रामुख्याने या मूळ प्रोटोटाइप यंत्रणेवर आधारित 'syntactic sugar' आहे.

पेज डेकोरेशनपासून गंभीर टूलपर्यंत

सुरुवातीच्या काही वर्षांसाठी, JavaScript छोटी कामे करायची. सर्व्हरकडे फॉर्म सबमिट होण्यापूर्वी ती इनपुट्सची पडताळणी करायची. माऊस होव्हर (mouse hover) केल्यावर ती चित्रे बदलून दाखवायची. ती एक खेळणे (toy) होती, साधन (tool) नाही. ब्राउझरची अंमलबजावणी विसंगत होती, त्यामुळे डेव्हलपर्सना अनेकदा Netscape आणि Internet Explorer साठी वेगवेगळे कोड पाथ (code paths) लिहावे लागत असत.

ECMAScript द्वारे झालेल्या मानकीकरणामुळे (standardization) हा मार्ग बदलला. या स्पेसिफिकेशनमुळे ब्राउझर विक्रेत्यांना अंमलबजावणीसाठी एक समान उद्दिष्ट मिळाले, ज्यामुळे हळूहळू सर्वात मोठ्या विसंगती दूर झाल्या. त्यानंतर Ajax आले.

Ajax (Asynchronous JavaScript and XML चे संक्षिप्त रूप) ही एखादी नवीन तंत्रज्ञान नसून अस्तित्वात असलेल्या भागांना एकत्र जोडणारा एक पॅटर्न होता. याचा महत्त्वाचा घटक XMLHttpRequest ऑब्जेक्ट होता, ज्यामुळे ब्राउझर संपूर्ण पेज रीलोड न करता बॅकग्राउंडमध्ये सर्व्हरकडून डेटा मागू शकत असे. जेव्हा Google ने २००५ मध्ये Maps आणि २००४ मध्ये Gmail लाँच केले, तेव्हा वापरकर्त्यांना अचानक ब्राउझर टॅबमध्ये डेस्कटॉपसारखा प्रतिसाद (responsiveness) अनुभवायला मिळाला. वेब पेजेस आता ॲप्लिकेशन्स बनली. JavaScript आता केवळ सजावट उरली नव्हती, तर ते मुख्य जेवण बनले होते.

वेग आणि महत्त्वाकांक्षा

कच्चा परफॉर्मन्स (Raw performance) हा JavaScript चा सर्वात मोठा विनोद होता. सुरुवातीचे इंटरप्रिटर्स (interpreters) संथ होते. मग Google ने २००८ मध्ये Chrome सोबत V8 इंजिन लाँच केले आणि तो विनोद आता मजेशीर राहिला नाही. V8 ने 'just-in-time compilation' आणले, ज्यामुळे JavaScript ला ओळ दर ओळ (line by line) इंटरप्रेट करण्याऐवजी रनटाइममध्ये थेट मशीन कोडमध्ये रूपांतरित केले जाते. डायनॅमिक ऑब्जेक्ट्सवरही प्रॉपर्टी ॲक्सेस जलद करण्यासाठी त्याने 'hidden classes' आणि 'inline caching' आणले. इतर ब्राउझरनी देखील स्वतःची हाय-स्पीड इंजिन्स आणली आणि ही भाषा अचानक खऱ्या गणनेसाठी (computation) पुरेशी वेगवान झाली.

त्या वेगामुळे पुढील स्थित्यंतर शक्य झाले. रायन डाहल यांनी २००९ मध्ये Node.js लाँच केले, ज्यामध्ये V8 ला ब्राउझरमधून बाहेर काढून एका इव्हेंट-ड्रिव्हन (event-driven), नॉन-ब्लॉकिंग इनपुट-आउटपुट मॉडेलमध्ये गुंफले होते. वेब सर्व्हर्स प्रत्येक येणाऱ्या विनंतीसाठी (request) एक नवीन थ्रेड तयार करत असत, ज्यामुळे प्रचंड कॉनकरन्सीच्या (concurrency) वेळी ते कोलमडून जात. Node.js ने इव्हेंट लूप (event loop) आणि असिंक्रोनस कॉलबॅकचा (asynchronous callbacks) वापर करून एकाच थ्रेडवर हजारो एकाच वेळी येणारे कनेक्शन्स हाताळले. JavaScript क्लायंटच्या पलीकडे जाऊन सर्व्हरवर, बिल्ड टूल्समध्ये आणि अखेरीस इतर सर्व गोष्टींमध्ये पसरले.

सर्वव्यापी भाषा

आता JavaScript अशा ठिकाणी चालते ज्याची कल्पना त्याच्या निर्मात्याने कधी केली नव्हती.

फ्रंटएंडवर (frontend), React आणि Vue आधुनिक इंटरफेस कसे तयार करायचे हे ठरवतात. ब्राउझरला महागड्या फुल-पेज रीलोडची (full-page reload) गरज न पडता, स्टेटमधील (state) बदलांना प्रतिसाद म्हणून कंपोनंट्स अपडेट होतात. बॅकएंडवर (backend), Node.js APIs आणि रिअल-टाइम सेवांना सक्षम करते, तर Bun सारखे नवीन रनटाइम वेगवान पॅकेज मॅनेजमेंट आणि इन-बिल्ट बंडलिंगसह प्रयोग करत आहेत.

React Native JavaScript कोडचे नेटिव्ह प्लॅटफॉर्म व्ह्यूमध्ये (native platform views) रूपांतर करते, ज्यामुळे डेव्हलपर्सना Swift आणि Kotlin मध्ये दोन पूर्णपणे वेगळे कोडबेस न ठेवता iOS आणि Android साठी मोबाईल ॲप्लिकेशन्स तयार करता येतात. Electron डेस्कटॉप सॉफ्टवेअर तयार करण्यासाठी वेब तंत्रज्ञानाला Chromium शेलमध्ये गुंडाळते, आणि याच पद्धतीने Slack आणि Visual Studio Code तुमच्या लॅपटॉपपर्यंत पोहोचतात. ही भाषा क्लाउड फंक्शन्स (cloud functions) आणि एज कम्प्युटिंग वर्कर्समध्ये (edge computing workers) देखील असते, जी डिस्ट्रिब्युटेड नेटवर्कमध्ये एंड-युजरपासून काही मिलीसेकंद अंतरावर लॉजिक कार्यान्वित करते.

विपुलतेचा विरोधाभास

सर्वव्यापी असण्याला एक किंमत मोजावी लागते. हे इकोसिस्टम प्रचंड मोठे आहे आणि त्या आकारामुळे अस्वस्थता निर्माण होते. तुम्ही शेवटचे बिल्ड टूल कॉन्फिगर करण्यापूर्वीच एक नवीन टूल समोर येते. फ्रेमवर्क्सची लोकप्रियता ऋतूंप्रमाणे येत आणि जात असते. तुम्ही JavaScript जग न सोडता जवळजवळ कोणतीही समस्या सोडवू शकता, परंतु त्यासाठी तुम्हाला प्रथम डझनभर अत्यंत विशिष्ट (highly opinionated) उपायांपैकी एक निवडावा लागतो. डिपेंडन्सी ट्रीज (dependency trees) खोलवर आणि नाजूक होत जातात. उदा. ॲरेमध्ये लेफ्ट-पॅडिंग करण्यासाठी वापरले जाणारे एखादे पॅकेज जर रजिस्ट्रीमधून गायब झाले, तर ते हजारो डाउनस्ट्रीम प्रोजेक्ट्सना कोलमडून टाकू शकते.

यापैकी काहीही योगायोग नाही. JavaScript विस्कळीत आहे कारण वेब विस्कळीत आहे. हे बॅकवर्ड सुसंगतता (backward compatibility), घाईने ठरवलेले मानके (standards) आणि परस्परविरोधी अंमलबजावणीच्या हितसंबंधांचे एक सेंद्रिय मिश्रण आहे. तरीही, त्याच विस्कळीतपणामुळे ही भाषा शक्तिशाली आहे. वेब सर्वत्र आहे आणि JavaScript बाय डिफॉल्ट प्रत्येक ब्राउझरमध्ये असल्याने, ते आपल्याकडे असलेल्या युनिव्हर्सल रनटाइमच्या (universal runtime) सर्वात जवळची गोष्ट आहे.

हे केवळ स्क्रिप्टिंग लँग्वेज राहण्यापेक्षा खूप आधीच बदलले आहे. JavaScript आता सॉफ्टवेअरसाठी एक जागतिक प्लॅटफॉर्म आहे, जे दहा दिवसांत तयार झाले होते आणि 'वेबने आधीच्या गोष्टींना तोडू नये' या अदृश्य कराराने बांधलेले आहे. त्याच्या ताकदीसोबतच त्याच्या उणिवा (scars) देखील शिका, आणि मग तुम्ही आधुनिक इंटरनेटचा इतिहास शिकत आहात असे समजा.