JS之父和JSON之父:JavaScript的下一站

作者|Dylan Schiemann

譯者|覃雲

7 月 11 日,FullStack 2018 在倫敦舉行,JavaScript 之父 Brendan Eich 和 JSON 之父、“JavaScript:The Good Parts”的作者 Douglas Crockford 一同出席,並就 JavaScript 的未來發表了演講。

Eich 的演講主要是圍繞語言的迭代和改進功能進行,而 Crockford 主要關注 JavaScript 是否能將軟件工程引向下一個巔峯,也就是全局分佈式、安全的異步編程。

Eich:不該對開發者有求必應

Eich 講述了這些年 JS 發生的變化,以及多久之後會再更新。例如,E4X 從未被 JS 接受,但“剔除了不好的 XML 部分的 E4X”,即 JSX,受到了很多 React 用戶的喜愛。

Eich 提及在創建 JavaScript 中最大遺憾,就是在 JavaScript 第一個版本發佈不久,就來之不拒地滿足用戶的需求,而不是想着解決他們面對的問題。例如,使用相等運算符 == 進行強制類型轉換,如 12 =='12',便於通過 HTTP 將數據推送到服務器。

在本次演講中,Eich 還重點強調了 asm 和 WebAssembly 的價值。asm.js 是 JavaScript 靜態類型子集,asm.js 源代碼的運行速度接近原生。

這種性能上的改進來自於 asm 支持從 JIT 轉換到 AOT 編譯,從抽象語法樹(AST)直接轉換爲機器代碼生成。

WebAssembly 是一個加載速度更快和更通用的 asm.js 版本。WebAssembly 在一個單獨的進程中運行,因此它的語法比 JavaScript 更具有表現力,但仍然是 JavaScript 虛擬機的組成部分。

即將發佈的新功能

Eich 對明年即將推出的這些語言功能感到興奮:

  • TC39 BigInt - 一種新的值類型(value type),它能處理任意精度的整數,支持 TypedArrays
  • Dynamic import() - ES 模塊默認導入是靜態的,動態導入支持預取
  • Array.prototype.flat / flatMap - 數組的任意展平,而且它是展平和 smooshgate 的解決方案
  • 更多解構 - 可用於任意對象和數組
  • 類中的私有方法和訪問器 - Eich 認爲,符號前綴“#”有些爭議,不應再使用了
  • 異步迭代 - for-await-of 的語法
  • RegExp 的改進

有關這些提案的更多信息,請參閱 TC39 提案的完整列表(https://github.com/tc39/proposals)。

不會標準化 React 類似的庫

在演講的問答部分,Eich 被問及二進制抽象語法樹(binary-ast)提案的進展情況,它介於 JavaScript 和 WebAssembly 之間,它爲所有 JavaScript 提供了二進制語法樹。

Eich 認爲 binary-ast 是一種潛在的實用方法,但有待實踐和後續的性能指標測試,以肯定其優勢。Mozilla 正在進行初步實驗。它的潛在的風險包括:它可成爲另一種安全攻擊載體,再者,它只是鼓勵開發人員編寫更大的 JavaScript 代碼庫,而不是依靠工具和規則來優化他們的代碼庫。

當被問及類型系統(如 TypeScript)時,Eich 評論說動態編程帶給人們很大的便利性,並且不會產生妨礙,是一個非常好的類型系統。Eich 指出,“人們總是習慣使用不需付出任何代價的類型系統。”

TypeScript 非常出色,因爲它是 JS 一個嚴格的超集,每個 JS 程序都是一個 TS 程序,Anders Hejlsberg 是一流的。

Eich 被問及是否會標準化類似 React 的庫。他指出像 Dojo 和 Prototype 這樣的早期庫是如何將其概念引入 JS 的更高版本中,並指出,“我們並不會標準化像 React 那樣的庫”。相反,我們努力將基本原語( essential primitives)從庫中提升到核心語言中。Eich 指出,過早做標準化會導致問題,尤其是對於類型系統等的解決方案。

被問及他對基於 RxJS Observables 的 Observables 提案的看法。Eich 指出,該規範已經停滯不前,要在語言中構建一個所需的功能是一個巨大的挑戰。而且他也不確定是否應該將 Observable 添加到語言中。他沒有提到 WHATWG specification for streams(https://github.com/whatwg/streams)是 Observables 的超集(superset),也許是這兩個提案之間的競爭阻礙了 Observables 提案的進展。

最後,Eich 被問及機器學習,他認爲,雖然深度學習很有用,但它並沒有告訴我們關於其中的因果關係,它只是曲線擬合算法的一種高級形式。

Crockford:JavaScript 比其他語言更有優勢

Crockford 指出,就目前來說,要達到上述的目標還存在很大的困難,因爲包括 JavaScript 在內的所有編程語言都還停留在單機單地址空間的舊架構中。

但是,由於 JavaScript 能利用函數和對象做很多有趣的事情,所以 Crockford 認爲 JavaScript 比其他語言,更容易達到上述的目標。

Crockford 認爲,編程語言有一個通病,它們可能過於專注於“不良整形手術”的修復,而對未來沒有一個清楚的認知。

與十年前相比,我認爲語言中好的部分越來越少,但好的部分做得也越來越好了。

會上,Crockford 質疑了聽衆的一些臆想,並指出這些臆想對我們的進步造成很大的影響。例如,他認爲我們應該從零開始計數,並解釋了爲什麼一切都應該從零開始。

Crockford 指出,到目前爲止,ES2015 最大缺憾是缺乏正確的尾調用( tail calls)或尾調用優化機制,到目前爲止只有 Safari 實現了該部分規範。根據 Crockford 的說法,尾調用是 ES2015 最重要的特性,因爲這個特性有助於支持尾遞歸( tail recursion),功能替代的迭代,以及後續傳遞(continuation passing)。

Crockford 認爲純函數是未來語言中最關鍵的東西,任何影響純函數的都不應該被考慮用於語言上。

Crockford 不喜歡 JavaScript 中的很多的特性。例如,他不喜歡 async / await,因爲它阻礙了開發人員理解異步編程,使異步編程看起來像是同步的。

Crockford 解釋了他對“簡單”一詞的看法,“標準越簡單,需要達成一致的地方也越少,並且越有可能實現互操作性。” 他以 JSON 爲例,解釋說 JSON 是一種語法,它沒有說明行爲,易於理解和使用。JSON 所有的語法在一張名片背面就可以放下。

Crockford 正在研究一種名爲“neo”的新語言和編譯器,它以一種新語言的形式實現 Crockford 認可的 JavaScript 特性,並源到源編譯定義良好的 JavaScript 程序,更多細節他將發佈在一本名爲《How JavaScript Works》的書中。

Crockford 也被問及有關 TypeScript 的問題,他認爲:“TypeScript 並沒有解決我所遇到的問題。” 這種對 TypeScript 的誤解與他先前的聲明“錯誤通常發生在事物的接口之間”有些矛盾,因爲 TypeScript 的一個最重要的優點是幫助定義接口以防止這些錯誤發生。

相關文章