JavaScript 恩仇錄
前段時間看了一本書講 ?JS 發(fā)展史的書(感謝 @doodlewind 翻譯這本書)??赐旰团笥蚜牧藭?,他說你別和我嘮什么規(guī)范、語言設計,我就想聽八卦,你和我嘮八卦,我就不困了。所以就有了這篇盡量減少技術細節(jié)的八卦文,文章略長,各位看官慢慢品。
JavaScript(下文簡稱 JS )是 目前最為流行的編程語言之一,在計算機的世界里它也是一個軟件。如今,我們使用它編寫頁面和數(shù)據交互邏輯、搭建組件庫、實現(xiàn)可視化效果和各種算法等等。StackOverflow 聯(lián)合創(chuàng)始人 Jeff Atwood 曾說: “所有能用 JS 實現(xiàn)的,最終都將使用 JS 實現(xiàn)”[1],目前來看似乎已經得到了部分的證實。
同其他同類一樣,作為一門編程語言性質的軟件,JS 有 bug、也會倒排趕工期、經歷迭代,還有來自“老板”的需求,甚至還有多部門共建時搞出了一堆問題的情況。今天,和大家一起扒一扒這段曲折精彩的歷史。
互聯(lián)網的新紀元

1991 年 8 月 2 日,一位來自歐洲核子研究組織的工程師 Time Berners Lee 在郵件組里群發(fā)說他做了一個項目,叫萬維網(World Wide Web),這個項目里大致做了這樣幾個東西: 一個用于網絡傳輸?shù)膮f(xié)議 (HTTP)、一個超文本標記語言(HTML)、一個命令行的瀏覽器、一個在 NeXT 電腦上 運行的 HTML 編輯器、一個服務端可以生成文件的軟件。目的是給物理學家們交流新聞、信息、文檔,項目比較初級,希望感興趣的人聯(lián)系他一起交流[2]。從互聯(lián)網誕生之日起,Web 的初心就相當純粹:“希望提供人人可以訪問的、用來交流分享信息的場所”。
很快,這個項目就從高能物理學圈這個使用范圍逐漸擴大到其他使用計算機的用戶上,1992 年,世界上有了 26 個網站,這個年底,在美國國家超級電腦應用中心工作的兩名小伙 Andreessen 和 Bina,在同行產品的啟發(fā)下搞了另外一個新的瀏覽器取名 Mosaic,相比于命令行的瀏覽器,Mosaic 具有更美觀的圖形化界面、更加好用一些。一下讓本來還不算火爆的互聯(lián)網火爆了起來,到 1995 年,世界上存在的網站數(shù)量已經超過了 1 萬個[3]。
誕生之日

在這一發(fā)不可收拾的浪潮中,1994 年 Andreessen 和 Bina 和硅谷圖形公司的 Jim Clark,成立了一家新的叫做 Netscape(網景) 的公司,希望做出更好的瀏覽器替代 Mosaic,在 1994 年 10 月,公司發(fā)行了一款新的瀏覽器 Netscape Navigator,這款瀏覽器很快就火了,逐步替代掉了 Mosaic。
在當時,微軟 Office 套件中提供了可以自定義的 VB 來編寫一些特殊功能, 蘋果也提供了 AppleScript 來解決用戶想要自己編寫特殊腳本的需求。業(yè)界也涌現(xiàn)了是不是要有一門語言能讓開發(fā)者操作 HTML 的想法。1995 年 網景 招聘了一名之前從事 Unix 網絡、內核這些底層開發(fā)的程序員 Brendan Eich,希望他來解決瀏覽器里操作 HTML 的語言的問題。
當時商業(yè)環(huán)境復雜,1995 年,Sun 公司開始為即將發(fā)布的 Java 做各種營銷,找到了網景,希望做一些合作。網景表達了合作意向,希望在 Netscape Navigator 2 中集成 Java,這個合作意向讓 Brendan Eich 的工作徹底難辦起來,不僅技術選型更困難了,距離發(fā)布會的時間也相當?shù)亩獭6虝r間實現(xiàn) Java 和 HTML 的整合是不可能的,且 Java 還沒正式發(fā)布, 第一版也不好用,包括 老板 Andreessen 本人對 Java 也有一定的懷疑。這次運營活動,讓開發(fā)很為難,最后 Andreessen 拍板臨時實現(xiàn)一門語言,最后這門語言最后應該會叫做 “JavaScript”。
Brendan Eich 本來是想集中精力搞一個運行在瀏覽器的 Scheme 語言,但是這次時間顯然非常倉促,公司還要求在外表上盡量接近 Java 并且學習使用門檻要低。他花了 10 天完成了語言的原型,后面稍微做了一些補充性的改動,在 1995 年 9 月正式發(fā)版[4]。在這一段時間里,Eich 除了要實現(xiàn)老板提到的這些需求,也摻雜了大量的過往經驗。JS 的背后有很多設計參考了 C、Self、HyperTalk、Awk、Logo、Lisp 這些語言。當時有人提出需要實現(xiàn)和 Java 一樣的面向對象功能,但是時間顯然不夠,Eich 參考了 Self 實現(xiàn)了原型模式[5]。

