JavaScript語言的歷史
來自《JavaScript 標準參考教程(alpha)》,by 阮一峰
目錄
JavaScript的誕生
JavaScript 因為互聯網而生,緊隨著瀏覽器的出現而問世。回顧它的歷史,就要從瀏覽器的歷史講起。
1990年底,歐洲核能研究組織(CERN)科學家Tim Berners-Lee,在全世界最大的電腦網絡——互聯網的基礎上,發明了萬維網(World Wide Web),從此可以在網上瀏覽網頁文件。最早的網頁只能在操作系統的終端里瀏覽,也就是說只能使用命令行操作,網頁都是在字符窗口中顯示,這當然非常不方便。
1992年底,美國國家超級電腦應用中心(NCSA)開始開發一個獨立的瀏覽器,叫做Mosaic。這是人類歷史上第一個瀏覽器,從此網頁可以在圖形界面的窗口瀏覽。
1994年10月,NCSA的一個主要程序員Marc Andreessen聯合風險投資家Jim Clark,成立了Mosaic通信公司(Mosaic Communications),不久后改名為Netscape。這家公司的方向,就是在Mosaic的基礎上,開發面向普通用戶的新一代的瀏覽器Netscape Navigator。
1994年12月,Navigator發布了1.0版,市場份額一舉超過90%。
Netscape 公司很快發現,Navigator瀏覽器需要一種可以嵌入網頁的腳本語言,用來控制瀏覽器行為。當時,網速很慢而且上網費很貴,有些操作不宜在服務器端完成。比如,如果用戶忘記填寫“用戶名”,就點了“發送”按鈕,到服務器再發現這一點就有點太晚了,最好能在用戶發出數據之前,就告訴用戶“請填寫用戶名”。這就需要在網頁中嵌入小程序,讓瀏覽器檢查每一欄是否都填寫了。
管理層對這種瀏覽器腳本語言的設想是:功能不需要太強,語法較為簡單,容易學習和部署。那一年,正逢Sun公司的Java語言問世,市場推廣活動非常成功。Netscape公司決定與Sun公司合作,瀏覽器支持嵌入Java小程序(后來稱為Java applet)。但是,瀏覽器腳本語言是否就選用Java,則存在爭論。后來,還是決定不使用Java,因為網頁小程序不需要Java這么“重”的語法。但是,同時也決定腳本語言的語法要接近Java,并且可以支持Java程序。這些設想直接排除了使用現存語言,比如Perl、Python和TCL。
1995年,Netscape公司雇傭了程序員Brendan Eich開發這種網頁腳本語言。Brendan Eich有很強的函數式編程背景,希望以Scheme語言(函數式語言鼻祖LISP語言的一種方言)為藍本,實現這種新語言。
1995年5月,Brendan Eich只用了10天,就設計完成了這種語言的第一版。它是一個大雜燴,語法有多個來源:
- 基本語法:借鑒C語言和Java語言。
- 數據結構:借鑒Java語言,包括將值分成原始值和對象兩大類。
- 函數的用法:借鑒Scheme語言和Awk語言,將函數當作第一等公民,并引入閉包。
- 原型繼承模型:借鑒Self語言(Smalltalk的一種變種)。
- 正則表達式:借鑒Perl語言。
- 字符串和數組處理:借鑒Python語言。
為了保持簡單,這種腳本語言缺少一些關鍵的功能,比如塊級作用域、模塊、子類型(subtyping)等等,但是可以利用現有功能找出解決辦法。這種功能的不足,直接導致了后來JavaScript的一個顯著特點:對于其他語言,你需要學習語言的各種功能,而對于JavaScript,你常常需要學習各種解決問題的模式。而且由于來源多樣,從一開始就注定,JavaScript的編程風格是函數式編程和面向對象編程的一種混合體。
Netscape 公司的這種瀏覽器腳本語言,最初名字叫做 Mocha,1995年9月改為LiveScript。12月,Netscape公司與Sun公司(Java語言的發明者和所有者)達成協議,后者允許將這種語言叫做JavaScript。這樣一來,Netscape公司可以借助Java語言的聲勢,而Sun公司則將自己的影響力擴展到了瀏覽器。
之所以起這個名字,并不是因為JavaScript本身與Java語言有多么深的關系(事實上,兩者關系并不深),而是因為Netscape公司已經決定,使用Java語言開發網絡應用程序,JavaScript可以像膠水一樣,將各個部分連接起來。當然,后來的歷史是Java語言的瀏覽器插件失敗了,JavaScript反而發揚光大。
1995年12月4日,Netscape 公司與 Sun 公司聯合發布了 JavaScript 語言。當時的意圖是將 JavaScript 作為 Java 的補充,用來操作網頁。
1996年3月,Navigator 2.0 瀏覽器正式內置了 JavaScript 腳本語言。
JavaScript與ECMAScript的關系
1996年8月,微軟模仿JavaScript開發了一種相近的語言,取名為JScript(JavaScript是Netscape的注冊商標,微軟不能用),首先內置于IE 3.0。Netscape公司面臨喪失瀏覽器腳本語言的主導權的局面。
1996年11月,Netscape公司決定將JavaScript提交給國際標準化組織ECMA(European Computer Manufacturers Association),希望JavaScript能夠成為國際標準,以此抵抗微軟。ECMA的39號技術委員會(Technical Committee 39)負責制定和審核這個標準,成員由業內的大公司派出的工程師組成,目前共25個人。該委員會定期開會,所有的郵件討論和會議記錄,都是公開的。
1997年7月,ECMA組織發布262號標準文件(ECMA-262)的第一版,規定了瀏覽器腳本語言的標準,并將這種語言稱為ECMAScript。這個版本就是ECMAScript 1.0版。之所以不叫JavaScript,一方面是由于商標的關系,Java是Sun公司的商標,根據一份授權協議,只有Netscape公司可以合法地使用JavaScript這個名字,且JavaScript已經被Netscape公司注冊為商標,另一方面也是想體現這門語言的制定者是ECMA,不是Netscape,這樣有利于保證這門語言的開放性和中立性。因此,ECMAScript和JavaScript的關系是,前者是后者的規格,后者是前者的一種實現。在日常場合,這兩個詞是可以互換的。
ECMAScript只用來標準化JavaScript這種語言的基本語法結構,與部署環境相關的標準都由其他標準規定,比如DOM的標準就是由W3C組織(World Wide Web Consortium)制定的。
ECMA-262標準后來也被另一個國際標準化組織ISO(International Organization for Standardization)批準,標準號是ISO-16262。
JavaScript與Java的關系
JavaScript和Java是兩種不一樣的語言,但是它們之間存在聯系。
JavaScript的基本語法和對象體系,是模仿Java而設計的。但是,JavaScript沒有采用Java的靜態類型。正是因為JavaScript與Java有很大的相似性,所以這門語言才從一開始的LiveScript改名為JavaScript。基本上,JavaScript這個名字的原意是“很像Java的腳本語言”。
在JavaScript語言中,函數是一種獨立的數據類型,以及采用基于原型對象(prototype)的繼承鏈。這是它與Java語法最大的兩點區別。JavaScript語法要比Java自由得多。
另外,Java語言需要編譯,而JavaScript語言則是運行時由解釋器直接執行。
總之,JavaScript的原始設計目標是一種小型的、簡單的動態語言,與Java有足夠的相似性,使得使用者(尤其是Java程序員)可以快速上手。
JavaScript的版本
1997年7月,ECMAScript 1.0發布。
1998年6月,ECMAScript 2.0版發布。
1999年12月,ECMAScript 3.0版發布,成為JavaScript的通行標準,得到了廣泛支持。
2007年10月,ECMAScript 4.0版草案發布,對3.0版做了大幅升級,預計次年8月發布正式版本。草案發布后,由于4.0版的目標過于激進,各方對于是否通過這個標準,發生了嚴重分歧。以Yahoo、Microsoft、Google為首的大公司,反對JavaScript的大幅升級,主張小幅改動;以JavaScript創造者Brendan Eich為首的Mozilla公司,則堅持當前的草案。
2008年7月,由于對于下一個版本應該包括哪些功能,各方分歧太大,爭論過于激進,ECMA開會決定,中止ECMAScript 4.0的開發(即廢除了這個版本),將其中涉及現有功能改善的一小部分,發布為ECMAScript 3.1,而將其他激進的設想擴大范圍,放入以后的版本,由于會議的氣氛,該版本的項目代號起名為Harmony(和諧)。會后不久,ECMAScript 3.1就改名為ECMAScript 5。
2009年12月,ECMAScript 5.0版正式發布。Harmony項目則一分為二,一些較為可行的設想定名為JavaScript.next繼續開發,后來演變成ECMAScript 6;一些不是很成熟的設想,則被視為JavaScript.next.next,在更遠的將來再考慮推出。TC39的總體考慮是,ECMAScript 5與ECMAScript 3基本保持兼容,較大的語法修正和新功能加入,將由JavaScript.next完成。當時,JavaScript.next指的是ECMAScript 6。第六版發布以后,將指ECMAScript 7。TC39預計,ECMAScript 5會在2013年的年中成為JavaScript開發的主流標準,并在此后五年中一直保持這個位置。
2011年6月,ECMAscript 5.1版發布,并且成為ISO國際標準(ISO/IEC 16262:2011)。到了2012年底,所有主要瀏覽器都支持ECMAScript 5.1版的全部功能。
2013年3月,ECMAScript 6草案凍結,不再添加新功能。新的功能設想將被放到ECMAScript 7。
2013年12月,ECMAScript 6草案發布。然后是12個月的討論期,聽取各方反饋。
2015年6月,ECMAScript 6正式發布,并且更名為“ECMAScript 2015”。這是因為TC39委員會計劃,以后每年發布一個ECMAScirpt的版本,下一個版本在2016年發布,稱為“ECMAScript 2016”。
除了ECMAScript的版本,很長一段時間中,Netscape公司(以及繼承它的Mozilla基金會)在內部依然使用自己的版本號。這導致了JavaScript有自己不同于ECMAScript的版本號。1996年3月,Navigator 2.0內置了JavaScript 1.0。JavaScript 1.1版對應ECMAScript 1.0,但是直到JavaScript 1.4版才完全兼容ECMAScript 1.0。JavaScript 1.5版完全兼容ECMAScript 3.0。目前的JavaScript 1.8版完全兼容ECMAScript 5。
周邊大事記
JavaScript伴隨著互聯網的發展一起發展。互聯網周邊技術的快速發展,刺激和推動了JavaScript語言的發展。
1996年,樣式表標準CSS第一版發布。
1997年,DHTML(Dynamic HTML,動態HTML)發布,允許動態改變網頁內容。這標志著DOM模式(Document Object Model,文檔對象模型)正式應用。
1998年,Netscape公司開源了瀏覽器套件,這導致了Mozilla項目的誕生。幾個月后,美國在線(AOL)宣布并購Netscape。
1999年,IE 5部署了XMLHttpRequest接口,允許JavaScript發出HTTP請求,為后來大行其道的Ajax應用創造了條件。
2000年,KDE項目重寫了瀏覽器引擎KHTML,為后來的WebKit和Blink引擎打下基礎。這一年的10月23日,KDE 2.0發布,第一次將KHTML瀏覽器包括其中。
2001年,微軟公司時隔5年之后,發布了IE瀏覽器的下一個版本Internet Explorer 6。這是當時最先進的瀏覽器,它后來統治了瀏覽器市場多年。
2001年,Douglas Crockford提出了JSON格式,用于取代XML格式,進行服務器和網頁之間的數據交換。JavaScript可以原生支持這種格式,不需要額外部署代碼。
2002年,Mozilla項目發布了它的瀏覽器的第一版,后來起名為Firefox。
2003年,蘋果公司發布了Safari瀏覽器的第一版。
2004年,Google公司發布了Gmail,促成了互聯網應用程序(Web Application)這個概念的誕生。由于Gmail是在4月1日發布的,很多人起初以為這只是一個玩笑。
2004年,Dojo框架誕生,為不同瀏覽器提供了同一接口,并為主要功能提供了便利的調用方法。這標志著JavaScript編程框架的時代開始來臨。
2004年,WHATWG組織成立,致力于加速HTML語言的標準化進程。
2005年,蘋果公司在KHTML引擎基礎上,建立了WebKit引擎。
2005年,Ajax方法(Asynchronous JavaScript and XML)正式誕生,Jesse James Garrett發明了這個詞匯。它開始流行的標志是,2月份發布的Google Maps項目大量采用該方法。它幾乎成了新一代網站的標準做法,促成了Web 2.0時代的來臨。
2005年,Apache基金會發布了CouchDB數據庫。這是一個基于JSON格式的數據庫,可以用JavaScript函數定義視圖和索引。它在本質上有別于傳統的關系型數據庫,標識著NoSQL類型的數據庫誕生。
2006年,jQuery函數庫誕生,作者為John Resig。jQuery為操作網頁DOM結構提供了非常強大易用的接口,成為了使用最廣泛的函數庫,并且讓JavaScript語言的應用難度大大降低,推動了這種語言的流行。
2006年,微軟公司發布IE 7,標志重新開始啟動瀏覽器的開發。
2006年,Google推出 Google Web Toolkit 項目(縮寫為GWT),提供Java編譯成JavaScript的功能,開創了將其他語言轉為JavaScript的先河。
2007年,Webkit引擎在iPhone手機中得到部署。它最初基于KDE項目,2003年蘋果公司首先采用,2005年開源。這標志著JavaScript語言開始能在手機中使用了,意味著有可能寫出在桌面電腦和手機中都能使用的程序。
2007年,Douglas Crockford發表了名為《JavaScript: The good parts》的演講,次年由O’Reilly出版社出版。這標志著軟件行業開始嚴肅對待JavaScript語言,對它的語法開始重新認識,
2008年,V8編譯器誕生。這是Google公司為Chrome瀏覽器而開發的,它的特點是讓JavaScript的運行變得非常快。它提高了JavaScript的性能,推動了語法的改進和標準化,改變外界對JavaScript的不佳印象。同時,V8是開源的,任何人想要一種快速的嵌入式腳本語言,都可以采用V8,這拓展了JavaScript的應用領域。
2009年,Node.js項目誕生,創始人為Ryan Dahl,它標志著JavaScript可以用于服務器端編程,從此網站的前端和后端可以使用同一種語言開發。并且,Node.js可以承受很大的并發流量,使得開發某些互聯網大規模的實時應用變得容易。
2009年,Jeremy Ashkenas發布了CoffeeScript的最初版本。CoffeeScript可以被轉化為JavaScript運行,但是語法要比JavaScript簡潔。這開啟了其他語言轉為JavaScript的風潮。
2009年,PhoneGap項目誕生,它將HTML5和JavaScript引入移動設備的應用程序開發,主要針對iOS和Android平臺,使得JavaScript可以用于跨平臺的應用程序開發。
2009,Google發布Chrome OS,號稱是以瀏覽器為基礎發展成的操作系統,允許直接使用JavaScript編寫應用程序。類似的項目還有Mozilla的Firefox OS。
2010年,三個重要的項目誕生,分別是NPM、BackboneJS和RequireJS,標志著JavaScript進入模塊化開發的時代。
2011年,微軟公司發布Windows 8操作系統,將JavaScript作為應用程序的開發語言之一,直接提供系統支持。
2011年,Google發布了Dart語言,目的是為了結束JavaScript語言在瀏覽器中的壟斷,提供更合理、更強大的語法和功能。Chromium瀏覽器有內置的Dart虛擬機,可以運行Dart程序,但Dart程序也可以被編譯成JavaScript程序運行。
2011年,微軟工程師Scott Hanselman提出,JavaScript將是互聯網的匯編語言。因為它無所不在,而且正在變得越來越快。其他語言的程序可以被轉成JavaScript語言,然后在瀏覽器中運行。
2012年,單頁面應用程序框架(single-page app framework)開始崛起,AngularJS項目和Ember項目都發布了1.0版本。
2012年,微軟發布TypeScript語言。該語言被設計成JavaScript的超集,這意味著所有JavaScipt程序,都可以不經修改地在TypeScript中運行。同時,TypeScript添加了很多新的語法特性,主要目的是為了開發大型程序,然后還可以被編譯成JavaScript運行。
2012年,Mozilla基金會提出asm.js規格。asm.js是JavaScript的一個子集,所有符合asm.js的程序都可以在瀏覽器中運行,它的特殊之處在于語法有嚴格限定,可以被快速編譯成性能良好的機器碼。這樣做的目的,是為了給其他語言提供一個編譯規范,使其可以被編譯成高效的JavaScript代碼。同時,Mozilla基金會還發起了Emscripten項目,目標就是提供一個跨語言的編譯器,能夠將LLVM的位代碼(bitcode)轉為JavaScript代碼,在瀏覽器中運行。因為大部分LLVM位代碼都是從C / C++語言生成的,這意味著C / C++將可以在瀏覽器中運行。此外,Mozilla旗下還有LLJS(將JavaScript轉為C代碼)項目和River Trail(一個用于多核心處理器的ECMAScript擴展)項目。目前,在可以被編譯成JavaScript的語言列表上,共有將近40種語言。
2013年,Mozilla基金會發布手機操作系統Firefox OS,該操作系統的整個用戶界面都使用JavaScript。
2013年,ECMA正式推出JSON的國際標準,這意味著JSON格式已經變得與XML格式一樣重要和正式了。
2013年5月,Facebook發布UI框架庫React,引入了新的JSX語法,使得UI層可以用組件開發。
2014年,微軟推出JavaScript的Windows庫WinJS,標志微軟公司全面支持JavaScript與Windows操作系統的融合。
2014年11月,由于對Joyent公司壟斷Node項目、以及該項目進展緩慢的不滿,一部分核心開發者離開了Node.js,創造了io.js項目,這是一個更開放、更新更頻繁的Node.js版本,很短時間內就發布到了2.0版。三個月后,Joyent公司宣布放棄對Node項目的控制,將其轉交給新成立的開放性質的Node基金會。隨后,io.js項目宣布回歸Node,兩個版本將合并。
2015年3月,Facebook公司發布了React Native項目,將React框架移植到了手機端,可以用來開發手機App。它會將JavaScript代碼轉為iOS平臺的Objective-C代碼,或者Android平臺的Java代碼,從而為JavaScript語言開發高性能的原生App打開了一條道路。
2015年4月,Angular框架宣布,2.0版將基于微軟公司的TypeScript語言開發,這等于為JavaScript語言引入了強類型。
2015年5月,Node模塊管理器npm超越CPAN,標志著JavaScript成為世界上軟件模塊最多的語言。
2015年5月,Google公司的Polymer框架發布1.0版。該項目的目標是生產環境可以使用WebComponent組件,如果能夠達到目標,Web開發將進入一個全新的以組件為開發基礎的階段。
2015年6月,ECMA標準化組織正式批準了ECMAScript 6語言標準,定名為《ECMAScript 2015 標準》。JavaScript語言正式進入了下一個階段,成為一種企業級的、開發大規模應用的語言。這個標準從提出到批準,歷時10年,而JavaScript語言從誕生至今也已經20年了。
2015年6月,Mozilla 在 asm.js 的基礎上發布 WebAssembly 項目。這是一種JavaScript語言編譯后的二進制格式,類似于Java的字節碼,有利于移動設備加載JavaScript腳本,解析速度提高了20+倍。這意味著將來的軟件,會發布JavaScript二進制包。
2016年6月,《ECMAScript 2016 標準》發布。與前一年發布的版本相比,它只增加了兩個較小的特性。
2017年6月,《ECMAScript 2017 標準》發布,正式引入了 async 函數,使得異步操作的寫法出現了根本的變化。
2017年11月,所有主流瀏覽器全部支持 WebAssembly,這意味著任何語言都可以編譯成 JavaScript,在瀏覽器運行。
參考鏈接
- Axel Rauschmayer, The Past, Present, and Future of JavaScript
- John Dalziel, The race for speed part 4: The future for JavaScript
- Axel Rauschmayer, Basic JavaScript for the impatient programmer
- resin.io, Happy 18th Birthday JavaScript! A look at an unlikely past and bright future