1. 程式人生 > >Blink: Chromium的新渲染引擎

Blink: Chromium的新渲染引擎

關於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的橫空出世將使它和其他的WebKit瀏覽器開發商包括——蘋果、諾基亞和黑莓——更徹底地分道揚鑣。 這一舉措意味著,現在有四大渲染引擎線上:WebKit、Blink、Trident 和Gecko。對於使用者來說,渲染引擎的差異化意味著他們在使用不同瀏覽器開啟同一網頁時將得到不同的結果——在移動裝置上尤其如此。 谷歌並在一篇部落格文章裡寫道:“我們知道,新的渲染引擎的出現將對網頁瀏覽產生重大影響。”但谷歌補充說,它認為多個渲染引擎 “能夠推動創新,並增進整個網路生態系統的健康。” 谷歌此舉有很大風險。根據NetMarketShare的資料,Chrome 瀏覽器目前是桌上型電腦最常用的瀏覽器之一。而根據Statcounter的統計,Chrome 瀏覽器目前是桌上型電腦最常用的瀏覽器。NetMarketShare統計的是訪客數量,而Statcounter只統計點選量。如果谷歌的新戰略不成功,Chrome 瀏覽器的統治地位或將不保。 Chrome 28開發版本的版本說明中還在使用WebKit,而最新的Chrome 28.0.1469.0中已經替換為Blink。

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速度