就這樣,經歷了倒排、來自老板的需求、面向發(fā)布會編程,JS 開啟了它的歷史使命。
瀏覽器之爭

早在 1994 年,微軟向網景表達了低價收購意向,被網景拒絕了。微軟也在蓋茨的領導下開始將戰(zhàn)略調整到 Web 方向上[6],開始重點投入 IE 瀏覽器。微軟和網景也從此進入了對峙階段。
在 JS 正式發(fā)布后,微軟立刻宣布,接下來會致力于將 VB 推廣為 Web 的主要語言。但直到第二年 5 月底,微軟才宣布自己做了個和語言無關的標準,支持包括 JS、VBScript 在內的多種腳本語言。
而這一年對微軟來說也是難過的一年,Robert Welland 于 95 年 10 月加入微軟,主要工作就是研究 VB、JS 在 Web 上的支持。首先,VB 團隊評估要支持 Web 工時大概是兩年,希望 VB 直接支持的瀏覽器的希望破滅了。同時,JS 在當時沒有規(guī)范可言,為了支持這門語言,Welland 等微軟工程師需要逆向的去猜測網景實現(xiàn)的那版 JS 的底層實現(xiàn),逆向的結果讓他們十分震驚和迷惑,罵聲不斷。網景的同行也在這段時間遭受了大量來自微軟的批評。最后,他們基于 VB 的一些特性,實現(xiàn)了一個腳本的子集,叫 VBScript,另外基于對 JS 的逆向,稱之為 JScript[7],最后這些被打包為 ActiveScript,在 96 年 5 月發(fā)布。
因為在 JS 上遭受了不少的同行批評,網景的老板 Andreessen 希望 Eich 投入到 語言規(guī)范的投入上。而 Eich 這段時間只想把 JS 前一版本中遺留的一些問題給解決掉,并且優(yōu)化對應的性能,和老板的安排發(fā)生了一些沖突,所以 有個性的 Eich 回家辦公了兩周,集中時間開發(fā)了一個新的版本的引擎,代號為 Spider Monkey[8],這次改造后性能有了較大提升。
Web 從誕生之日便決定了它開放的性質,任何想要壟斷和封閉的行為都會失去市場。在開放的環(huán)境中競爭,微軟和網景的競爭暴露了 JS 在標準實現(xiàn)上的不足,因為一開始沒有標準可言,讓互聯(lián)網的開發(fā)者們遭受了更多的痛苦,不得不說,商業(yè)和技術兩全其美的愿望是艱難的。
事實標準

