جاوااسکریپت مسلّماً یکی از مهمترین زبانهای روز دنیاست. پیشرفت وب و جاوااسکریپت به جایی رسیده است که هرگز تصوّر نمیشد. ما در این مطلب به صورت خلاصه تاریخچهی کوتاه جاوااسکریپت را بررسی میکنیم و میبینیم که چگونه پیشرفت کرد و به اینجا رسید.
همه چیز از دههی ۹۰ میلادی شروع شد
جاوااسکریپت طیّ ۶ ماه از می تا دسامبر ۱۹۹۵ ساخته شد. در آن زمان شرکت NetScape حضوری فعّال در دنیای جدید وب داشت. مرورگر این شرکت رقیب جدّی اوّلین مرورگر مشهور وب یعنی NCSA Mosaic بود. بسیاری از کسانی که جزء مؤسسان Netscape بودند، قبلاً در ساخت Mosaic .دست داشتند و حالا که مستقل شده بودند و بودجهی کافی هم داشتند، به اندازهی کافی آزادی داشتند که دنیای وب را رو به جلو برده و گسترش دهند. و این همان موضوعی بود که باعث تولّد جاوااسکریپت شد.
NetScape به دنبال راهی برای پویاتر کردن صفحات وب بود. بنابراین آقای براندان ایچ (صاحب عکس زیر) را مأمور کرد تا یک زبان اسکریپتی کوچکبرای صفحات وب و دستکاری HTML بسازد. آنها نمیخواستند این زبان فقط برای برنامهنویسان حرفهای قابل استفاده باشد، بلکه مخاطبین این زبان طرّاحان بودند. زیرا آن زمان هنوز دنیای وب در ابتدای کار بود و HTML هم آنقدر ساده بود که غیر برنامهنویسان به راحتی بتوانند با آن کار کنند. به همین دلیل این زبان جدید که میخواست بخشی از مرورگر شود باید توسّط آنها هم قابل استفاده میبود. این زبان Mocha نام گرفت. آقای ایچ میخواست زبانی مثل زبان Scheme برای مرورگر بسازد، زبان Scheme نسخهای ساده شده از زبان Lisp بود که برای یادگیری و… بسیار مناسب بود.
ولی وقت تنگ بود، او باید سریعاً یک نمونهی اوّلیّه از این زبان را ارائه میداد. بنابراین به این فکر افتاد که به جای طرّاحی زبان Mocha یعنی یک زبان برنامهنویسی کاملاً جدید، آن را براساس زبان جاوا بسازد. البته زبان جاوا هم بزرگ بود و وقت هم نبود. در نهایت زبان Mocha ساخته شد، ولی شباهتی به زبان Scheme نداشت. تا حدّی شبیه جاوای پویا بود، ولی تفاوتهای بسیار بزرگی با جاوا داشت. چیزی شبیه Schema ناقص بود با ظاهری شبیه جاوا. بالأخره نمونهی اوّلیّهی زبان Mocha در ماه می ۱۹۹۵ روی مرورگر Netscape پیادهسازی شد. چیزی نگذشت که نام این زبان به LiveScript تغییر کرد. در دسامبر سال ۱۹۹۵ طیّ قرار دادی بین شرکت Netscape و Sun نام این زبان به JavaScript تغییر کرد. البته برای شرکت Sun هم سخت بود که زبانی را به عنوان همنشین جاوا بپذیرد که تفاوتهای بسیار بزرگی با آن داشت.
مایکروسافت هم برای اینکه از قافله عقب نماند و مرورگرش یعنی Internet Explorer در رقابت با مرورگر Netscape Navigator شکست نخورد، او هم جاوااسکریپت را پیادهسازی کرد و به خاطر مسائل قانونی و عدم امکان استفاده از کلمهی جاوا نام آن را JScript گذاشت. البته تفاوت JScript و جاوااسکریپت فقط منتهی به نام نمیشد و تفاوتهای کوچک دیگری نیز داشتند. اوّلین نسخهی JScript در سال ۱۹۹۶ روی مرورگر Internet Explorer 3 پیادهسازی شد.
در سال ۱۹۹۶ آقای ایچ دوباره شروع به نوشتن موتور جاوااسکریپت جدیدی برای مرورگر Netscape کرد، موتور جاوااسکریپت قبلی که Mocha نام داشت، به دلیل عجله در پیادهسازی مشکلاتی داشت و باید از اوّل ساخته میشد. این موتور جاوااسکریپت جدید SpiderMonkeyy نام گرفت. در حال حاضر نیز اسم موتور جاوااسکریپت مرورگر فایرفاکس SpiderMonkey است.
تا سالها بعدJScript و SpiderMonkey دو موتور اصلی جاوااسکریپت دنیا بودند. بعضی از قابلیّتهایی که این دو موتور پیادهسازی کرده بودند با هم سازگار نبودند و باید تعریف میشد که کدام قابلیّتها باید جزء وب باشند.
ECMAScript: استاندارد شدن جاوااسکریپت
یک سال بعد که مرورگر NetScape Navigator 3 منتشر شد، زبان جاوااسکریپت برای استانداردسازی به سازمان ECMA ارائه شد. اکما یک انجمن صنعتی برای استانداردسازی سیستمهای اطّلاعاتی و ارتباطاتی است که در سال ۱۹۶۱ تأسیس شده است. پس از استانداردسازی به دلیل مشکلات قانونی برای استفاده از کلمهی جاوا در نام این زبان، صحبتهایی شد و در نهایت نام رسمی این زبانECMAScript شد. جاوااسکریپت فقط نام تجاری اکمااسکریپت است (مثل جوهرنمک که نام تجاری کلریدریک اسید است).
نسخهی ۱ اکمااسکریپت در سال ۱۹۹۷ در مرورگر NetScape Navigator 4 پیاده شد و مهمترین تغییرات آن اصلاح و استاندارد شدن شیءگرایی پروتوتایپی بود. نسخهی ۲ اکمااسکریپت تغییری نسبت به نسخهی ۱ نداشت و تنها برای رفع تناقضات بین استاندارد ECMA و ISO برای جاوااسکریپت بود. این نسخه در ژوئن ۱۹۹۸ منتشر شد.
اوّلین تغییرات بزرگ در نسخهی ۳ اکمااسکریپت رخ داد. مهمترین آنها عبارت بودند از:
عبارتهای منظّم (Regular Expression)
حلقهی do while
مدیریت استثناء و try catch
توابع از پیش آمادهی بیشتری برای کار با رشتهها و آرایهها
عملگرهای in و instanceof
اکمااسکریپت ۳ در دسامبر ۱۹۹۹ منتشر شد. در نوامبر سال ۲۰۰۰ نسخهی ۶ مرورگر NetScape Navigator منتشر شد که از اکمااسکریپت ۳ پشتیبانی میکرد. چیزی نگذشت که اینترنت اکسپلورر هم از آن پشتیبانی کرد و حدود یک سال و نیم بعد مرورگر جدیدی برپایهی NetScape Navigator منتشر شد به نام فایرفاکس که آن هم از کمااسکریپت ۳ پشتیبانی میکرد. برای همین عملاً جاوااسکریپت در تمام مرورگرهای اصلی آن زمان پشتیبانی شد و تا امروزه هنوز بسیاری از کتابخانههای جاوااسکریپت برپایهی نسخهی ۳ نوشته میشوند.
تولّد AJAX
در همان زمان بود که مایکروسافت جاوااسکریپت را در مرورگر اینترنت اکسپلورر ۵ توسعه داد و توابعی را به آن اضافه کرد که رسماً جزء استاندارد اکمااسکریپت ۳ نبود. یکی از آنها تابع XMLHttpRequest بود که به مرورگر امکان میداد به صورت آسنکرون درخواست HTTP به سرور ارسال کند. بنابراین به صفحه امکان میدهد تا بدون لود شدن دوبارهی کل صفحه، اطّلاعات آن را از سرور بگیرد و به روزرسانی کند. البته تا سالها بعد کلمهی AJAX برای آن به کار نمیرفت. XMLHttpRequest موفقیت خود را اثبات کرد و در سالهای بعد به عنوان استانداردی مجزّا ارائه شد
از آنجایی که اینترنت اکسپلورر ۵ و ۶ تفاوتهایی با جاوااسکریپت استاندارد و سایر مرورگرها داشتند، توسعه دهندگان را تا مدّتهای طولانی آزار میدادند. تا اینکه مایکروسافت تصمیم گرفت از نسخهی ۷ به بعد از استانداردها پیروی کند. به همین دلیل شاهد بودیم سایتهایی که به جای به روزرسانی و پیروی از استانداردها از کاربران خود میخواستند از نسخههای قدیمی اینترنت اکسپلورر برای اجرای درست استفاده کنند.
اکمااسکریپت ۳.۱ و ۴: سالهای مبارزه
متأسفانه این سالها برای جاوااسکریپت اصلاً خوب نبود. به محض شروع کار روی اکمااسکریپت ۴ گروهی معتقد بودند که جاوااسکریپت به قابلیّتهایی نیاز دارد تا تبدیل به زبانی قویتر برای تولید اپلیکیشنهایی با سایز بزرگ بشود. این گروه تغییرات بزرگ و قابلیّتهای بسیارزیادی را برای رسیدن به این هدف مطرح کردند. دیگران معتقد بودند که این تغییرات خیلی بزرگ است و خوب نیست. عدم اجماع روی این موضوع و پیچیدگی زیادی که بعضی از قابلیّتهای مطرح شده داشتند باعث شد انتشار اکمااسکریپت ۴ مدّتها به عقب بیفتد. علیرغم قابلیّتهای بسیار جالبی که در این نسخه معرّفی شده بود مرورگرها آن را پیادهسازی نکردند، مدّتی بعد شرکت Adobe برای زبان Action Script و همچنین مایکروسافت برای زبان JScript.Net اکمااسکریپت ۴ را پیادهسازی کردند و آن را به عنوان پایه و اساس موتورهای خود به کار بردند. اکمااسکریپت ۴ قابلیّتهای زیر را داشت:
Classes
Interfaces
Namespaces
Packages
Optional type annotations
Optional static type checking
Structural types
Type definitions
Multimethods
Parameterized types
Proper tail calls
Iterators
Generators
Instrospection
Type discriminating exception handlers
Constant bindings
Proper block scoping
Destructuring
Succint function expressions
Array comprehensions
هدف اکمااسکریپت ۴ تولید اپلیکیشنهای بزرگ بود. اگر با اکمااسکریپت ۶ آشنا باشید حتماً متوجّه شدید که بسیاری از قابلیّتهای اکمااسکریپت ۴ دوباره در آن معرّفی شده است.
گروهی که برای توسعهی اکمااسکریپت ۴ کار میکردند از شرکتهای Adobe، Microsoft، Mozilla و Opera بودند. Yahoo وقتی وارد این جمع شد که اکثر تصمیمات گرفته شده بود. نمایندهی یاهو مخالفت خودش را با بسیاری از استانداردهای تصویب شده در اکمااسکریپت ۴ ابراز کرد. نمایندهی مایکروسافت نیز از او حمایت کرد. با شروع این شک و تردیدها مایکروسافت محکم جلوی اکمااسکریپت ۴ ایستاد و هیچکدام از بخشهای آن را قبول نکرد و تمام توان خود را به کار برد تا این استاندارد تصویب نشود. به هر حال این موضوع باعث شد یک جر و بحث حسابی بین اعضای کمیته در بگیرد و به توافق نرسند. نمایندهی مایکروسافت ایدهای ارائه داد و آن این بود که روی نسخهای از جاوااسکریپت کار شود که تغییراتی کوچک داشته باشد بدون تغییر Syntax که اکمااسکریپت ۳.۱ نامیده میشد.
تا مدّتی هر دوی این استانداردها با هم وجود داشتند. دو کمیته تشکیل شد، یکی روی اکمااسکریپت ۴ و دیگری روی ۳.۱ کار میکرد. امّا اکمااسکریپت ۴ پیچیدهتر از این بود که در صورت عدم توافق بتواند تمام شود. امّا اکمااسکریپت ۳.۱ بسیار سادهتر بود و در نهایت به خاطر لجبازی تمام شد.
در نهایت سال ۲۰۰۸ پایان عمر اکمااسکریپت ۴ بود. زمانی که براندان ایچ اعلام کرد که تمرکز اصلی روی اکمااسکریپت ۳.۱ باید باشد و تا سال دیگر باید روی نسخهای از اکمااسکریپت کار شود که با نسخهی ۳.۱ سازگار باشد و تغییرات آن نسبت به نسخهی قبلی از هر لحاظ نباید مثل اکمااسکریپت ۴ اینقدر زیاد باشد.
در مجموع توسعهی اکمااسکریپت ۴ حدود ۸ سال طول کشید و در نهایت دور انداخته شد.
Action Script
اکشناسکریپت یک زبان برنامهنویسی برپایهی اکمااسکریپت ۴ است. شرکت Adobe این زبان را به عنوان بخشی از Flash پیادهسازی کرد و این تنها زبان برنامهنویسی است که میتواند در Flash به کار رود. این کار ادوب حمایت بزرگی برای حفظ اکمااسکریپت ۴ بود. حتّی ادوب به امید مورد قبول واقع شدن اکمااسکریپت ۴ موتور اکشناسکریپت را نیزبه صورت متنباز منتشر کرد. آنها امیدوار بودند که نسخههای آیندهی اکمااسکریپت با اکشناسکریپت سازگار باشند که متأسّفانه اینطور نشد.
اکشناسکریپت امروزه به عنوان زبان برنامهنویسی Flash باقیمانده است. که البته با ظهور HTML5 به مرور در افق محو میشود! اگر اکمااسکریپت ۴ پذیرفته میشد و ادامه داشت، اکنون کدهای جاوااسکریپت ما بسیار شبیه کدهایی بود که با اکشناسکریپت نوشته میشوند.
E4X
در همان سالهای کار روی اکمااسکریپت ۴ (سال ۲۰۰۴)، E4X معرّفی شد. E4X مخفّف ECMAScript for XML بود که استانداردسازی هم شده بود (ECMA-357). در اصل E4X همان اکمااسکریپت بود که یک نوع دادهی دیگر هم به آن اضافه شده بود، یعنی XML. این موضوع مورد توجّه موتورهای جاوااسکریپت آن زمان مثل SpiderMonkey قرار گرفت و پیادهسازی شد، ولی به دلیل استفادهی بسیار کم برنامهنویسان از آن برداشته شد، در فایرفاکس از نسخهی ۲۱ به بعد پشتیبانی از E4X قطع شد.
مسلّماً نوع دادهای مثل JSON در جامعهی جاوااسکریپت بیشتر مورد پذیرش بود، به همین دلیل E4X بدون دردسر خاصی آمد و رفت.
ECMAScript 5 تولّد دوبارهی جاوااسکریپت
پس از کشمکشهای زیادی که سر اکمااسکریپت ۴ پیش آمد، بعد از سال ۲۰۰۸، اکمااسکریپت ۴ دور انداخته شد و همه روی اکمااسکریپت ۳.۱ تمرکز کردند. در سال ۲۰۰۹ اکمااسکریپت ۳.۱ کامل شد و توسّط تمام اعضا مورد قبول واقع شد. کمیته برای این که عموم مردم گیج نشوند نام این نسخه را به اکمااسکریپت ۵ تغییر داد. درست است که اکمااسکریپت ۴ مورد توافق واقع نشد، ولی به عنوان یک نسخهی خاص از اکمااسکریپت باقی ماند و در نتیجه این نسخه اکمااسکریپت ۵ نام گرفت.
اکما اسکریپت ۵ به بهترین نسخهی جاوااسکریپت از لحاظ پشتیبانی مرورگرها تبدیل شد. اکمااسکریپت ۵ به طور کامل توسّط فایرفاکس ۴ (سال ۲۰۱۱)، کروم ۱۹ (سال ۲۰۱۲)، سافاری۶ (سال ۲۰۱۲)، اُپرا ۱۲ (سال ۲۰۱۲) و اینترنت اکسپلورر ۱۰ (سال ۲۰۱۲) پشتیبانی میشود.
اکمااسکریپت ۵ نسبت به اکمااسکریپت ۳ تغییرات کمی داشت، از جمله:
Getterها و Setterها
قراردادن ویرگول در انتهای آرایه یا شیء مجاز است
متدهای جدیدی برای Object (متد create، defineProperty، keys، seal، freeze، gwtOwnPropertyNames و…)
متدهایی برای Array (متدهای isArray، indexOf، every، some، map، filter، reduce و…)
متد trim برای رشتهها
متدهایی برای Date (متدهای toISOString، now، toJSON)
متد bind برای تابعها
JSON
اشیاء undefined، NaN و Infinity
حالت Strict
یک سری تغییر کوچک دیگر
هیچ کدام از موارد بالا تغییری در Syntax جاوااسکریپت ندادند. قبل از آن هم Getterها و Setterها به صورت غیر رسمی در مرورگرها پشتیبانی میشد. اکمااسکریپت ۵ در سال ۲۰۱۱ تحت عنوان اکمااسکریپت ۵.۱ بازگویی شد، ولی هیچ قابلیّت جدیدی نسبت به اکمااسکریپت ۵۵ نداشت، جز اینکه بعضی از قسمتهای مبهم در این استاندارد شفّافسازی شده بود.
اکمااسکریپت ۶ (۲۰۱۵) و ۷ (۲۰۱۶): زبانی همه منظوره
خیلی از قابلیّتهایی که در اکمااسکریپت ۴ بحث شده بود حذف شد و خیلیهای دیگر این بار با نگاهی جدید بازبینی شد و اکمااسکریپت ۶ که بعداً به اکمااسکریپت ۲۰۱۵ تغییر نام پیدا کرد همراه با تغییراتی بسیار بزرگ ارائه شد. با اینکه این بار اعضای کمیته با هم متّحد بودند و در نهایت در سال ۲۰۱۵ آن را تصویب کردند، بعضی از سازندگان مرورگرها به دلیل زیاد بودن تغییرات هنوز که هنوز است (ژانویهی ۲۰۱۷) کاملاً آن را پیادهسازی نکردهاند.
انتشار اکمااسکریپت ۲۰۱۵ باعث شد جهشی بزرگ در استفاده از ترنسپایلرهایی مثل Babel یا Traceur رخ دهد. مردم با کمک این ترنسپایلرها میتوانستند قابلیّتهای جدید اکمااسکریپت ۲۰۱۵ را تست کنند (ترنسپایلرها میتوانند کد اکمااسکریپت ۲۰۱۵ را به کد اکمااسکریپت ۵ تبدیل کنند که در مرورگرها بدون مشکل اجرا شود).
بسیاری از قابلیّتهای بزرگ اکمااسکریپت ۴ در این نسخه با دیدی جدید ارائه شد. مثلاً class در اکمااسکریپت ۲۰۱۵ چیزی بیشتر از یک Syntax جدید برای همان تابع سازنده و پروتوتایپ که قبلاً استفاده میشد نیست. این رویکرد انتقال به نسخهی جدید را سادهتر میکند.
خلاصهای کوتاه از قابلیّتهای اکمااسکریپت ۶:
let و const
Arrow function و lexical this
class
بهبودهایی در Object literal
Template string
Promise
Generatorها و iterableها و iteratorها و for…of
آرگومان پیشفرض برای تابعها و عملگر rest
Spread
Destructuring
Module
اشیائی جدید برای مجموعه (Set، Map، WeakSet و WeakMap)
Proxy و Reflection
Symbol
Typed array
پشتیبانی از ارثبری از کلاسهای پیشفرض
پشتیبانی سادهتر از Unicode
سینتکسی برای نوشتن اعداد در مبنای ۲ و مبنای ۸
تمام این قابلیّتها مخاطبین جاوااسکریپت را افزایش میدهد و به برنامهنویسی اپلیکیشنهای بزرگ کمک میکند. در این نسخه خیلی از قابلیّتهای اکمااسکریپت ۴ که خیلی تهاجمی بودند، مثل namespace یا تعیین نوعداده برای متغیّرها نادیده گرفته شدند و خیلی از قابلیّتهای دیگر با دیدی جدید معرّفی شدند. با این حال اکمااسکریپت ۲۰۱۵ حدود ۶ سال طول میکشد تا کاملاً در مرورگرها پیادهسازی شود و قابل استفاده باشد.
در سال ۲۰۱۶ تجدید نظری روی اکمااسکریپت ۲۰۱۵ انجام شد و اصلاحات کوچکی انجام گرفت که به عنوان اکمااسکریپت ۲۰۱۶ معرّفی شد. این اصلاحات عبارتند از:
عملگر توان (**)
متد includes برای آرایهها
بعضی اصلاحات کوچک (Generatorها نمیتوانند با new به کار روند و…)
آینده: اکمااسکریپت ۲۰۱۷ و بعد از آن
شاید مهمترین چیزی که در این پروپوزال روی آن کار میشود async/await باشد. Async/await کار با Promiseها را از لحاظ Syntax سادهتر میکند.بعضی از تغییرات کوچکتر این پروپوزال عبارتند از:
Object.values و Object.entries
متدهای padStart و padEnd برای رشتهها
Object.getOwnPropertyDescriptors
ویرگول اضافی در انتهای آرگومانهای تابعها مجاز است
امّا آینده به اینجا ختم نمیشود. ما نگاهی به سایر پروپوزالها انداختهایم که ببینیم در آینده با چه چیزهایی مواجه خواهیم بود. جذّابترین آنها عبارتند از:
SIMD API
Generator arrow function
حافظهی اشتراکی و atomics
عملیّات روی اعداد صحیح ۶۴ بیتی
جاوااسکریپت روز به روز بیشتر شبیه یک زبان همهمنظوره میشود، امّا یک چیز بزرگ وجود دارد که آیندهی جاوااسکریپت را دگرگون خواهد کرد.
WebAssembly
اگر تا به حال در مورد وباسمبلی چیزی نشنیدهاید حتماً باید در این زمینه مطالعه کنید. وباسمبلی اجازه میدهد با زبانهای برنامهنویسی دیگری غیر از جاوااسکریپت هم بتوانید کد بزنید. این برنامهها در نهایت به بایتکُدِ وباسمبلی تبدیل میشوند (مثل زبان جاوا که برنامهی نهایی به یک فایل jar که در اصل همان بایتکُد است تبدیل میشود). حالا این بایتکُد در مرورگر لود میشود. طبیعتاً سرعت اجرای بایتکُد توسّط مرورگر بسیار بیشتر از اجرای تفسیری کدهای جاوااسکریپت معمولی است. ضمناً میشود سورسمپهایی را نیز همراه بایتکُد وباسمبلی تولید کردتا برای دیباگ کردن کُد نیز مشکلی وجود نداشته باشد. هماکنون مرورگرهای کروم و فایرفاکس در نسخههای آزمایشی خود وباسمبلی را پیادهسازی کردهاند.