初探 ES6(1)Harmony 的黑歷史 by fillano | CodeData
top

初探 ES6(1)Harmony 的黑歷史

分享:

關於ECMA-262、ECMAScript

在開始之前,還是不免提一下什麼是ECMAScript。Javascript這個語言,是有「標準規格」的,叫做ECMA-262,這個標準規格,是由ECMA International (European Computer Manufacturers Association International)這個標準組織所制定,所以也稱呼它為ECMAScript。這個規格涵蓋了所有Javascript的核心,是各種Javascript執行環境一定會有的東西。在此之上,瀏覽器內就會額外加入DOM等擴充,而像node.js這樣的伺服器端環境,也有他自己的擴充,不過核心的部份是大家都一樣的。(附帶一提,C#的標準規格也是ECMA制定的)

ES6 Harmony的黑歷史XD

雖然沒有如原先計畫在2012年底推出,但是ECMAScript應該就快邁入第六版了。這個版本有一個代號叫做Harmony(和諧),跟之前的ECMA-262 Edition 5比起來,這個版本加入了非常多的語言更新,跟之前的ECMA-262 Edition 5比較起來,更像是真正的語言更新。而ES5大概就像一個patch,主要是功能的加強。

不過呢…如果稍微熟悉ECMA-262的版本,就會發現…它從Edition 3就直接跳到Edition 5,中間少了一個版本號!這整個過程是怎麼一回事呢?

如果上去ECMAScript的官方wiki,會看到有個分類叫做「Known obsolete」,裡面有個條目「es3.1」,後面有簡單的說明:「 …was for the “maintenance of es3″ work, which become ES5」。看到這裡就恍然大悟,ECMA-262 Edtion 5原本是Edition 3.1,結果卻變成了Edition 5。這中間發生了什麼事情?

原本接在Edition 3之後要發行的版本號應該是4(廢話),代號也同樣是「Harmony」!不過經過了許多波折,最後他變成了Edition 6,而且內容也有相當大的變動。有一句話可以概括這個過程…

Javascript曾經差點變成ActionScript

沒錯,是ActionScript。這兩個語言系出同源,但是也很多地方不一樣。這個要從ECMA這個組織說起…當時,微軟的IE6「幾乎」統一瀏覽器世界。

ECMA是由底下的各個委員會來負責不同標準的制定,而負責Javascript的是TC39。基本上這是一個公開參與的組織,只要你交一大筆錢就可以加入。會加入組織的,通常都是對Javascript有意圖。例如IBM,就想把他的IEEE754版本綁進來。不同的公司基本上雖然有參與規格制定,但是主要都是想在規格中維護自己的利益。

微軟自從推出IE6後,就徹底打垮了當時他的最大的敵人Netscape。Netscape不敵微軟舖天蓋地的策略(作業系統綁瀏覽器),最後撐不下去了,決定把自己的瀏覽器技術捐出來,成立Mozilla基金會,讓這個瀏覽器可以繼續存活。

微軟完成歷史大業後,基本上對於Javascript已經沒興趣了,這時在推動ECMA-262規格制定的主力,其實是Macromedia(後來併入Adobe)。

Macromedia在推出Flash這個產品之初,本來希望獲得Java的授權。不過據說他們跟Sun Microsystem(現在併入Oracle了)在授權中有些議題僵持不下。Sun只願意做完整的授權,但是Macromedia只需要部分的Class Libraries,結果最後授權沒談成。於是Flash只好紆尊降貴,選了Javascript作為內建的程式語言。

Macromedia並沒有就此放棄,除了推出ActionScript,把語法改得更像Java,他們還積極參與ECMA-262的規格制定,我想最後目標應該就是要讓ActionScript一統Javascript。(這是合理的假設XD)

除了參與TC39委員會的運作,Adobe還有不少動作,例如捐獻他們的Script Engine(Tamarin)給Mozilla基金會。後來Mozilla也參考了Tamarin的JIT技術,開發他的下一代引擎。不過因為微軟等大廠對於新規格制定並不積極,所以規格的進程非常緩慢。ECMA-262 Edition 3是在1999年制定的,制定之後大概五六年,幾乎看不到有什麼前進的動力XD,直到AJAX這個技術以及應用出現(大概2005年左右了),帶動大量使用Javascript撰寫網頁應用的需求。這時,大家對於Javascript的注意力才逐漸回流,並且推動規格前進。

等到2007年開始緊鑼密鼓地準備ES4 Harmony的規格,一些異見逐漸浮上檯面。ES4新增的東西非常多,規格的內容根據Brendan Eich用不同方法作估計,大概是ES3的一倍,要評估這些規格是否合適出現在這個語言中會需要花很多的時間。另外,有一些規格在Web的使用比較有疑慮,例如packages、namespaces、以及early binding。這使得一些成員認為不應該倉促通過這個規格,而希望先根據ES3規格已知的問題來改良。

據說Douglas Crockford找上微軟合作,推出了改良自ES3的版本規格,叫做ES3.1,來跟ES4 Harmony。同時,微軟也在TC39會議中正式反對部分或完整地通過ES4 Harmony規格。(Brendan Eich在他的部落格有提到這件事,TC39的會議記錄也有)

這些衝突最後是改良派獲勝,結果就是ES4 Harmony被推遲,而ES3.1則成為ES5。實際上ES4 Harmony並不是僅僅延後推出,packages、namespaces以及early binding這些特性也從Harmony拿掉了。至於衝突的過程…我看到Douglas Crockford提到,Brendan Eich說他就像甘道夫,在橋上對著ES6 Harmony這個洛格(Rog)大喊:「You shall not pass!」。

總之,Crockford跟微軟聯手把ES4 Harmony檔了下來,所以我們有了ES5。(實際上是ES3.1,沒有太多新東西)然後到現在,我們終於等到Harmony的來臨。

ECMAScript上面的wiki有關於這些會議的紀錄,Brendan Eich的部落格也有一些文章提到這些爭議以及決策。另外,看了一下會議過程…有一些有趣的東西,例如JSON被ES4 Harmony拒絕,但是卻放入ES3.1…這感覺有點斧鑿痕XD

八卦就不再提了,對於TC39怎麼開會,在Youtube上面倒是有 2012九月開會的實況,並不太嚴肅,有興趣可以看一看(看起來就找個地方,擺著折疊長桌讓委員會的成員坐,旁觀的就單座鐵椅子)。

對於ES6 Harmony,我們可以期待什麼?

預計將要推出的ES6 Harmony,跟被腰斬的ES4 Harmony比較起來,除了package/namespace/early binding被拿掉,一些細節不斷的調整,ES6還加入了一些特性,這些特性使得ES6成為一個全新的規格標準。之前對於ES5可以不那麼關心,但是對於ES6 Harmony就不可忽視了,因為他加入了不少語言本身的更新,這會大幅影響我們使用這個語言的方式。(其實在node.js已經有人開跑了)先舉幾個簡單的例子:

  1.  Block Scope:在之前大家的認知中,Javascript是沒有Block Scope的語言,他的Scope是以函數為分界。不過ES6 Harmony就支援Block Scope了。只要在Block中使用let而非var做變數宣告,這個變數的scope就只屬於這個block。
  2. Class:現在可以用Class語法來組織物件的架構。Class可以用extends來繼承,支援constructor,可以用super來參考父類。不過對於Class的支援僅此而已,除了static之外,並沒有可視性的宣告等特性。所以基本上Classical跟Prototypal繼承的使用方式實際上是可互換的。
  3. Generator / Iterator:可以讓函數有不同的進入點,這讓我們在控制程式流程的控制上,有更多的選擇。這是在語法上支援才能做到的。而在最新的規格草案中(rev.22),也把原本列在Strawman中的Promise放進來了。
  4. Map / Set / WeakMap / WeakSet:除了陣列,現在有更多的集合物件可以使用了,而且可以用Object當Key來用。另外,WeakMap/WeakSet也可以用來解決無法避開的循環引用,這是Javascript中Memory Leak的主要原因。
  5. Function:加入了諸如Arrow Function、參數預設值、剩餘參數等的新語法,讓函數使用更方便。
  6. Module:透過Module,在Javascript環境中,有更好的組織系統的方法(這個大概就是packages/namespaces的替代方案了?)。
  7. Promise:用來協助解決非同步程式流程控制的問題,剛剛加入規格草案,本來是放在Strawman中。

總之還有許多東西,就不逐一列出了XD,希望在之後可以透過一系列的文章,來探索這些新規格的內容與特色。

後續 >> 初探 ES6(2)目前可以測試的平台

分享:
按讚!加入 CodeData Facebook 粉絲群

相關文章

留言

留言請先。還沒帳號註冊也可以使用FacebookGoogle+登錄留言

姜政宏02/18

小故事真有趣XDDD
期待接下來的系列文章~謝謝。

熱門論壇文章

熱門技術文章