在商業(yè)視野上來說,Andreessen 的判斷并沒有錯,他的期待是能將 JS 這門語言推廣為 Web 腳本的事實標準。商場如戰(zhàn)場,一旦微軟主導了開發(fā)語言,比如使用 VB 開發(fā) Web,瀏覽器乃至整個互聯(lián)網都會有走向封閉的趨勢。
包含著商業(yè)利益的目的,網景和 Sun 在 1996 年春天非常積極的在尋找一個標準化組織制定 JS 的標準化。同時希望做到微軟可以參與,但是不能成為標準化的主導者。他們找了 W3C 和 IETF 兩個組織,W3C 元老級人物 Time Berners Lee 等人反對由 W3C 來制定 JS 標準,IETF 更多是關注各類 Web 標準協(xié)議的事情,覺得 JS 標準不適合他們來制定。此時,網景的標準化專家恰好認識 ECMA 組織的秘書長,另外 Sun 也是 ECMA 的會員,利用人脈關系,可以做到又快速的產出標準,又能將微軟的參與度控制在合適的范圍內。為了討論這個標準,他們成立了第 39 號技術小組(簡稱 TC39)來討論。
TC39 小組有一些公約,比如將 HTML 標準交給 W3C 去制定自己不參與、同時不討論這門語言在特定平臺和環(huán)境下的功能。在他們的第一次討論會上,主要有網景和微軟提供的兩份標準化文件,其中微軟的兩名貢獻者語言背景更為專業(yè)和深厚一些,他們對標準的講解的內容受到了更多人的喜歡。經過很多次會議討論,求同存異,ECMA 組織制定出了第一版 JS 標準。
因為 「JavaScript」 的商標是由 Sun 注冊的,Sun 明確表示不會將這個商標轉移給 ECMA 標準組織,最后經過各種抉擇,選擇使用 ECMAScript 來作為發(fā)布標準的語言名稱,文檔編號 262,所以 JS 的標準文檔都叫 Standard ECMA-262。
到此 ECMAScript 第一版發(fā)布完畢,但是國際化標準組織(ISO)經過審核發(fā)現(xiàn)了很多問題,希望 ECMA 進行一部分修改,所以 這中間又發(fā)了一版,稱為 ES2,因為改動很小,所以這個版本很少被提及。有趣的是,TC39 在并不知道 ISO 這邊非得發(fā)一個新的版本才能通過審核之前就開始了下一階段的討論,所以他們開啟了 V2 版本的討論實際上對應發(fā)版的是 ECMAScript 3。
伴隨著標準化的進程,開發(fā)者們也逐漸意識到所謂的「JavaScript」本質上只是一個噱頭,跟 Java 沒有半毛錢關系。此時也誕生了一位著名的 JS 布道師,就是寫了那本 《JavaScript 語言精粹》的 Crockford[9],他做了 JS 的初版壓縮工具 JSMIN、第一個 JS 的 Lint 工具、還定義了 JSON 這種數(shù)據格式。這位大佬不多說,后面我們還會提到他。
革新年代

