title: JavaScript的歷史
layout: page
category: introduction
date: 2013-01-10
modifiedOn: 2013-12-05
聲明,這是阮一峰老師的文章,附上鏈接:
http://javascript.ruanyifeng.com/introduction/history.html
理解現在的最好方法之一,就是了解歷史,本節將全面介紹JavaScript的歷史。了解這些內容,還有助于把握JavaScript在整個計算機編程體系和計算機工業中所處的位置,以及涉及的全部范圍。
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瀏覽器需要一種可以嵌入網頁的腳本語言,用來控制瀏覽器行為。當時,網速很慢而且上網費很貴,有些操作不宜在服務器端完成。比如,如果用戶忘記填寫“用戶名”,就點了“發送”按鈕,到服務器再發現這一點就有點太晚了,最好能在用戶發出數據之前,就告訴用戶“請填寫xx欄”。這就需要在網頁中嵌入小程序,讓瀏覽器檢查每一欄是否都填寫了。
管理層對這種瀏覽器腳本語言的設想是:功能不需要太強,語法較為簡單,容易學習和部署。那一年,正逢Java語言開始推向市場,Netscape公司決定,腳本語言的語法要接近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語言的瀏覽器插件(applet)失敗了,JavaScript反而發揚光大。
JavaScript的發布和標準化
1995年12月4日,Netscape公司與Sun公司聯合發布了JavaScript語言。值得一提的是,17天之后Ruby語言也發布了它的第一個版本。
1996年3月,Navigator 2.0瀏覽器正式內置了JavaScript腳本語言。
1996年8月,微軟模仿JavaScript開發了一種相近的語言,取名為JScript(JavaScript是Netscape的注冊商標,微軟不能用),首先內置于IE 3.0。網景公司面臨喪失瀏覽器腳本語言的主導權的局面。
1996年11月,網景公司決定將JavaScript提交給國際標準化組織ECMA,希望JavaScript能夠成為國際標準,以此抵抗微軟。
1997年7月,ECMA組織發布262號標準文件(ECMA-262)的第一版,規定了瀏覽器腳本語言的標準,并將這種語言稱為ECMAScript。這個版本就是ECMAScript 1.0版。之所以不叫JavaScript,一方面是由于商標的關系,Java是Sun公司的商標,根據一份授權協議,只有Netscape公司可以合法地使用JavaScript這個名字,且JavaScript已經被Netscape公司注冊為商標,另一方面也是想體現這門語言的制定者是ECMA,不是Netscape,這樣有利于保證這門語言的開放性和中立性。因此,ECMAScript和JavaScript的關系是,前者是后者的規格,后者是前者的一種實現。在日常場合,這兩個詞是可以互換的。
1998年6月,ECMAScript 2.0版發布。
1999年12月,ECMAScript 3.0版發布,成為JavaScript的通行標準,得到了廣泛支持。
ECMAScript和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,在更遠的將來再考慮推出。
2011年6月,ECMAscript 5.1版發布,并且成為ISO國際標準(ISO/IEC 16262:2011)。
2013年3月,ECMAScript 6草案凍結,不再添加新功能。新的功能設想將被放到ECMAScript 7。
2013年12月,ECMAScript 6草案發布。然后是12個月的討論期,聽取各方反饋。
2014年12月,ECMAScript 6預計將發布正式版本。
TC39的總體考慮是,ECMAScript 5與ECMAScript 3基本保持兼容,較大的語法修正和新功能加入,將由JavaScript.next完成。當前,JavaScript.next指的是ECMAScript 6,當第六版發布以后,將指ECMAScript 7。 TC39預計,ECMAScript 5會在2013年的年中成為Javascript開發的主流標準,并在今后五年中一直保持這個位置。
雖然ECMAScript是JavaScript的標準,但是Netscape公司(以及后來的Mozilla基金會)在內部依然使用自己的版本號。這導致了JavaScript有自己不同于ECMAScript的版本號。
1996年3月,Navigator 2.0內置了JavaScript 1.0。
1996年8月,Navigator 3.0內置了JavaScript 1.1。
1997年6月,Navigator 4.0內置了JavaScript 1.2。
1998年10月,Navigator 4.06內置了JavaScript 1.3。
1999年,Netscape服務器版提供JavaScript 1.4。
2000年11月,Navigator 6.0內置了JavaScript 1.5。
2005年11月,Firefox 1.5內置了JavaScript 1.6。
2006年10月,Firfox 2.0內置了JavaScript 1.7。
2008年6月,Firefox 3.0內置了JavaScript 1.8。
JavaScript 1.1版對應ECMAScript 1.0,但是直到JavaScript 1.4版才完全兼容ECMAScript 1.0。JavaScript 1.5版完全兼容ECMAScript 3.0。目前的JavaScript 1.8版完全兼容ECMAScript 5。
截止2013年初,所有瀏覽器的最新版本——Chrome 24,Firefox 19,IE 10.0,Opera 12,Safari 6——都支持ECMAScript 5.1版。
周邊大事記
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可以用于跨平臺的應用程序開發。
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格式一樣重要和正式了。
2014年,微軟推出JavaScript的Windows庫WinJS,標志微軟公司全面支持JavaScript與Windows操作系統的融合。
參考鏈接
- 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