跳到主要內容
黯羽輕揚每天積累一點點

TC39 規範制定流程

免費2020-06-27#JS#ES4规范#TC39的39是什么#JavaScript语言规范#JavaScript语言标准#JS新特性Stage

TC39、ECMAScript 與 JavaScript 有什麼關係?

一.JavaScript 的誕生

1995 年 5 月,一個叫 Brendan Eich 的人花 10 天創造了 JavaScript。

二.JavaScript 語言的標準化

最初 JavaScript 語言有 2 份標準:

  • ECMA-262:主標準,由 ECMA 國際組織(Ecma International)負責管理

  • ISO/IEC 16262:第二標準,由國際標準化組織(ISO,International Organization for Standardization)和國際電工技術委員會(IEC,International Electrotechnical Commission)負責管理

出於商標版權的原因,規範標準中將這門語言稱為 ECMAScript,所以原則上 JavaScript 與 ECMAScript 指的是同一個東西,但有時也會加以區分:

  • JavaScript:指語言及其實現

  • ECMAScript:指語言標準及語言版本,比如 ES6 表示語言(標準)的第 6 版

P.S.ECMAScript 中的 ECMA 取自負責管理主標準的 ECMA 國際組織,這個組織最初叫歐洲計算機製造商協會(European Computer Manufacturers Association),後來影響範圍不限於歐洲,遂更名為 ECMA 國際組織(Ecma International)。

三.ES 規範版本歷史

  • ECMAScript 1(1997 年 6 月):規範第一版

  • ECMAScript 2(1998 年 6 月):為了同步 ISO 標準,引入了一些小更新

  • ECMAScript 3(1999 年 12 月):增加了正則表達式、字符串處理、控制語句(do-whileswitch)、異常處理(try-catch)等眾多核心特性

  • ECMAScript 4(2008 年 7 月廢除):本來是一次大規模升級(靜態類型、模塊、命名空間等),但跨度過大,出現了分歧,最終沒能推廣使用

  • ECMAScript 5(2009 年 12 月):變化不大,加了一些標準庫特性和嚴格模式

  • ECMAScript 5.1(2011 年 6 月):又一次小更新,為了同步 ISO 標準

  • [ECMAScript 6](/articles/es6 學習筆記 13 篇/)(2015 年 6 月):一大波更新,實現了當年 ES4 的許多設想,並正式改為按年份命名規範版本

  • ECMAScript 2016(2016 年 6 月):第一個年度版本,與 ES6 相比,發布周期較短,新特性也相對少些

  • ECMAScript 2017(2017 年 6 月):第二個年度版本

  • 以後的 ECMAScript 版本(ES2018ES2019ES2020 等)都在 6 月正式獲准生效

四.TC39 標準制定流程

從 ES6 來看,發版周期過長存在 2 個問題:

  • 版本之間的時間跨度太長,提早定稿的特性要等待非常長的時間,一直等到規範正式發布(才能被實現和使用),而靠後的特性往往趕在最後發版期限之前才定稿,存在風險

  • 語言特性的設計與實現和使用相隔太久,在實現和使用階段才發現設計缺陷為時已晚

為此,TC39(ECMA 國際組織第 39 號技術委員會)啟動了新的流程:

P.S.ECMA 國際組織設有眾多技術委員會,除 TC39 ECMAScript 外,還有 TC43 Universal 3D (U3D)、TC45 Office Open XML Formats 等等,具體見 Ecma template for minutes - Ecma International

主要變化在於:

  • ECMAScript 各項特性獨立設計,歷經 5 個階段,從 Stage 0(Strawman,初稿)開始,經 Stage 1(提案)、Stage 2(草案)、Stage 3(候選提案),最後到 Stage 4(Finished,過審提案)結束

  • 要求在後幾個階段進行原型實現和實際測試(由 Test 262 負責),以便在設計和實現之間形成反饋循環

  • ECMAScript 每年發布一版,囊括截止最後發版日期之前所有已經進入第 4 階段的特性

所以,從 ES2016 開始(新 TC39 流程施行以來),ES 版本的概念被大大弱化了,需要關心的是特性提案處於第幾階段,只要進入第 4 階段就已經算是標準特性了,會在下一個 6 月正式納入標準。

P.S.按照 TC39 流程文檔,應該是每年 7 月發版:

July: Approval of new standard by the ECMA General Assembly

但實際發版時間是每年 6 月,可能是為了紀念歷史上那些 6 月發布的元老版本。

五.向後兼容原則

我們發現 ES 規範每一版始終完全兼容先前的所有特性,比如 ES6 提出了 letconst 但並沒有幹掉 var,這是因為如果推出了不兼容的新版本,會造成一些問題:

  • JavaScript 引擎、IDE、構建工具都會變得臃腫,因為要支持新舊兩版規範

  • 開發者需要知道版本之間的差異

  • 要麼把現有的代碼全都遷移到新版本,要麼(不同項目)混用多個版本,重構會變得很麻煩

  • 甚至要標註每段代碼的所屬版本,就像 ES5 手動開啟嚴格模式一樣,當時沒有流行起來的一個原因是在文件或函數開頭添加指令也很麻煩

為了避免這些問題,ES6 採用了一種策略叫One JavaScript

  • 新版本始終完全向後兼容(但偶爾可能會有輕微、不明顯的清理)

  • 舊特性不刪除也不修復,而是引入更好的版本,比如 let 就是 var 的改進版

  • 如果語言的某些方面有變化,只在新的語法結構內生效,即隱式選用,例如,yield 只在 generator 中才是關鍵字、模塊和類中的所有代碼都默認開啟嚴格模式

參考資料

評論

暫無評論,快來發表你的看法吧

提交評論