1997 年,微軟發(fā)布了電子郵件客戶端的 Web 版本[10], 后續(xù)他們更新了一個新的版本使用了動態(tài) HTML,還使用了一個新的瀏覽器 API,叫 XMLHttp,這個 API 可以做到不刷新頁面也能更新局部的 UI,這個在如今看來不起眼的小功能在當時可是了不得的一項突破。雖然微軟技術超群,但是這種技術廣為人知的版本卻是:“2000 年左右,Gmail 使用這項技術實現(xiàn)他們的 Web 版本,從此世界上的 Web 技術發(fā)生了革新,正式進入 互聯(lián)網 2.0 時代”。
伴隨著技術的革新,網頁的復雜度也在倍數(shù)增長,瀏覽器兼容性又十分惱人。為了開發(fā)者良好的體驗,這個階段成長起來相當多的 JS 工具,比如 Dojo、Prototype、MooTools、jQuery 這些在一定程度上給開發(fā)者屏蔽了處理瀏覽器的細節(jié)。針對這種現(xiàn)象,甚至出現(xiàn)了一個新的詞來定義。在暫時不支持某項功能瀏覽器上支持新特性的補丁腳本 --- Polyfill[11] [12]。
也正是在這個發(fā)展過程中,網景遭受來自微軟的惡意競爭,一方面大公司碾壓級別斗小公司,外加微軟的操作系統(tǒng)瀏覽器捆綁,網景逐漸式微,1998 年網景最終選擇開放瀏覽器源代碼(后發(fā)展為 Firefox),公司主體也被美國在線收購。而微軟成為了這次競爭的贏家,后續(xù)也在不思進取逐步又丟失了自己創(chuàng)造的大好局面。
網景的這幫人,雖然在商業(yè)上的競爭上失敗,但從失敗后選擇開源繼續(xù)做瀏覽器這件事上看,真的是令人佩服,為純粹和理想主義點贊。
宏圖愿景
1998 年,JS 標準 ES3 基本完成了標準和瀏覽器對語言實現(xiàn)的接軌。TC39 也開始籌劃新版本的 JS 標準 ES4, 對于 ES4 語言專家們初期的想法都是希望能成為新的里程碑,改掉老設計中錯誤的地方。在這之前,大家構想了特別多的想法,比如支持 class 和 模塊 還有 package 等概念,這些提案沒有納入 ES3 標準,所以希望在 ES4 中能添加。
在 ES4 的討論會上,來自惠普贊助的 W3C 研究員提出一個叫做 Spice 的提案[13],用于將 HTML/CSS/JS 結合的更緊密,這個提案整體反饋比較負面。但是部分內容值得考慮。討論了幾輪沒啥結果,為了確保 99 年 1 月能提交一份合理的提案給 TC39, 他們單獨成立了一個小組叫 TC39-Spice,討論了一些高級一點的概念,比如類型注解、類、接口、流式執(zhí)行模型等特性,里面有大量的內容都和 ES3 不兼容。當時 ES3 還沒正式發(fā)版,討論中其實遇到很多沒解決的問題,但是大家精力還是集中在 ES3 的發(fā)版上。
2000 年,微軟覺得目前關于 ES4 的提案太大了,砍掉了一些,希望 12 月能發(fā)布,當時微軟的興趣就在于「類型注解」。到當年的 6 月,微軟發(fā)布了 .NET Framework, 在這之前他們因為項目的保密性沒法和 TC39 討論 .NET,但是發(fā)布之后他們就可以好好聊一聊了,于是他們找了 TC39 里的核心成員討論了一些 ES4 標準上的分歧,也沒得到個所以然。更讓人頭大的事情是 微軟希望 ECMA 能承擔 .NET 的標準化工作,于是又讓 TC39 去搞 .NET 的標準化,本來討論 JS 的小組,被降級為 TC39-TG1,后面參與的人越來越少,這個小組最終降級成為了一個討論 ECMAScript 對 XML 的支持小組,最終搞了一個標準叫 E4X,這標準搞出來就是個失敗的產品,最后只有 Firefox 實現(xiàn)了這個標準,現(xiàn)在已經沒人知道他是干嘛的了。
從 98 年到 2000 年,兩年時間大家興致沖沖的設定了下一代編程語言的宏圖愿景,最終卻因為瀏覽器斗爭、沒有核心領袖牽頭人導致發(fā)展十分混亂, 最后黯然收場。
不死心與理想派

