跳至主要内容

陸地在望:告別節點之海

· 閱讀時間約 28 分鐘
Darius Mercadier

V8 的終極優化編譯器 Turbofan,是少數採用節點之海 (Sea of Nodes, SoN)的大規模生產編譯器之一。然而,自從大約三年前,我們開始逐步淘汰節點之海,轉而使用更傳統的控制流圖 (CFG) 中間表示 (IR),我們將其命名為 Turboshaft。目前為止,Turbofan 的整個 JavaScript 後端已完全採用了 Turboshaft,而 WebAssembly 在其整個管線中也完全使用了 Turboshaft。Turbofan 的兩個部分仍然使用一些節點之海:內建管線(我們正在逐步用 Turboshaft 替代)以及 JavaScript 管線的前端(我們正用另一個基於 CFG 的 IR,名為 Maglev 替代)。這篇博文將解釋我們放棄節點之海的原因。

為 V8 加速:使用可變堆數字

· 閱讀時間約 6 分鐘
[Victor Gomes](https://twitter.com/VictorBFG),位移者

在 V8,我們不斷努力提升 JavaScript 的性能。作為這一努力的一部分,我們最近重新審視了 JetStream2 基準測試套件,以消除性能瓶頸。本篇文章詳細介紹了一項具體的優化,它使 async-fs 基準測試達到了顯著的 2.5倍 性能提升,並對整體得分帶來了可觀的增益。該優化受基準測試的啟發,但類似模式也出現在真實世界代碼中。

WebAssembly JSPI 引入了全新的 API

· 閱讀時間約 7 分鐘
Francis McCabe, Thibaud Michaud, Ilya Rezvov, Brendan Dahl

WebAssembly 的 JavaScript Promise Integration (JSPI) API 引入了全新的 API,適用於 Chrome M126 版本。我們將討論這些變更內容、如何配合 Emscripten 使用,以及 JSPI 的發展路線圖。

JSPI 是一個 API,允許使用同步 API 的 WebAssembly 應用程式訪問 非同步 的 Web API。許多 Web API 是基於 JavaScript Promise 對象設計的:它們不會立即執行請求的操作,而是返回一個 Promise 以執行操作。另一方面,許多編譯為 WebAssembly 的應用程式來自 C/C++ 界,這些程式通常使用會阻塞調用者直到完成的 API。

The V8 Sandbox

· 閱讀時間約 14 分鐘
Samuel Groß

距離最初的設計文檔發佈已過去了將近三年,在這期間進行了數百次代碼更改,V8 沙箱——一個用於 V8 的輕量級、進程內沙箱——現已發展到不再被視為實驗性安全功能的地步。從今天開始,V8 沙箱被納入 Chrome 的脆弱性獎勵計劃 (VRP)。雖然仍有一些問題需要解決,才能成為強有力的安全邊界,但納入 VRP 是向該方向邁出的重要一步。因此,Chrome 123 可被視為沙箱的某種「Beta」版本。這篇博客利用這個機會討論了沙箱背後的動機,展示了它如何防止 V8 的記憶體損壞在宿主進程中蔓延,並最終解釋了為什麼這是邁向記憶體安全的必要步驟。

WebAssembly JSPI 即將進入來源試驗

· 閱讀時間約 3 分鐘
Francis McCabe, Thibaud Michaud, Ilya Rezvov, Brendan Dahl

WebAssembly 的 JavaScript Promise Integration (JSPI) API 即將隨 Chrome M123 版本進入來源試驗。這意味著您可以測試您和您的用戶是否能從此新的 API 中受益。

JSPI 是一個 API,允許編譯成 WebAssembly 的所謂序列代碼訪問 非同步 的 Web API。許多 Web API 是以 JavaScript Promise 為基礎設計的:它們並未立即執行請求的操作,而是返回一個 Promise 來完成操作。當操作最終完成時,瀏覽器的任務執行器會使用 Promise 調用任何回調。JSPI 透過鉤入這種架構來允許 WebAssembly 應用程式在返回 Promise 時暫停,並在 Promise 被解析後恢復。

Static Roots: Objects with Compile-Time Constant Addresses

· 閱讀時間約 5 分鐘
Olivier Flückiger

你是否曾經好奇像 undefinedtrue 等核心 JavaScript 物件是從哪裡來的?這些物件是任何使用者定義物件的基本單位,必須先存在。V8 將它們稱為不可移動且不可變的根物件,並將它們存放於自己的堆區——唯讀堆。由於這些物件被頻繁使用,因此快速存取至關重要。而什麼能比在編譯時正確推測它們的記憶體位址更快呢?

V8 比以往更快、更安全!

· 閱讀時間約 8 分鐘
[Victor Gomes](https://twitter.com/VictorBFG),Glühwein 專家

歡迎來到令人興奮的 V8 世界,在這裡速度不僅僅是一項功能,而是一種生活方式。當我們向 2023 年告別時,是時候慶祝 V8 今年取得的令人印象深刻的成就了。

通過創新的性能優化,V8 繼續在不斷演變的 Web 領域推進可能性的邊界。我們引入了一個新的中層編譯器,並對頂層編譯器基礎設施、運行時和垃圾回收器進行了多項改進,這些改進帶來了全方位的顯著速度提升。

Maglev - V8 最快的優化 JIT

· 閱讀時間約 14 分鐘
[Toon Verwaest](https://twitter.com/tverwaes), [Leszek Swirski](https://twitter.com/leszekswirski), [Victor Gomes](https://twitter.com/VictorBFG), Olivier Flückiger, Darius Mercadier 和 Camillo Bruni — 彷彿不怕廚師多

在 Chrome M117 中,我們引入了一個新的優化編譯器:Maglev。Maglev 位於現有的 Sparkplug 和 TurboFan 編譯器之間,扮演快速生成足夠好的代碼的快速優化編譯器角色。

直到 2021 年,V8 主要有兩個執行層級:Ignition(解釋器);以及 TurboFan,V8 的優化編譯器,專注於峰值效能。所有 JavaScript 代碼首先編譯為 Ignition bytecode,並通過解釋來執行。在執行期間,V8 追蹤程式的行為,包括追蹤物件形狀和類型。執行時的元數據及 bytecode 都會被輸入到優化編譯器中,以生成高效能(通常是投機性的)機器代碼,可以顯著快於解釋器執行。