JavaScriptCore

**WebKit** 是一個開源的 Web 瀏覽器引擎 (Web browser engine)。它被用於 Apple Safari。其分支 Blink 被用於基於 Chromium 的網頁瀏覽器，如 Microsoft Edge 與 Google Chrome。

Webkit 亦使用於 Apple iOS、BlackBerry Tablet OS、Tizen 及 Amazon Kindle 的預設瀏覽器。WebKit 的 C++ 應用程式介面提供了一系列的 Class 以在視窗上顯示網頁內容，並且實現了一些瀏覽器的特色，如使用者連結點擊、管理前後頁面列表及近期歷史頁面等等。

WebKit 的 HTML 及 JavaScript 程式碼源自 KDE 的 KHTML 及 KJS 函式庫的一個分支，現已由 KDE、Apple、Google、Nokia、Bitstream、BlackBerry 及 Igalia 等獨立開發。OS X、Windows、GNU/Linux 以及其他類 Unix 系統作業系統，皆支援這個專案。2013 年 4 月 3 日，Google 宣佈它建立了 WebKit 中 WebCore 元件的分支 ——Blink，Blink 用於新版 Google Chrome 與 Opera。

WebKit 的 WebCore 及 JavaScriptCore 元件使用 GNU 較寬鬆公共授權條款，其他元件則採用 BSD 授權條款。

截至 2013 年 3 月 7 日，Webkit 商標已被蘋果公司在美國專利及商標局註冊為其商標。

## 緣起

WebKit 的程式碼源自 1998 年所開發的 KDE 的 HTML 排版引擎 KHTML 及 KDE 的 JavaScript 引擎 KJS 的程式碼。Apple 的 Don Melton 於 2001 年 6 月 25 日開始了 WebKit 這個專案，當時 WebKit 僅為 KHTML 及 KJS 的復刻，Melton 在電子郵件中向 KDE 開發者解釋，KHTML 及 KJS 比起其他技術有著更容易開發、更輕巧（少於 140000 行程式碼）、更加乾淨的設計，以及更與標準相容的優勢，KHTML 及 KJS 將會透過連接器函式庫（adapter library）的幫忙被移植到 OS X，並重新命名為 WebCore 及 JavaScriptCore。JavaScriptCore 在 2002 年 6 月，於 KDE 的郵件列表（mailing list）中首度發表，包含著蘋果公司首次釋出的部分。WebCore 在 2003 年 1 月，首度發佈於 Macworld Expo 中由蘋果公司 CEO Steve Jobs 發表的 Safari 瀏覽器。當 WebCore 首次使用在第一個 Safari 的測試版本的同時，JavaScriptCore 首次並以私有 framework 的方式包進 Mac OS X v10.2，蘋果公司將其使用在 Sherlock 軟體。Mac OS X v10.3 是第一個 Apple 發佈內建 WebKit 的作業系統，儘管它已經被內建在 10.2 內了。

Apple 表示，有些牽涉到 OSX 的特定功能（例如：Objective-C、KWQ 及 OS X 特定函式）將會在 KDE 的 KHTML 中缺席，這行為被稱為不同的發展策略。

### 開發分裂

由於這兩個分支（KHTML 及 WebCore）有著不同的目的而進行開發，所以他們程式碼互相補丁（patch）的難度越來越高。 KHTML 的開發者認為，他們不喜歡接受蘋果公司對於 KHTML 的改變，並宣稱兩個組織的關係有些不好（a bitter failure），蘋果提交他們相當大的補丁，其中包含相當大數目的改變，但是卻缺少相關檔案，並且經常包含著未來的擴充，然而這些補丁對於 KDE 的開發者而言，要整合回 KHTML 是相當困難的，此外，蘋果公司要求開發者閱覽 Apple 的程式碼之前必須簽署保密條款（non-disclosure agreements），甚至還不能存取蘋果公司的 bug 資料庫。

在公佈_分裂_的期間，KDE 開發者 Kurt Pfeifle（_pipitas_）貼出了一篇文章，宣稱 KHTML 開發者已經設法從 WebCore 移植許多（但非全部）Safari 所改進的項目回 KHTML，而他們一直都希望這些改進是來自於蘋果公司。這篇文章讓 Apple 開始聯絡 KHTML 的開發者，並討論有關增進彼起關係的方法及未來的合作模式，事實上 KDE 專案確實有能力合併一些項目，來改進 KHTML 的彩現速度以及加入一些新的功能特色，包含 Acid2 彩現測試的改進。