2000 年,一家叫 Macromedia(宏媒體)的公司,發(fā)明了一個新的軟件叫 Flash,并且配套了一門編程語言 ActionScript,當年 Flash 大紅大紫,從 03 年左右開始,F(xiàn)lash 在 web 開發(fā)中得到了比較多的應用。因為 ActionScript 是基于 ECMAScript 來實現(xiàn)的,隨著發(fā)展,AS 遇到了較大的發(fā)展瓶頸時,想改語言本身,恰好又有來自 TC39 的大佬,所以想著是不是能把 AS 的一些改造推到標準里面一起建設,其實這里本質上和微軟的思路一樣,希望以自己家的東西成為事實標準。
2004 年,ES4 還沒有討論個所以然出來,作為元老,Breadan Eich 在投入 Firefox 開發(fā)的間隙中抽時間站出來說你們這樣搞不行,Web 本身就是開放的,你這一會兒 .NET, 一會兒 ActionScript, 搞這些封閉的東西,莫不是想毀掉老夫的心血?
差不多到 2005 年,工作小組終于可以抽時間搞語言本身的事情,差不多花了兩年時間,Eich 帶著小組搞了差不多五十多個提案,像解構、let、const 、iterator、generator 這些東西都是在這段時間內完成設計的。但是這門語言是不兼容之前版本的,幾家歡喜幾家愁。
這兩年微軟全程沒有參與規(guī)范的制定。這里一位大佬橫空出場,Allen Wirfs-Brock,作為微軟的專家,出于對微軟戰(zhàn)略層面上的考慮,覺得 ES4 這個改動可能會讓 ActionScript 變成和 Java、C# 一樣的企業(yè)級開發(fā)語言,會威脅到微軟,所以微軟你要安排點資源到 JavaScript 標準上來。等他參與進來安排同事發(fā)了封郵件聲明了微軟對 ES4 的反對[14], 這郵件把 Eich 給氣壞了,直接回了一句 「Profiled specs are evil(Profile 提案真的邪惡)」。
與此同時,前文提到的 Douglas Crokford 也是 ES4 的反對者,他覺得安全的兼容比任何優(yōu)異的特性更為重要,于是微軟、雅虎的兩名核心人物成了 ES4 的反對者。另外 ES4 也很艱難,還有很多問題沒解決,規(guī)范也沒有產出,現(xiàn)在又有了兩大反對者,確實很難辦。
后續(xù)差不多分裂出來兩派人物,一派繼續(xù)支持 ES4 的開發(fā),一派繼續(xù)保持兼容開發(fā) ES 3.1。
2008 年 6 月,Adobe 放棄了支持 ES4 開發(fā),也標志著 ES4 規(guī)范設計的失敗,從 1998 到 2008,ES4 背負了太多歷史使命,花了十年最終還是難產了。
ES4 失敗了,但我突然喜歡上了 Breadan Eich 這個技術人,很純粹,討厭封閉的行為,希望 Web 始終保持開放,雖然失敗,但還是得給他點贊。
偏見
說到這,大家肯定覺得,Allen Wirfs-Brock 這個人不是好人啊,這兩年內微軟也沒參與 ES4 的建設,你跑過來就是一頓指指點點,說三道四,最后 ES4 涼了,你們微軟高興了吧。
但作為一個技術人,還是不要輕易評判。一方面 Allen Wirfs-Brock 肯定發(fā)現(xiàn)了 ES4 的問題,另外一方面肯定也有一定的私心,為自己的雇主微軟工作。后面他做的這些事情,或許你也會改變對他的看法。
他率先整理了所有 JScript 和 JS 之間的差異,主動努力去解決兼容性的問題,不再討論 .Net 這些東西在 Web 上的支持,而是就以 JS 的發(fā)展為主要目標,穩(wěn)步的迭代出 3.1 版本,為了測試最后瀏覽器的兼容問題,主動公開了 IE 的 JScript 實現(xiàn)原型,Mozilla 本身就是開源,Chrome 也在類似的時間宣布了谷歌瀏覽器的測試套件。
可以說,ES3.1 幾乎讓受盡折磨的開發(fā)者們看到了一絲曙光,未來還是值得期待的,總有一天,能和兼容性說再見 ?。ES3.1 最終在提交之后發(fā)布成為 ES5。
代號「和諧」

