【歷史】JavaScript和Java沒啥關係!————JavaScript簡史

文章的開始先上張圖:

    

        圖片拍攝自北京圖書大廈,代表着現在國內應該是絕大部分書店的現狀——Javascript書籍放在Java類當中。甚至很多業內人也一直認爲Javascript是Java語言在瀏覽器內的實現。不過也可以理解,誰讓Javascript起了這麼一個名字呢~   今天咱們就來聊聊Javascript的歷史~~~~


一、起源——ScriptEase

            

        故事的開端在1992年,當時,一個叫Nombas的公司開發了叫做C減減(C minusminus,Cmm)的嵌入式腳本語言,其目標在於帶來一個足夠強大可以代替宏操作的腳本語言,並和C語言保持相似性以降低開發人員的學習成本。它被捆綁在一個叫做CEnvi的共享工具裏。由於覺得mm聽起來過於消極,同時字母C“令人害怕”,(無法理解裏面的邏輯。。。。。),Nombas最終把Cmm 的名字改成了ScriptEase。後來,Nobas公司爲當時如日中天的Netscape瀏覽器(在九十年代市場份額一度達到九成。。  隨後本博客也將推出瀏覽器簡史)開發了一個可以嵌入網頁中的CEnvi版本,這也使得ScriptEase成爲了歷史上第一個客戶端腳本語言。



二、大佬加入——Netscape與LiveScript

            

        在那個年代,上網衝浪剛剛開始廣泛流行。 當時,大部分人們還用着28kbit/s左右的調制解調器連接到網絡,在網頁已經開始變大變複雜的情況下,瀏覽速度開始變得很慢。更令人難以接受的事情是,由於缺少瀏覽器腳本語言,僅僅是一個表單的有效性驗證,就需要客戶端與服務器進行多次交互。在當時的情況下,經常發生的令人抓狂的事情是:用戶提交完一個表單,經過了30秒的等待,等來的卻僅僅是一個提醒你一個字段無效的信息。。。。。。受到了ScriptEase的啓發,彼時處於行業頂端的Netscape公司開始認真考慮開發一種客戶端腳本語言來解決這個問題。

        當時就職於Netscape的Brendan Eich接受了這個任務:爲將要在1995年發佈的NetscapeNavigator 2.0版本中開發一個腳本語言——LiveWare。後來很快改名爲LiveScript。起初這個語言的目標是爲非專業開發人員提供一個方便的工具,使得沒有編程背景的網站設計者有一個工具,因此一個簡單、易學的弱類型動態解釋語言誕生了。Brendan後來說他完全沒想到當年無心設計的一個語言成爲了當今最流行的腳本語言,他也被稱作JavaScript之父。

              Brendan Eich——JavaScript之父



三、高潮到了——爲啥叫JavaScript呢?

            

        在Netscape爲將要開發的瀏覽器腳本語言做籌劃的時候,關鍵事件出現了。1995年,Sun公司將Oak語言改名爲Java,正式向市場推出,並大肆推廣Java applet的概念(Java applet,即Java的一個客戶端組件,可以在瀏覽器中運行,這纔是今天大衆眼中JavaScript的樣子)。Netscape動了心,和Sun公司結盟,允許Java程序以applet的形式,直接在瀏覽器中運行。甚至還考慮直接將Java作爲腳本語言嵌入網頁,只是因爲這樣會使HTML網頁過於複雜,運行速度過慢且操作不便,最終Netscape放棄了這個計劃。然而當時Netscape公司的整個管理層都是Java的信徒,這也直接影響到了這個即將誕生的語言的未來。

        這個時候,34歲的BrendanEich接受了這個任務。Netscape高層給他的決策是這樣的:未來的腳本語言必須“看上去與Java足夠相似”,但是比Java簡單使得更多人可以容易地上手。然而Brendan對Java一點興趣也沒有,如果不是公司的決策,Brendan Eich絕不可能把Java作爲JavaScript設計的原型。爲了應付公司安排的任務,他只用了十天就設計出了LiveScript。他的設計思路是這樣的:C的基本語法+Java的數據類型與內存管理+提升函數的地位+使用基於原型(prototype)的繼承機制(借鑑自Self語言)。這也是JavaScript在今天顯得很獨特的原因:它是簡化的函數式編程與簡化的面向對象編程的結合體。不過我們的JavaScript之父一點都不喜歡他的這個作品,他說:“與其說我愛Javascript,不如說我恨它。它是C語言和Self語言一夜情的產物”。

        隨後Netscape和Sun合作完成了LiveScript的實現。在NetscapeNavigator 2.0發佈之前,爲了取得Sun的支持,也爲了利用Java這個當時的互聯網時髦詞彙,LiveScript更名爲JavaScript。JavaScript的名稱只是源自Netscape公司的一個市場決策然而Netscape絕不會想到這個市場策略帶來了如此大的負作用。多年來到處都有人混淆Java和JavaScript兩個不相干的語言,其實兩者僅僅是名字相似,以及有着公司層面的歷史淵源而已。Brendan Eric爲此抱憾不已,他在十年後的演講“JavaScript at Ten Years”中說到:“Don't let marketing name your language.”

        在這裏我們再提一句咱們的JavaScript之父。2014年三月,BrendanEric出任Mozilla的CEO。然而僅僅上任十天就被迫辭職,原因是他曾經出資支持反同性戀行爲,並在這件事情上態度強硬,不願道歉。於是他成爲了Mozilla歷史上在任時間最短的CEO~~ 在這類問題上有着類似經歷的還有洛杉磯快船隊的前老闆唐納德.斯特林(Donald Sterling)和夏洛特市,前者因爲種族歧視言論遭受重罰,被清除出了NBA;而夏洛特市因爲推出了反同法案失去了2017年全明星賽的舉辦資格。。(這裏話題果斷扯遠了。。。。。。)



