原文作者:Dylan Schiemann
譯者:UC 國際研發 Jothy
寫在最前:歡迎你來到“UC國際技術”公眾號,我們將為大家提供與客戶端、服務端、演算法、測試、資料、前端等相關的高質量技術文章,不限於原創與翻譯。
WebAssembly 正越來越受歡迎,它不僅能提高應用效能,而且支援將其他語言的原始碼轉換為可在 Web 瀏覽器中執行的內容。 每次 JavaScript 受到挑戰時,社群都會努力建立機制來改善它的效能瓶頸,這些年來我們從 Mozilla,Google,Apple 和 Microsoft 的努力中也可見端倪。
大型 JavaScript 應用當前面臨的效能瓶頸是解析抽象語法樹(AST)所需的時間。 二進位制 AST 旨在利用解析 WebAssembly AST 所用的一些策略來提高解析 JavaScript AST 的效能。 該提案由 Facebook,Mozilla 和 Bloomberg 的工程師提出,他們指出:
“即使在高效能筆記本上,Chrome 從 Facebook.com 上載入 7MB 未壓縮的 JavaScript,可能得花上 15% 的 CPU 時間來解析它!”
“啟動(載入)時間正在成為Web 應用的效能瓶頸。 Web 現有特性(快取方面)已支援傳輸更大量級的 JS 程式碼。快取雖然有幫助,但這些特性的取值會定期更新,所以冷啟動時間依舊非常重要。 隨著 JavaScript 負載的增加,應用啟動效能會下降,其中解析時間是初始載入時間的重要組成部分。 舉個例子?,即使在高效能筆記本上,Chrome 從 Facebook.com 上載入 7MB 未壓縮的 JavaScript,可能得花上 15% 的 CPU 時間來解析它!!”
二進位制 AST
二進位制 AST 提議為 JavaScript 引入一種新的網路傳輸格式,該格式提供了抽象語法樹(AST)的二進位制編碼,以此提高 JS 效能。 該提案的目標是提供快速解析。 作者指出,由於 Web 開發者已經習慣了像 webpack 這樣的構建工具,因此可以輕鬆接受這種新格式。 像 TypeScript 和 Babel 這樣的編譯器也可以直接輸出二進位制 AST。
該提案開了一個好頭,即提供 JavaScript 表層語法的簡單替代編碼,並使用盡可能小的增量來實現高效能解析。 它不會嘗試任何語義級編碼,例如位元組碼或編碼變數,而會直接使用識別符號。
當前解析瓶頸的可能解決方案包括:
在需要的地方無法獲取的資訊(通常由語言功能引起,例如變數提升或內建方法)
JavaScript 的早期錯誤語義(需要對每個 JavaScript 檔案進行預解析)
使用字元導致的效率低下(JavaScript 語法將表示式編譯為何種型別的字元級歧義)
二進位制 AST 提議借鑑 WebAssembly 解析方法,二進位制編碼分為三層:
使用基本原語對 AST 節點進行簡單的二進位制編碼
對上一層進行附加結構壓縮
通用壓縮演算法
Prototype(原型)
提議二進位制 AST 的團隊使用基於內部 AST 格式的語法,基於 Mozilla 的 SpiderMonkey 引擎實現了早期原型。
解析過程的改進更為顯著,建立完整 AST 所需的時間減少了 70-90%。
在早期的 facebook.com 靜態新聞源基準測試中,二進位制 AST 表示法略小於原始 JavaScript。 解析過程的改進更為顯著,建立完整 AST 所需的時間減少了 70-90%。
該提案中的 FAQ ❓解釋了為什麼它不考慮傳輸原生位元組碼,為什麼 WebAssembly 不是所有 Web 問題的答案,以及其他許多問題的答案。
社群反應
在今年夏天的 FullStack 上,我詢問了 JavaScript 作者 Brendan Eich 對二進位制 AST 的看法。 他仍持懷疑態度,但也表示如果真能實現效能優勢,那麼未來的 JavaScript 版本會重點考慮這個提案。
結論
二進位制 AST 提議是過去幾年中提高 Web 效能速度的最有希望的提議。 假設這個提議進一步發展,我們希望一旦它可用就立即使用它,並且在 Dojo 中加以支援。
需要幫助嗎?請聯絡我們!
英文原文:
https://www.sitepen.com/blog/2018/10/28/tc39-binary-ast-proposal
好文推薦:
“UC國際技術”致力於與你共享高質量的技術文章
歡迎關注我們的公眾號、將文章分享給你的好友