JavaScript کو کبھی وہ نہیں بننا تھا جو وہ آج ہے۔ 1995 میں، Brendan Eich نے Netscape میں بیٹھ کر دس دنوں میں ایک پروٹو ٹائپ تیار کیا۔ دس دن۔ یہ ایک مناسب specification لکھنے کے لیے بمشکل کافی وقت ہے، اربوں آلات کو طاقت دینے کے لیے ڈیزائن کی گئی ایک پروگرامنگ لینگویج کی بات تو دور کی ہے۔ اس کا نتیجہ ایک ایسی زبان کی صورت میں نکلا جس میں ایسی عجیب و غریب خصوصیات (quirks) تھیں جن سے ڈویلپرز آج تقریباً تین دہائیوں بعد بھی الجھ جاتے ہیں۔ پھر بھی وہی جلد بازی میں بنائی گئی تخلیق سافٹ ویئر کی تاریخ میں سب سے زیادہ استعمال ہونے والا runtime بن گئی۔ یہ اس لیے نہیں جیتی کہ یہ پروقار تھی، بلکہ اس لیے جیتی کیونکہ یہ عین اسی وقت براؤزر کے اندر فراہم کی گئی جب ویب کو اس کی ضرورت تھی۔

جلد بازی میں پیدائش

نوے کی دہائی کے وسط میں براؤزر کی جنگیں کوئی دوستانہ مقابلہ نہیں تھیں۔ Netscape کو ایک ہلکی پھلکی scripting language کی ضرورت تھی جو اس کے Navigator براؤزر میں Java کے ساتھ چل سکے۔ Eich کو ایسی چیز بنانے کا کام سونپا گیا تھا جو منتظمین (executives) کو مطمئن کرنے کے لیے کافی حد تک Java جیسی نظر آئے، لیکن غیر پروگرامرز کے لیے ویب صفحات میں پیسٹ کرنے کے لیے کافی سادہ ہو۔ ڈیڈ لائن غیر معقول تھی۔ انہوں نے Mocha تیار کیا، جسے جلد ہی LiveScript کا نام دیا گیا، اور آخر کار Java کی مقبولیت کا فائدہ اٹھانے کے لیے مارکیٹنگ کے طور پر JavaScript کا نام رکھا گیا۔

اس جلد بازی میں پیدائش نے مستقل نشانات چھوڑ دیے۔ Type coercion اب بھی نئے آنے والوں کو الجھن میں ڈال دیتا ہے جب plus operator بغیر کسی وارننگ کے strings اور numbers کو آپس میں جوڑ دیتا ہے۔ typeof null کی واپسی "object" ہے کیونکہ اصل نفاذ (implementation) میں ایک بگ (bug) تھا جسے ویب کو توڑنے کے خوف سے کوئی ٹھیک کرنے کی ہمت نہیں کرتا۔ Automatic semicolon insertion خاموش ناکامیوں کا باعث بنتا ہے۔ var کے ساتھ اعلان کردہ ویری ایبلز (variables) اس طرح سے scope میں لیک ہوتے ہیں جو غیر متوقع محسوس ہوتے ہیں۔ یہ محض تجریدی ڈیزائن کے نقائص نہیں ہیں۔ یہ روزانہ کی وہ پریشانیاں ہیں جن کا سراغ براہ راست مئی 1995 کے دو ہفتوں کے اس تیز رفتار کام (sprint) تک جاتا ہے۔

ایک عجیب و غریب نسب

اگر آپ JavaScript کو غور سے دیکھیں تو آپ کو تین الگ الگ نسلیں ایک ساتھ جڑی ہوئی نظر آئیں گی۔ اس کا syntax کافی حد تک Java سے ادھار لیا گیا ہے۔ Curly braces، if statements، اور for loops ان لوگوں کے لیے ایک مانوس شکل فراہم کرتے ہیں جو C-style زبانوں سے آتے ہیں۔ لیکن اس سطح کے نیچے، اس کا طرزِ عمل (behavior) بالکل مختلف ہے۔

زبان کا اصل کمپیوٹیشنل دل Scheme سے آتا ہے، جو Lisp کا ایک لہجہ ہے۔ یہ وہ جگہ ہے جہاں سے JavaScript نے first-class functions حاصل کیے، جس کا مطلب ہے کہ functions کو arguments کے طور پر پاس کیا جا سکتا ہے، دوسرے functions سے واپس کیا جا سکتا ہے، اور variables کو تفویض (assign) کیا جا سکتا ہے۔ اس نے ہمیں closures بھی دیے، جو ایک اندرونی function کو بیرونی function کے ختم ہونے کے بعد بھی اس کے scope تک رسائی کی اجازت دیتے ہیں۔ اگر آپ نے کبھی callback لکھا ہے یا event listener منسلک کیا ہے، تو آپ نے Scheme سے ورثے میں ملی ہوئی DNA کا استعمال کیا ہے۔