四、微軟的加入與標準化

        

        在Netscape如日中天的時候,Boss出現了。Microsoft用InternetExplorer 3隨Windows 95捆綁銷售的策略輕鬆擊敗了Netscape Navigator,使得IE成爲了市場佔有率最高的瀏覽器。Internet Explorer的成功不僅僅源自市場營銷策略,其產品也非常優秀,其中非常重要的一點是它也實現了類似於JavaScript的客戶端腳本語言——JScript。

——Internet Explorer 3

        這個時候,市場上有三種客戶端腳本語言同時存在:JavaScript、Jscript、ScriptEase。這個時候並沒有一種標準來統一客戶端腳本語言的語法和特性,三種語言三足鼎立之勢更加劇了混亂,瀏覽器間出現了越來越多的兼容問題。業界的擔心與日俱增,標準化勢在必行。1997年,最初的JavaScript標準由諸多軟件廠商共同提交給ECMA(歐洲計算機製造商協會)。後來ECMA通過了標準ECMA-262,也就是現在的ECMAScript,國際標準化組織也採納了ECMAScript標準(ISO-16262)。自此開始,瀏覽器開發者們就開始努力以ECMAScript作爲規範來實現JavaScript解析引擎。在這裏強調一下,ECMAScript只是一個標準,並不是一個具體的語言實現。除了JavaScript之外,著名的ActionScript(Adobe公司開發的用於在Flash中控制動畫效果的腳本語言)、QtSctipt、WMLScript等也是ECMAScript的實現。而現在的JavaScript也不全是ECMAScript的實現,還包含着其他部分。

        在這裏很多同學可能會想到,既然已經實現了標準化,爲什麼現在還會有這麼多瀏覽器兼容性問題存在呢?現在意義上的JavaScript是由ECMAScript、DOM(文檔對象模型)、BOM(瀏覽器對象模型)共同組成的,而瀏覽器的兼容問題當然不僅僅取決於ECMAScript,而是一個由DOM、BOM、CSS等的解析差異共同構成的複雜問題。各個瀏覽器爲了競爭,也爲各自的瀏覽器添加了各自獨特的對象與函數。這些都造成了前端領域嚴重的瀏覽器兼容問題。萬維網聯盟(W3C)針對這些問題提供了很多的標準建議,目前已經被幾乎所有廠商和社區接受,連IE也不再站在衆廠商的對立面,開始逐漸支持一些其他特性,因此這個問題正在逐漸改善,變得不像前幾年那麼嚴重。然而由於國內一大批頑固羣體不願意將Windows7甚至是Windows xp系統升級到Windows 8以上的版本,導致IE6-8版本的瀏覽器以及對應相應IE內核版本的的國產貼牌瀏覽器的份額依然不低,國內的前端人還沒有迎來在兼容問題上真正的春天~



