浏览器内核-Webkit
关键字:浏览器内核,浏览器引擎,Browser,Webkit,Blink,Chromium。
本文简单介绍一下各种浏览器内核。着种介绍一下Webkit。顾名思义,浏览器内核就是浏览器的核心部分,也可以说是浏览器所采用的渲染引擎,负责对网页语法的解释(如标准通用标记语言下的一个应用HTML、JavaScript)并渲染(显示)网页。常见的浏览器内核有:Trident,Gecko,Presto,Webkit等。对于开发者来说,有了浏览器内核,你就可以开发一款你自己的浏览器。或者在你的应用中嵌入浏览器内核,你就可以在你的应用中显示网页并运行JaveScript。
Trident
Gecko
Presto
Webkit
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),甚至还不能访问苹果电脑的臭虫数据库[来源请求]。
在公布离婚的期间,KDE开发者Kurt Pfeifle(pipitas)贴出了一篇文章,宣称KHTML开发者已经设法从WebCore移植许多(但非全部)Safari所改进的项目回KHTML,而他们一直都希望这些改进是来自于苹果电脑。这篇文章让Apple开始联系KHTML的开发者,并讨论有关增进彼起关系的方法及未来的合作模式,事实上KDE项目确实有能力合并一些项目,来改进KHTML的渲染速度以及加入一些新的功能特色,包含Acid2渲染测试的改进。
自从新闻播报了fork事件之后,Apple在CVS发布了他们自己维护的WebKit版本,在他们发布代码后,Apple及KHTML开发者已经加深了合作关系,许多KHTML的开发者也成为了WebKitSVN代码库的审查(Reviewer)及提交者(Submitter)。
WebKit工作团队同时也逆转许多Webkit代码当中,专为苹果特定的修正,并且实现了一个平台特定的抽象层,可使渲染的代码于其他平台可以更顺利的运作。
在2007年7月,Ars Technica网站发布一篇文章,指出KDE开发团队将从KHTML转移到WebKit,再经由多年的集成,KDE开发平台4.5于2010年8月发布,它同时支持WebKit及KHTML,而KHTML的开发仍在继续。
分支
在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",它是一个字节码解释器,这个项目演变成SquirreFish Extreme(简称为SFX,市场称之为Nitro),首次公开于2008年9月18日,它会将Javascript编译为本地的机器语言,不再需要字节码解释器,同时加速了JavaScript的运行效率。
Drosera
Drosera是一个JavaScript调试工具,它被包含在每日编译的WebKit版本内。它被命名为茅膏菜属,这是一种食虫植物。Drosera目前已经被Web Inspector替换了。
V8 (JavaScript引擎)
V8是一个由美国Google开发的开源JavaScript引擎,用于Google Chrome中。
V8在运行之前将JavaScript编译成了机器码,而非字节码或是解释执行它,以此提升性能。更进一步,使用了如内联缓存(inline caching)等方法来提高性能。有了这些功能,JavaScript程序与V8引擎的速度媲美二进制编译。
传统的Javascript是动态语言,又可称之为Prototype-based Language,JavaScript继承方法是使用prototype,通过指定prototype属性,便可以指定要继承的目标。属性可以在运行时添加到或从对象中删除,引擎会为运行中的对象创建一个属性字典,新的属性都要通过字典查找属性在内存中的位置。V8为object新增属性的时候,就以上次的hidden class为父类别,创建新属性的hidden class的子类别,如此一来属性访问不再需要动态字典查找了。
为了缩短由垃圾收集造成的停顿,V8使用stop-the-world, generational, accurate的垃圾收集器。在执行回收之时会暂时中断程序的执行,而且只处理对象堆栈。还会收集内存内所有对象的指针,可以避免内存溢出的情况。V8汇编器是基于Strongtalk汇编器。
参考链接:
https://zh.wikipedia.org/wiki/WebKit
https://zh.wikipedia.org/wiki/V8_(JavaScript%E5%BC%95%E6%93%8E)