在完成 ES5 之后,大家似乎都認識到彼此的初心,都不是為了競爭,單純出于廠商斗爭的目的變小了。TC39 成員開始著手下個迭代的開發(fā)。
這中間其實經歷了非常多的發(fā)展,比如 Coffescript 讓大家意識到可以通過一門語言編譯到 JS 來曲線救治 JS 這門語言,Google 也開始開發(fā) 性能超群的 V8 引擎,CommonJS 模塊規(guī)范、服務端的 Node 也橫空出世了。沒必要躡手躡腳的保持原有的 JS 標準小步子迭代了。
新版本的 ES 在社區(qū)也被成為 ES Harmony,TC39 設立了新的提案機制[15]、倡導者機制,讓大家可以通過規(guī)范化的流程來實現(xiàn)語言標準。
曲線登頂?shù)奈④?/span>
作為一個卑微的前端開發(fā),剛開始工作那會兒,我一直有個萌新的認知: “我寫的 JS 和微軟沒有什么關系,但是我寫的兼容代碼,一定和微軟有關系”。
最近幾年,事情似乎悄悄發(fā)生變化,我的編輯器變成了 微軟開發(fā)的 VSCode,我常逛的開源社區(qū) Github 被微軟收購了,我用的包管理 npm 也被微軟收購了,我用的 TypeScript 也是微軟開發(fā)的。
今天我還知道了,Ajax 也是微軟最早在弄的,JavaScript 的標準規(guī)范甚至也一直被微軟主導著,微軟就像那只看不見的手,主導著萬千開發(fā)者。
也許是花了幾十年才讓這家公司明白,封閉是無法獲得投票的,擁抱開放才是當今時代的精神,這幾年的微軟,確實牛逼。
題外話
我現(xiàn)在工作和區(qū)塊鏈相關,有很多人問我,你一個前端和搞區(qū)塊鏈有毛關系啊?
你們知道么?Brendan Eich 現(xiàn)在離開了 Firefox,開了一家公司叫「Brave」,還是做瀏覽器,不過是基于區(qū)塊鏈技術的。你說祖師爺都搞區(qū)塊鏈了,我能不跟著走么?
如果你正在尋找一份祖師爺也在做的工作,「螞蟻鏈招前端」
歡迎聯(lián)系我,發(fā)送郵件至「[email protected]」。
參考資料
[1] Jeff Atwood: https://en.wikipedia.org/wiki/Jeff_Atwood
[2] The Birth of The Web: https://home.cern/science/computing/birth-web/short-history-web
[3] NCSA Mosaic: https://en.wikipedia.org/wiki/Mosaic_(web_browser)
[4] Brendan Eich 談 JavaScript 的誕生: https://web.archive.org/web/20150817165652/http://devchat.tv/js-jabber/124-jsj-the-origin-of-javascript-with-brendan-eich
[5] Prototype Based Programming: https://en.wikipedia.org/wiki/Prototype-based_programming
[6] The Internet Tidal Wave: https://web.archive.org/web/20110724184430/http://www.lettersofnote.com/2011/07/internet-tidal-wave.html
[7] JScript: https://en.wikipedia.org/wiki/JScript
[8] Spider Monkey: https://developer.mozilla.org/zh-CN/docs/Mozilla/Projects/SpiderMonkey
[9] Douglas Crockford https://en.wikipedia.org/wiki/Douglas_Crockford
[10] MicroSoft Outlook on the Web: https://en.wikipedia.org/wiki/Outlook_on_the_web
[11] What is Polyfill https://remysharp.com/2010/10/08/what-is-a-polyfill/
[12] Polyfill 方案的過去、現(xiàn)在和未來 https://github.com/sorrycc/blog/issues/80
[13] Spice 提案: https://www.ecma-international.org/archive/ecmascript/1998/TC39WG/980928-spice-docs/index.html
[14] 簡化 ES4 版本討論: https://web.archive.org/web/20071103151603/http://wiki.ecmascript.org:80/doku.php?id=discussion:browser_profile
[15] TC39 Process https://tc39.es/process-document/