五、Web2.0時代的到來——Ajax技術的問世

        

        在這個部分的開頭,首先要說明一下,“Ajax的大幅應用象徵着Web2.0時代到來”這個說法,是有待商榷和不嚴謹的。Web2.0與Web1.0最顯著的區別在於,Web1.0時代中,信息的流通方向基本只是由服務器流向用戶,就類似於我們每天上門戶網站查看新聞的行爲;而在Web2.0時代中,信息的流向變成了雙向的,以博客和BBS爲代表的服務使得每個用戶都可以成爲信息源。而以Ajax爲核心的Web2.0技術的問世,使得頁面和用戶的交互踏上了一個新的臺階,產生了翻天覆地的變化,相襯着Web2.0時代到來互聯網世界大的變化,非常應景。所以我還是使用了這個或許不準確的標題。下面展開正題。

        在實現標準化之後,JavaScript迎來了一段時間的穩步發展。直到2004年。如果說Netscape是Web1.0時代裏當之無愧的領頭人的話,Google就當仁不讓地成爲了Web2.0時代的帶頭大哥。在這一年,Google的一批新版本的Web程序極大地刷新了人們的視野:在Google、Google Map、GMail、Google Suggest等程序中,Ajax技術的大量使用帶給了用戶非凡的使用體驗,並標誌着RIA(Rich Internet Application:富Web應用程序)的起步。在之前,Web應用中缺少與桌面應用程序類似的豐富的界面元素,且每次與服務器的交互都需要重新刷新頁面,之前在頁面上的一些作業或者閱讀進度就會全部消失,這是傳統Web應用程序明顯的缺陷。而Ajax技術的出現解決了這個問題。Ajax使得用戶可以與服務器進行異步通信,只刷新頁面的一個部分,這個特性使得新的Web程序免除了重載頁面所帶來的硬傷並可以模擬出類似於桌面應用程序的豐富的界面元素,使得用戶的使用體驗有了質的飛躍。

         然而,Ajax技術並不是2004年出現的,甚至Ajax這個詞也不是2004年出現的。2005年2月,AdaptivePath公司的Jesse James Garrett才最早提出了這個概念,他在文章"Ajax: A New Approach to Web Applications"中描述了Web開發的新趨勢。而Ajax技術的起源則要追溯至1998年前後,當時OutlookWeb Access小組寫出了世界上第一個允許客戶端腳本發送HTTP請求的組件,隨後成爲了Internet Explorer 4的一部分,使得XMLHttpRequest對象可以用ActiveX對象的方式來創建。而Outlook Web Access也被認爲是第一個應用了Ajax技術的成功的商業應用程序。 2005年伊勢,Ajax迅速成爲了業界最矚目的技術,成爲了之後Web開發幾乎不可或缺的技術。自此,JavaScript也開始逐漸崛起,不再是從前那個僅僅用於製作Web頁面的簡單腳本,而可以承載越來越豐富的應用程序。



六、JQuery的流行

            

        先前提到,當前的JS是由三個部分組成的:ECMAScript、DOM、BOM。而有前端開發經驗的童鞋一定體會過,在頁面中實現一些效果,會需要大量的DOM操作。應用原生JavaScript開發,我們往往需要寫一大堆代碼來獲取到一個元素(我們不可能給所有的元素都添加ID。。。而且很多時候獲取元素是必須我們通過事件源或者DOM樹進行查找的),再寫一大堆代碼來完成我們的操作。當這種操作次數很多時,編寫JavaScript代碼就會變成一件很頭疼的事情。在這個方面,大蝦們往往會對常用的操作進行封裝,做出一個自己的函數庫來提升開發的效率。在這個背景下,JavaScript程序庫誕生了,它會封裝好很多預定義的對象和實用函數,幷包含了一些瀏覽器兼容問題的解決方案,迅速獲得了業界的認可。

        最早成型的JavaScript程序庫是Prototype,它於2005年由Sam Stephenson開發。Prototype一度非常流行,紐約時報、蘋果等大公司的網站都使用了這個程序庫。不過由於對面向對象把握不到位造成的結構鬆散,以及其擴充JavaScript內置對象的核心點與JS之後大的發展方向不符(後來JavaScript程序庫的發展方向爲增加新的API,這與擴充內置對象這一做法相悖,另外業界也更青睞更輕量、結構化的程序庫),Prototype並沒有獲得太大的成功。

     Sam Stephenson,Prototype的作者。(感覺國外程序猿顏值都可以的說)

    

         2005年8月,John Resig在blog上發表了自己對Prototype的“Behavior”部分的一些語法改進意見,引起了業界的廣泛關注。John也開始認真考慮開發一個語法更加簡潔的JavaScript庫的想法。2006年1月,John創建了JQuery開源項目,拉開了JQuery風靡前端開發者的大幕。同年8月,JQuery的第一個穩定版本發佈。次年7月,JQuery1.1.3的發佈標誌着JQuery的性能正式超過其他的JavaScript庫。JQuery的理念是“Write less,do more.”,這個也得到了堅決的貫徹,同樣的程序使用JQuery開發的代碼量要比使用原生JavaScript少了許多,其獨特的選擇器、鏈式操作、事件處理機制和封裝完善的Ajax也爲其增色不少。JQuery極大地簡化了開發人員操作DOM、處理事件、製作動畫以及開發Ajax程序的操作,已經成爲了現在前端人員技術棧裏必不可少的一員。

   ————John Resig(你們覺得他和Prototype的作者誰顏值高?)


         除了JQuery之外,還有許多其他非常優秀的JavaScript庫,比如Dojo、Ext JS、MooTools等等,有些大公司也會開發自己的前端框架,比如咱們都有所耳聞的Kissy,就是由淘寶的前端工程師們發起創建的一個JS庫。



    