自從新聞播報了 fork 事件之後，Apple 在 CVS 發布了他們自己維護的 WebKit 版本，在他們發布代碼後，Apple 及 KHTML 開發者已經加深了合作關係，許多 KHTML 的開發者也成為了 WebKit SVN 代碼庫的審查（Reviewer）及提交者（Submitter）。

WebKit 工作團隊同時也逆轉許多 Webkit 程式碼當中，專為蘋果特定的修正，並且實現了一個平台特定的抽象層，可使彩現的程式碼於其他平台可以更順利的運作。

在 2007 年 7 月，Ars Technica 網站發佈一篇文章，指出 KDE 開發團隊將從 KHTML 轉移到 WebKit，再經由多年的整合，KDE 開發平台 4.5 於 2010 年 8 月釋出，它同時支援 WebKit 及 KHTML，而 KHTML 的開發仍在繼續。

### 開源

在 2005 年 6 月 7 日，Safari 開發者戴夫・海厄特（Dave Hyatt）於他的 blog 宣布 Apple 將把 Webkit 開源（之前僅有 WebCore 及 JavaScriptCore 開源），並且開放了 WebKit 的 CVS 程式庫以及 bug 資料庫工具。這項訊息由蘋果公司軟體工程的高階副總（Senior Vice President）Bertrand Serlet 於蘋果公司 2005 年的 Worldwide Developers Conference 公開。

在 2005 年 12 月中，可縮放向量圖形的支援被加入了標準版本，在 2006 年 1 月初，這項程式碼從 CVS 轉移至 Subversion。

WebKit 的 JavaScriptCore 及 WebCore 元件目前以 GNU 較寬鬆公共授權條款方式授權，而其他的 WebKit 元件則是以 BSD 授權公開。

### 更進一步發展

在 2007 年一開始，開發團隊開始實現層疊樣式表（CSS）的擴充，包含動畫、轉換（transitions）以及 2D 和 3D 的轉場（transform），這樣的擴充在 2009 年 W3C 的標準中被列入草案。

在 2007 年 11 月，這項專案宣布，他們已經完成了 HTML5 媒體特色的支援，允許頁面中以原生的方式嵌入影片，並且可以被 script 所控制。

在 2008 年 6 月 2 日，WebKit 專案宣布他們重寫了 JavaScriptCore，被稱為 "SquirrelFish"，它是一個位元組碼直譯器（Bytecode Interpreter），這項專案驗後來變成 SquirrelFish Extreme（SFX），它可將 JavaScript 編譯為機器語言而不再需要直譯器，這樣的做法加速了 JavaScript 的執行，這項專案於 2008 年 9 月 18 日發布。一開始，SFX 僅支援 x86 架構，於 2009 年 1 月底，SFX 於 OSX 支援了 x86-64 架構，並且在該平台通過了所有的測試。

### WebKit2

WebKit2 發佈於 2010 年 4 月 8 日，WebKit2 的目標是將元件抽象化，並提供更乾淨的網頁彩現，它會利用從周圍的介面或是應用程式的殻，建立一個環境使網頁的內容（JavaScript、HTML、排版等等）將會在另外一個行程 (Process) 運行，比起 WebKit，這個抽象化的做法打算令 WebKit2 可重覆使用一個更簡單的程式。因為 WebKit2 對比起 WebKit 有_一個不相容的 API_，所以導致他的名字被改變為 WebKit2。

目前 WebKit2 僅開放於 Mac、Windows 及 MeeGo-Harmattan。

## 使用

作為彩現引擎使用的 WebKit，被使用在 Safari 及 Google Chrome 瀏覽器於 Windows、OS X、iOS 及 Android 平台（然而，Chrome 僅僅使用 WebCore，而 JavaScript 引擎及多工系統則自行開發）。其他的在 OS X 底下的應用程式也使用 WebKit，例如 Apple 的 e-mail 使用者端軟體 Mail 以及微軟的個人資訊管理系統 Microsoft Entourage 2008，皆使用 WebKit 來彩現 HTML 內容的 e-mail 訊息。

Opera 軟體公司於 2013 年初宣布，他們將停止他們自行開發的 Presto 排版引擎，由 Webkit 專案取代，在未來將會以 Webkit 來取代，並貢獻給 Webkit 專案。

### 內建平台