پھر object model ہے، جو Self سے آتا ہے۔ سخت classes کے ساتھ کلاسیکل وراثت (inheritance) کے بجائے، JavaScript prototypes استعمال کرتا ہے۔ ایک object براہ راست دوسرے object سے منسلک ہو سکتا ہے اور property lookups کو اوپر کی طرف منتقل کر سکتا ہے۔ آپ Object.create کے ساتھ ایک object بنا سکتے ہیں اور بغیر کسی class کی تعریف کیے chains بنا سکتے ہیں۔ جدید JavaScript نے class keyword شامل کیا ہے، لیکن یہ زیادہ تر اس بنیادی prototype مشینری پر ایک syntactic sugar ہے۔

صفحہ کی سجاوٹ سے ایک سنجیدہ ٹول تک

اپنے پہلے چند سالوں کے لیے، JavaScript نے چھوٹے چھوٹے کام کیے۔ یہ سرور تک پہنچنے سے پہلے form inputs کی تصدیق کرتا تھا۔ یہ ماؤس ہوور (mouse hover) پر تصاویر کو تبدیل کرتا تھا۔ یہ ایک کھلونا تھا، کوئی ٹول نہیں۔ براؤزر کے نفاذ (implementations) غیر مستقل تھے، اس لیے ڈویلپرز اکثر Netscape اور Internet Explorer کے لیے مختلف کوڈ راستے لکھتے تھے۔

ECMAScript کے ذریعے معیار سازی (standardization) نے اس سمت کو بدل دیا۔ اس specification نے براؤزر بنانے والوں کو نفاذ کے لیے ایک مشترکہ ہدف دیا، جس نے آہستہ آہستہ بدترین عدم مطابقتوں (incompatibilities) کو ختم کر دیا۔ پھر Ajax آیا۔

Ajax، جو Asynchronous JavaScript and XML کا مخفف ہے، کوئی ایک نئی ٹیکنالوجی نہیں تھی بلکہ ایک پیٹرن تھا جس نے موجودہ حصوں کو یکجا کیا۔ اہم جزو XMLHttpRequest object تھا، جس نے براؤزر کو پورے صفحے کو دوبارہ لوڈ کیے بغیر پس منظر میں ڈیٹا کے لیے سرور سے پوچھنے کی اجازت دی۔ جب Google نے 2005 میں Maps اور 2004 میں Gmail لانچ کیا، تو صارفین نے اچانک براؤزر ٹیب کے اندر ڈیسک ٹاپ جیسی تیزی کا تجربہ کیا۔ ویب صفحات ایپلی کیشنز بن گئے۔ JavaScript اب محض سجاوٹ نہیں رہا تھا۔ یہ اصل کھانا بن چکا تھا۔

رفتار اور عزائم

خام کارکردگی (Raw performance) کبھی JavaScript کا سب سے بڑا مذاق ہوا کرتی تھی۔ ابتدائی interpreters سست تھے۔ پھر Google نے 2008 میں Chrome کے ساتھ V8 engine جاری کیا، اور مذاق ختم ہو گیا۔ V8 نے just-in-time compilation متعارف کرائی، جو JavaScript کو لائن بہ لائن انٹرپریٹ کرنے کے بجائے runtime پر مشین کوڈ میں تبدیل کرتی ہے۔ اس نے dynamic objects پر بھی property access کو تیز بنانے کے لیے hidden classes اور inline caching متعارف کرائی۔ دیگر براؤزرز نے اپنے تیز رفتار انجنوں کے ساتھ جواب دیا، اور زبان اچانک حقیقی کمپیوٹیشن کے لیے کافی تیز ہو گئی۔

اس رفتار نے اگلے بڑے بدلاؤ کی راہ ہموار کی۔ ریان ڈاہل نے 2009 میں Node.js ریلیز کیا، جس میں V8 کو براؤزر سے الگ کر کے اسے ایک ایونٹ-ڈریون (event-driven) اور نان بلاکنگ ان پٹ-آؤٹ پٹ ماڈل میں ڈھال دیا گیا۔ ویب سرورز ہر آنے والی درخواست کے لیے ایک نیا تھریڈ (thread) شروع کرتے تھے، جو زیادہ کنکرنسی (concurrency) کی صورت میں ناکام ہو جاتا تھا۔ Node.js نے ایونٹ لوپ (event loop) اور اسینکرونس کال بیکس (asynchronous callbacks) کا استعمال کرتے ہوئے ایک ہی تھریڈ پر ہزاروں بیک وقت کنکشنز کو سنبھالا۔ JavaScript کلائنٹ سے نکل کر سرور، بلڈ ٹولز، اور آخر کار ہر چیز کا حصہ بن گئی۔

ہر جگہ موجود زبان