七、跳出瀏覽器——Node.js的問世

           

        在介紹Node.js的問世之前,不得不提的事情有兩件:JavaScript引擎效率革命和CommonJS規範的提出。

        第一款JavaScript是由Brendan Rich在Netscape Navigator中開發的SpiderMonkey,這款引擎隨後還出現在Firefox1.0~3.0中。之後還出現了TraceMonkey(Firefox3.5)、JaegerMonkey(Firefox4.0+)、V(Google Chrome)、Chakra(IE9+)等等引擎。而在過去,JavaScript之所以不受重視,一方面是因爲它僅僅被用來製作表單驗證、頁面效果等等網頁上的功能,另一方面它的執行效率也不高,不僅速度慢而且內存佔用也很大。這個狀況在2008年得到了改善。那一年,Mozilla Firefox的一次改動,使得Firefox3.0的JavaScript性能大幅提升,在瀏覽器間激烈競爭的背景下,一場JavaScript引擎之間的效率競賽開始了。Webkit團隊、Google團隊以及IE等等都相繼發佈了新的JavaScript引擎,提升着效率。最終Chrome2搭載的V8引擎成爲了JavaScript引擎的速度之王。時至今日,各瀏覽器間的JavaScript效率已經不相上下,這場競爭也使得JavaScript的效率超越了其他所有傳統的腳本語言,並帶動了解釋器的革新運動。而這個V8引擎就是即將登場的Node.js所採用的引擎。

        與ECMAScript不同,CommonJS是JavaScript在瀏覽器外實現的語言標準。其實在JavaScript問世之初,Netscape就實現了服務器端的JavaScript,然而由於種種原因,服務端JavaScript並沒有流行開來。隨後JavaScript逐漸成爲了客戶端開發的代名詞,而服務端開發則是由JSP、PHP、ASP三種技術領銜。隨着引擎革命,JavaScript在服務端的優勢又被重新提及,再加上MongoDB等新型非關係型數據庫都採用了JavaScript和JSON(JavaScript對象表示法)作爲數據操縱語言,JavaScript的服務端實現開始遍地開花,Node.js就是其中最閃亮的一環。爲了統一JavaScript在瀏覽器外的實現,CommonJS誕生了。它試圖定義一套普通應用程序使用的API,填補JavaScript標準庫過於簡單的不足,最終制定出一個類似於C++標準庫一樣的規範,使得基於CommonJS API的應用程序可以在不同的環境下運行。CommonJS還在不斷完善之中,而現在熱門的Node.js、ringojs、mongoDB、CouchDB都是CommonJS的實現。

        而NodeJs到底是什麼呢?第一次聽到這個名詞可能會以爲Node.js和JQuery等等一樣是一個JavaScript程序。其實Node.js是一個用C++語言編寫而成的JavaScript運行環境,它對Google V8引擎進行了封裝,並對一些特殊用例進行優化,提供了很多系統級的API,使得其在非瀏覽器環境下運行得更好,並提供了很多其他語言能夠實現的很多功能。它採用事件驅動機制以及非阻塞的I\O模型,使得其輕量而高效,在併發上性能出衆,非常適合I\O密集型的網絡程序。2009年2月,其作者Ryan Dahl就在博客上宣佈準備基於V8創建一個輕量級的WEB服務器並提供一套庫。在開發之初,Ryan準備使用Ruby語言來開發,但是後來發現Ruby的虛擬機性能無法滿足要求,隨後便轉向了C++語言。而爲了強調其實一個JavaScript的運行環境,特意取名Node.js。在2009年5月,最初版本的Node.js包在GitHub上發佈了,隨後幾個月裏就有人開始使用Node.js開發應用程序,並貢獻了很多包。很快引發關注的Node.js登堂入室,在09年11月和10年4月的兩次JSConf大會上都擁有了自己的講座。2010年底,Node.js正式獲得雲計算服務商Joyent的資助,並請來了創始人Ryan Dahl全職負責Node.js的未來發展。2011年7月,Node.js獲得了微軟的支持,發佈了其Windows版本。在逐步的發展之中,Node.js也逐漸發展成一個成熟的開發平臺,不僅僅用來開發一些大型高流量網站,更有很多快速移動的Web框架是基於Node.js開發的。除此之外,應用程序監控、媒體流、遠程控制、桌面和移動應用等等看似和JavaScript無關的開發領域,也因爲Node.js的發展而看到了JavaScript的身影。可以說,正是由於Node.js的成功,使得JavaScript不再是從前那個僅僅用來爲網頁添加動態效果的腳本語言,而成爲了今天最流行的編程語言之一~