新的網頁瀏覽器已經內建了 WebKit，例如 Symbian 手機的 S60 瀏覽器、BlackBerry 瀏覽器（ver 6.0+）、Midori、Chrome 瀏覽器、Android 網頁瀏覽器、PlayStation\_3\_系統軟體 4.0 以上所使用的瀏覽器、KDE 的 Rekonq 瀏覽器以及 Plasma Workspaces 都使用 WebKit 作為原生的網頁彩現引擎。WebKit 已經被 OmniWeb、iCab 及 Web（前面所說的 Epiphany）採用，並取代原有的彩現引擎，Sleipnir 於 2012 年開始在他們的瀏覽器開發 WebKit，並於 2012 年 5 月 17 日進入第三個 Alpha 階段。Epiphany 同時支援 Gecko 及 WebKit，但他們的團隊描述 Gecko 的發佈週期及未來的開發計劃將會令他們對於 Gecko 的支援太過笨重。HP 的 WebOS 使用 WebKit 作為它應用程式執行時期的基礎。Valve Corporation 的 Steam 最新更新的介面，使用 WebKit 作為它介面的彩現以及內建的瀏覽器。WebKit 在 Adobe\_AIR 中被使用在彩現 HTML 及執行 JavaScript，在 Adobe Creative Suite CS5，WebKit 用來彩現部分元件的使用介面。

截至 2010 年上半年，分析估計內建 WebKit 瀏覽器的行動裝置已經達到 3 億 5 千萬，截至 2012 年 2 月 (2012-02)，WebKit 的市場份額已經達到 36%，同等於 Internet Explorer 所使用的 Trident/MSHTML 引擎的市場份額，如果這個成長持續下去，使用 WebKit 的總和（Chrome、Safari 以及智慧型手機 / 平板）於 2012 年底將會超過 50%，而 WebKit 將會是市場的領導者。

### 移植

在 Hyatt 發佈 WebKit 開源之後的那一周，Nokia 宣布他們將移植 WebKit 到 Symbian 作業系統，並為 S60 開發一個基於 WebKit 的行動裝置瀏覽器，現在已經被命名為 Web Browser for S60，它被使用在 Nokia、Samsung、LG 及其他使用 Symbian S60 的行動電話。Apple 也已經移植 WebKit 到 iOS 並將其運行於 iPhone、iPod Touch 及 iPad，它被使用在這些裝置的網頁瀏覽器及電子郵件軟體。Android 行動電話平台也使用 WebKit 作為它網頁瀏覽器的基礎，而於 2009 年 1 月發佈的 Palm Pre 使用 WebKit 作為它的介面。Amazon Kindle 3 包含著一個以 WebKit 打造實驗性質的瀏覽器。

在 2007 年 6 月，Apple 宣布 WebKit 已經被移植到 iOS，並作為 Safari 的一部分，還有一些正在進行中的項目，將 WebKit 移植到開源的作業系統 Syllable、Haiku 以及 AROS Research Operating System（AROS）.。

WebKit 也被移植到許多 Toolkits 使其支援多平台，例如 GTK+ toolkit、Qt framework,、Adobe AIR、Enlightenment Foundation Libraries (EFL) 以及 Clutter toolkit。Qt Software（Digia 所擁有）於 Qt 4.4 包含 Qt port，Qt port 的 WebKit 也可使用在 Konqueror 4.1 版本之後。在 Qt 底下的 Iris Browser 也使用 WebKit。The Enlightenment Foundation Libraries (EFL) 的移植還在進行（經由 Samsung 及 ProFUSION），他們將專注在嵌入式及行動系統，並將其作為一個獨立運行的瀏覽器、Widgets/Gadgets、檔案閱讀及修改軟體。Clutter 的移植是由 Collabora 所開放，由 Bosch 所贊助。

還有一個專案與 WebKit 同步（由 Pleyo 所贊助），被稱之為 _Origyn Web Browser_，他提供了一個多元的移植方式，將其移植到抽象的平台，目的是讓移植到嵌入式或是輕量系統可以更快速簡單。這個移植被使用在嵌入式裝置，例如 set-top boxes、PMP，而他已經被移植到 AmigaOS、AROS 及 MorphOS，MorphOS 1.7 是第一個支援 HTML5 媒體標籤的 Origyn Web Browser (OWB)。

### 分支

在 2013 年 4 月 3 日，Google 宣布他將自行開發 WebCore 的分支，也就是 Blink 引擎。Chrome 的開發者由於希望在瀏覽器的開發上擁有更大的自由度，同時避免與上游衝突，更可透過移除 Chrome 沒有使用的元件而簡化自己的程式庫，所以決定開發 WebKit 的分支版本。同時 Opera 軟體在同年稍早也宣布，他們將自有引擎轉換到 Chromium 的程式庫，在此時也同時轉換到 Blink 的分支。根據這份聲明，WebKit 的開發者開始討論移除 Chrome 相關程式碼的可能性，以精簡整個 WebKit 程式庫。