اب JavaScript ایسی جگہوں پر چلتی ہے جہاں اس کے خالق نے کبھی سوچا بھی نہ تھا۔

فرنٹ اینڈ (frontend) پر، React اور Vue جدید انٹرفیس کی تشکیل میں اہم کردار ادا کرتے ہیں۔ اسٹیٹ (state) میں تبدیلی کے جواب میں کمپوننٹس اپ ڈیٹ ہو جاتے ہیں، جس کے لیے براؤزر کو پورے صفحے کو دوبارہ لوڈ کرنے کی ضرورت نہیں پڑتی۔ بیک اینڈ (backend) پر، Node.js APIs اور ریئل ٹائم سروسز کو طاقت فراہم کرتا ہے، جبکہ Bun جیسے نئے رن ٹائم (runtimes) تیز رفتار پیکیج مینجمنٹ اور بلٹ ان بنڈلنگ (built-in bundling) کے ساتھ تجربات کر رہے ہیں۔

React Native JavaScript کوڈ کو نیٹیو پلیٹ فارم ویوز (native platform views) میں تبدیل کر دیتا ہے، جس سے ٹیموں کے لیے Swift اور Kotlin میں دو الگ الگ کوڈ بیس برقرار رکھے بغیر iOS اور Android کے لیے موبائل ایپلی کیشنز تیار کرنا ممکن ہو جاتا ہے۔ Electron ڈیسک ٹاپ سافٹ ویئر بنانے کے لیے ویب ٹیکنالوجیز کو Chromium شیل کے اندر لپیٹ دیتا ہے، اور اسی طرح Slack اور Visual Studio Code آپ کے لیپ ٹاپ تک پہنچتے ہیں۔ یہ زبان کلاؤڈ فنکشنز اور ایج کمپیوٹنگ ورکرز (edge computing workers) کے اندر بھی موجود ہے، جو تقسیم شدہ نیٹ ورکس پر اینڈ یوزر سے محض چند ملی سیکنڈز کے فاصلے پر لاجک (logic) کو نافذ کرتی ہے۔

کثرت کا تضاد

ہر جگہ موجودگی کی ایک قیمت ہوتی ہے۔ اس کا ایکو سسٹم (ecosystem) بہت بڑا ہے، اور یہ وسعت بے چینی کا باعث بنتی ہے۔ اس سے پہلے کہ آپ پچھلے بلڈ ٹول کی کنفیگریشن مکمل کریں، ایک نیا بلڈ ٹول سامنے آ جاتا ہے۔ فریم ورکس کی مقبولیت کا اتار چڑھاؤ ایسا ہے جیسے موسم بدل رہے ہوں۔ آپ JavaScript کی دنیا چھوڑے بغیر تقریباً ہر مسئلہ حل کر سکتے ہیں، لیکن پہلے آپ کو درجنوں مختلف اور مخصوص حلوں میں سے کسی ایک کا انتخاب کرنا پڑتا ہے۔ ڈیپینڈنسی ٹریز (dependency trees) گہری اور نازک ہوتی جاتی ہیں۔ ایریز (arrays) کو لیفٹ پیڈنگ (left-padding) دینے والا ایک پیکیج جب رجسٹری سے غائب ہوتا ہے، تو وہ ہزاروں دوسرے پروجیکٹس کو تباہ کر سکتا ہے۔

یہ سب اتفاقی نہیں ہے۔ JavaScript اس لیے الجھی ہوئی ہے کیونکہ ویب بھی الجھی ہوئی ہے۔ یہ بیک ورڈ کمپیٹیبلٹی (backward compatibility)، جلد بازی میں بنائے گئے معیار، اور باہم مقابلہ کرنے والے مفادات کا ایک قدرتی مجموعہ ہے۔ پھر بھی یہی الجھن اس زبان کو طاقتور بناتی ہے۔ ویب ہر جگہ ہے، اور چونکہ JavaScript ڈیفالٹ کے طور پر ہر براؤزر کے اندر موجود ہے، اس لیے یہ ایک یونیورسل رن ٹائم (universal runtime) کے سب سے قریب ترین چیز ہے۔

یہ بہت عرصہ پہلے محض ایک اسکرپٹنگ زبان رہنا چھوڑ چکی ہے۔ JavaScript اب سافٹ ویئر کے لیے ایک عالمی پلیٹ فارم ہے، جو دس دنوں میں بنائی گئی تھی، اور اس کا استحکام اس غیر مرئی معاہدے پر قائم ہے کہ ویب کو ان چیزوں کو نہیں توڑنا چاہیے جو اس سے پہلے موجود تھیں۔ اس کی طاقت کے ساتھ ساتھ اس کے زخموں کو بھی سمجھیں، تو آپ دراصل جدید انٹرنیٹ کی تاریخ سیکھ رہے ہیں۔