八、JavaScript將要走向何方呢?

            

        2007年Jeff Atwood(不用關心這個人是誰了。。)提出了Atwood's Law:“Any application that can be written in JavaScript, will eventually be written in JavaScript”。這句在當時沒多少人理解的話放到現在倒是不難理解:我們每天都在關注各種各樣的屏幕,從裏面獲取到各種各樣的信息,而幾乎所有的事情都可以通過瀏覽器完成,那麼所有的應用都可以使用JavaScript來寫。有的人就此得出啓示未來將是JavaScript的天下。對於這個定律咱們先暫且不談,不過JavaScript在如今的應用確實是非常廣泛了。除了最傳統的爲靜態頁面添加動作之外,還可以在以下領域見到JavaScript的身影: 數據可視化(如Processing.js、D3.js)、移動端應用(如PhoneGap、React Native)、服務端應用(Node.js、MongoDb等)、桌面應用(NW.js、Eletron)、遊戲開發(WebGL在前端的應用)、VR與AR(很多瀏覽器廠商正在推進的WebVR等)、硬件(Tessel和三星都有涉足並有產品)、物聯網(loT.js)、操作系統(Firefox OS)等等,確實是令人眼花繚亂。雖然當中很多方向都是正在起步,不過確實令我們看到了JavaScript多彩繽紛的未來。

        從最初簡單、效率底下的腳本語言到如今,JavaScript正是靠着不斷地擴展逐步發展起來,在逐漸強大的過程中,也需要新的語言特性或改進來爲其提供更強的支撐。在這個方面,JavaScript也在努力。2015年,ECMAScript的最新版本ECMAScript6問世,它也帶來了很多新的特性,令開發人員欣喜。它帶來的多行字符串、箭頭函數、類(雖然JavaScript也是一個面向對象的編程語言,但是由於採用了基於Prototype的繼承機制,一直以來它都沒有Class關鍵字以及相關語法)以及模塊等新的特性,受到了前端開發人員的歡迎。隨着新標準的逐步推進,各個主流瀏覽器也必然會支持ECMAScript6。在新的標準推出、新技術不斷出現的環境下,JavaScript開發將會走向何方呢?讓我們拭目以待吧~

 


鏈接推薦:

         1、JavaScript at 20 Years - Brendan Eich (這是2015年JavaScript20週年的時候,創始人Brendan Eich的演講,是YouTube視頻,需要翻牆觀看)   

也可以點擊:Brendan Eich在15年JS二十週年的幻燈片 

         2、退而求其次的話,可以看 Brendan Eich, JavaScript at 18 Legal to Gamble,18週年時Brendan的演講,優酷資源~

         3、那些用JavaScript寫的操作系統

         4、在瀏覽器中體驗Windows98

         5、物聯網開發框架—IoT.js Windows10也支持

         6、WebVR如此近 - three.js的WebVR示例程序解析


參考資料:

         1、《Node.js開發指南》——BYVoid著

         2、《JavaScript權威指南》——Flanagan著

         3、最流行的編程語言JavaScript能做什麼?

         4、W3C

         5、Nodejs.cn

         6、www.dnodejs.com


     


發佈了29 篇原創文章 · 獲贊 30 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章