## 元件

### WebCore

WebCore 是一個由 WebKit 專案所開發的佈局（Layout）、彩現（Rendering）及 HTML 和 SVG 的 DOM 函式庫，完整的程式碼皆由 GNU 較寬鬆公共授權條款所授權，WebKit 框架包裝了 WebCore 及 JavaScriptCore，並提供一個 Objective-C 應用程式介面來接介由 C++ 所開發的 WebCore 彩現引擎及 JavaScriptCore 指令碼引擎，透過 Cocoa API 就可以在應用程式中很簡單的使用這些元件。之後的版本同時包含了一個跨平台的 C++ 抽象平台，並且提供各種 API 使用。

WebKit 通過 Acid2 及 Acid3 的測試，包含完美像素的彩現（pixel-perfect rendering）以及沒有任何時間及不順的問題。

### JavaScriptCore

JavaScriptCore 是一個在 WebKit 中提供 JavaScript 引擎的框架，而且在 OS X 作為其他內容的指令碼引擎。JavaScriptCore 最初是為 KDE 的 JavaScript 引擎（KJS）函式庫及 PCRE 正規表示式函式庫，JavaScriptCore 從 KJS 及 PCRE 復刻之後，已比原先進步了許多，有了新的特色以及極大的效能改進。

在 2008 年 6 月 2 日，WebKit 專案宣布，將被重寫為 "SquirrelFish"，它是一個位元組碼直譯器，這個專案演變成 SquirrelFish Extreme（簡稱為 SFX，市場稱之為 Nitro），首次公開於 2008 年 9 月 18 日，它會將 Javascript 編譯為原生的機器語言，不再需要位元組碼直譯器，同時加速了 JavaScript 的執行效率。

### Drosera

Drosera 是一個 JavaScript 除錯工具，它被包含在每日編譯的 WebKit 版本內。它被命名為_茅膏菜屬_，這是一種食蟲植物。Drosera 目前已經被 Web Inspector 取代了。

## 跨平台之路

### iOS

2007 年 6 月 29 日，iPhone 上市，WebKit 通過 Safari 瀏覽器進入 iOS 平台，而且立即成為當時 iOS 平台唯一的排版引擎。

蘋果公司成為了這一專案的領導者。

### Windows

2008 年 3 月 18 日，Safari 3.1 for Windows 轉正，解決了 Windows 平台下 WebKit 一直存在的部分相容性問題。同年 9 月 3 日推出的 Google Chrome 使得這一平台進一步成熟。而在 Windows Mobile 戰線，領先推出穩定版的是拓馳公司的 Iris Browser。

Windows 是除 Mac OS X 外另一個得到 WebKit.org 官方支援的版本。

### Linux

2008 年 10 月 22 日投入市場的 Android，其內建瀏覽器 Google Chrome Lite 代表著脫胎於 Linux 的 Webkit 核心「回歸」Linux 平台。儘管 WebKit 的原型 Khtml 是由 Qt 寫成，但 Linux 下當前最受矚目的 WebKit 專案卻是 Gnome 領導的 WebKit/Gtk+。不過隨著奇趣科技於 2008 年 6 月被 Nokia 收購，Qt 方面也加快了 WebKit 的開發行程。目前，Google Chrome，Xfce 的 Midori，GNOME 的 Epiphany、KDE 的 Konqueror，Arora 以及 QupZilla 是 Linux 系統下最流行的 Webkit 核心瀏覽器。

### Symbian

2005 年，諾基亞公司的 S60 團隊成為手機端 WebKit 的先驅，他們將 WebKit 框架移植到了 Symbian S60 平台，作為 S60 第三版的瀏覽器核心。

## 現在使用 WebKit 引擎的瀏覽器

### 開源

* Midori：當前最新測試版 0.1.5 所用的引擎版本是 WebKitGTK+ 1.1.13
* Epiphany：原使用 Gecko，2.28 版開始改用 WebKit
* Arora：當前最新版本號是 0.11.0，使用 QtWebKit 呼叫 Webkit 核心
* QupZilla：當前最新版本號是 1.3.5，使用 QtWebKit 呼叫 Webkit 核心

### 非開源

於 2013 年 2 月 13 日，Opera 亦宣布將轉用 Webkit 引擎。

## 參考資料