Blink: Chromium的新渲染引擎
阿新 • • 發佈:2019-02-17
關於blink
Google Chrome/Chromium 從創始至今一直使用 WebKit(WebCore) 作為 HTML/CSS 渲染引擎。WebKit 早先由 Apple 由 KHTML 專案 fork 出來,用於 Safari 瀏覽器的 Web 引擎。由於寬鬆的協議、輕量級的設計和便捷的應用程式內嵌 API,WebKit 逐漸變得流行起來,除了 Google Chrome/Chromium 和 Safari,它在移動終端( Symbian S60,Android,iOS)到 Toolkit 整合(GTK+, Qt4) 都有不錯的收穫。儘管上面一眾經常被統稱為 WebKit,實際上各自都使用了自己的 WebKit 分支或者編譯時選項,使得最終的渲染結果也是存在一定的差異的。不過大體上 WebKit 社群內部還是比較和諧的,各個成員之間也為維持相容性作出了努力,直到 2010 年隨著 OS X Lion 一起面世的 WebKit2。由於 WebKit2 在 WebCore 層面上實現的程序隔離在一定程度上與 Google Chrome/Chromium 自己的沙箱設計存在衝突,故 Google Chrome/Chromium 一直停留在 WebKit,使用 Backport 的方式實現和主線 WebKit2 的相容。顯而易見這增加了 WebKit 和 Chromium 的複雜性,且在一定程度上影響了 Chromium 的架構移植工作。
基於以上原因,Google 決定從 WebKit fork 出自己的 Blink Web 引擎:
現階段以精簡內部結構為主,將刪除大約 7000 個檔案和 450 萬行 WebKit2 相容程式碼。
未來將著重改善 DOM 架構,將使用 JavaScript 實現 DOM。
提升安全性,實現程序外 iframes 。
對於今年初宣佈放棄自有渲染引擎跟隨 Chromium 的 Opera 來說,其開發者也立刻釋出部落格公告 Opera 亦將切換至 Blink 引擎。[1]
Blink 的架構變化
當chrome專案開始時,我們的目標是儘可能少的改動Webkit,易於同webkit的程式碼合併。
對於blink我們興奮於建立一個更大的架構靈活性的程式碼,而無需擔心其他webkit的使用者。
我們計劃增加一個“out-of-process iframes”, 這將使chromium能夠分離頁面中一個獨立的部分到一個分離的沙箱程序。
實現這一點需要大量改動webkit關於iframe的處理。
另外一個例子,我們將修復網路程式碼,讓它更小更快。目前webkit中的網路程式碼受限於老的mac webkit API,而且不能改變。
chromium已經在其周邊工作了很多年,但是這些周邊的工作易碎而且bug很多。
在Blink中,我們將使用新的網路程式碼,而無需強制和其他webkit使用者統一。
最後,我們甚至希望將整個DOM樹用javascipt來實現。這將使javascript訪問更加迅速。但是這需要大量重寫Webkit DOM部分的實現。這也是Webkit同時支援兩個javascript引擎更近困難。
我們考慮的其他的一些改變
- 讓WebCore支援多程序歷史(當前,它假定同一個程序同步歷史)
- 刪除Widget 樹(Mac Webkit1的一個約束)
- 分離WebCore到不同模組
- 將直接使用沙箱平臺的API,替代目前WebCore/Platform
- Establish a simpler, stricter tree-gardening system that does not require 2 full time engineers per day (這句看不懂,誰能幫我翻譯下?謝謝了)
- 嘗試將DOM 移動到JS的堆上
- 增加多核複用(如 html 解析,style 引擎和javascript解析)
- 移除DOM中模糊不清的部分和因為向後相容而引起的模糊不清部分,或者移除不必要的相容性
- 使用現代的、更快的tcmalloc(google編寫的多執行緒記憶體分配軟體,替代malloc)來貫穿 Mac chrome
- 嘗試並行佈局
- 通過移除ScriptValue/ScriptState抽象來避免記憶體洩漏
- 使用WebIDL來替代WebKitIDL,並移除Javascript繫結程式碼
- 通過DOM3 Events/[DOM]UI Events提上WebCore速度