当我们在新时代调侃 IE 浏览器兼容性问题的时候,或多或少忘记了 IE 浏览器是第一款支持 CSS 的商用浏览器;当我们惊叹于 Chrome 将 Webkit 内核发挥的如此极致的时候,又或多或少忘记了 Safari 才是 Webkit 内核的始作俑者。千姿百态的浏览器中,有的很早就被淘汰了,有的直到现在还被广泛使用在各类主流操作系统之上。有趣的是,纵观浏览器的发展史,其内核的派生、竞争与互相借鉴共同演绎出了盘根错节的“家族图谱”。
本文通过回顾两次浏览器大战,并对各大主流浏览器的发展作出简介,展开一场浏览器内核的初探之旅,揭开神秘的面纱。
什么,足以称之为浏览器
尽管在各式各样的浏览器中有的仅提供纯文字接口来实现 HTML 页面,但绝大多数现代浏览器都或多或少拥有有如下特点:
- 可用于使用万维网;
- 提供丰富多彩的用户界面:其中包括上下页、刷新、地址栏、书签、显示源码等功能;
- 支持解析多种网页标准:HTML、HTML5、CSS、SVG、XHTML、WebGL、JavaScript 和 MathML 等;
- 支持多种文件格式及协议:可以通过浏览器打开特定格式的文件进行查询、编辑等操作,且提供 HTTPS、FTP 等网络协议的支持;
- 可通过多个窗口或多个标签页同时打开多种由统一资源标识符标志的信息资源:网络、图片、影音等;
- 可通过开放开发的浏览器插件来拓展浏览器功能。
因此,我们可以将能够提供上述多个功能的应用程序称之为浏览器。
浏览器大战
2003 年,苹果公司开发的 Safari 浏览器代替微软公司的 IE 浏览器,成为了 Mac OS X v10.3 之后版本的默认浏览器。同时 Safari 在不久之后带来的大名鼎鼎的 Webkit 内核,这一系列动作都印证着曾大一统主流浏览器江山的 IE 浏览器份额逐渐受到其他浏览器蚕食,由此划分开了第一轮浏览器大战和第二轮浏览器大战的时代背景。
第一轮大战
第一轮浏览器大战主要围绕在二十世纪末期——人们开始注意到万维网,而当时的市场及网页浏览标准均以 Netscape (网景公司)主导。这一主导性来源于其推出的 Netscape Navigator 浏览器改进了“史前”浏览器 Mosaic 的实用性及稳定性,同时在网络上提供免费试用版俩个要点。这时,以用户界面友好立足市场的微软公司也通过争取到 Mosaic 的授权开发出了 IE 浏览器。俩者为争取更多的用户来开了商业战争序幕。
纵然 IE 浏览器步入市场较晚,IE 浏览器从技术层面通过最先支持 CSS、新增网页动态加载及图片位置改变等优势,逐步提高了市场占有率。与之俱来的对开发者开发同时运行在俩个浏览器上的网页难度逐步上升。
因此,一场要求网页无论使用 IE 或 Netscape 均能正常浏览的 “可用任何浏览器浏览”(Viewable With Any Browser)运动悄然崛起。
在这轮大战中,IE 浏览器的开发商微软公司同时使用了诸多商业手段来与公司的规模相对较小的 Netscape 浏览器争抢用户。
Netscape 浏览器从最高峰达到市场 90% 的占有率下降到远远不够 IE 浏览器市场占有率的同时,网景公司最终落败,被美国在线公司以 42 亿美元收购。
WorldWideWeb - 世界上第一个网页浏览器第二轮大战
当 IE 浏览器成功寡占浏览器市场时,诸多问题逐渐暴露了出来:
- IE 浏览器使用专属格式,不尊重网页公开标准,使得开发者开发的网页只能完整地运行在 IE 浏览器上,其它非微软平台及浏览器无法正常显示;
- 高占有率的 IE 浏览器已然成为电脑蠕虫病毒攻击的主要目标之一,当安全漏洞被发现时,蠕虫病毒也随着IE的普及,在网络快速传播。
Netscape 浏览器在其公司衰落之时开放了浏览器源代码,与此同时 IE 浏览器的安全性问题持续引发关注,经过长时间的酝酿诞生出了安全性较高的 Firefox 浏览器与 IE 浏览器展开了竞争。
经过从多种市场占有率的竞争与发展来看,新出的浏览器逐步与 IE 浏览器平分市场,最终于 2012 年的报告中显示,Chrome 浏览器的市场占有率已上升至 33%,超过 IE 浏览器并成为全球第一大浏览器。
浏览器内核
浏览器的内核通常仅指排版引擎。这里在介绍完浏览器中的排版引擎后加入解析 JavaScript 的引擎作出简要说明。
1. 排版引擎
在没有计算机的年代,人们通过对艺术的直观把握来进行报纸、期刊的统一排版。现在我们只需输入规则的代码指令,让浏览器的排版引擎来帮我们做自动化地做这些事情,并输出至显示器或打印机。
同样的代码指令在不同的排版引擎(即内核)上的执行效果不尽相同,这里提几个著名的内核,来展现它们的特点及其相互之间的发展关系。
①. Trident 内核
Trident 内核运行在 IE 上,又称 IE 内核,是 IE 的排版引擎的名称。Trident 曾因其市场占有量庞大而不思进取,一度与 W3C 标准脱节(05 年),给了运行在 Safari、Chrome、Firefox 和 Opera 等浏览器 上的内核提供了很大的发展空间。随着微软逐步放弃 IE 浏览器品牌,Trident 内核版本也不再更新。
②. EdgeHTML 内核
EdgeHTML 内核开启了 Trident 内核的分支,成为了替代 IE 浏览器的 Microsoft Edge 浏览器的主要排版引擎。EdgeHTML 移除所有旧版 IE 浏览器遗留下来的代码,并通过尊重网页标准、重写主要的代码以和其他现代浏览器的设计精神互通有无。
③. KHTML 内核
KHTML 是由 KDE 自由软件社区所开发的 HTML 排版引擎,由 C++ 语言编写。这里提到 KHTML 是因为其是早起 Safari 的内核最终选型。Safari 开发团队因对 KHTML 作出大量的改动,逐步从 KHTML 中脱离出来,KHTML 逐渐淡出主流浏览器中。
④. Webkit 内核
Webkit 的前身是 KHTML 引擎,属于其一个开源分支,是 Safari 及早期 Chromium 、Amazon Kindle 等浏览器的默认内核。通常所说的 Webkit 不仅仅是排版引擎,其包括用来渲染 HTML 和 CSS 的 Webcore 引擎和用来解析 JS 的 JSCore。JSCore 将在后文有关 JS 引擎中叙述。Webcore 便用来处理排版。
⑤. Chromium/Blink
Chrome 浏览器的内核来源于 Webkit 的 Webcore,最终用谷歌公司自主开发的开源排版引擎 Blink 所代替;同时 Chrome 浏览器对于 JavaScript 代码的解析也使用了自己的 V8 引擎。
Blink 同样来自于 Webkit,据说 Blink 删除了 880w 行 webkit 代码。Blink 引擎问世后,国产各种 chrome 系的浏览器也纷纷投入 Blink 的怀抱,可以在浏览器地址栏输入 chrome://version 进行查看。
⑥. Gecko 内核
Gecko 是 Netscape6 和 Firefox 的内核。Gecko 代码公开,使用该内核浏览器很多。其诞生来源于 IE 的不思进取。微软内部人员不满,与一停止更新 Netscape 的员工一起在创办 了 Mozila 后开发,常被称为 Firefox 内核,跨平台使用。
⑦. Presto 内核
Opera 浏览器早期使用的内核,Opera 在 Blink 引擎推出之后转用 Blink,其中原因包括毫无推广上的优势(主要原因)和使用 Webkit 内核的 Opera 可以兼容谷歌 Chrome 浏览器等。但换内核代价惨痛,从快速轻量化与稳定到异常卡顿与不稳定,书签同步都困难,很多用户流失。Presto 内核最终停留在了 12.17。
⑧. More
这里便不一一列举各个不同的内核了,下图可以看到内核存在时间的对比,从而方便看出哪些内核还在使用中。
2. JavaScript 引擎
浏览器上不仅仅可以解析 HTML 和 CSS,也可以解析脚本语言 JavaScript ,而后者便需要 JS 引擎作支持。常见的 JS 引擎有 JScript 引擎、Chakra 引擎、V8 引擎、KJS 引擎等,这里作出小谈。
①. KJS 引擎
与早期 KHTML 排版引擎相配的,还有用来解析 JavaScript 的 KJS 引擎。KJS 同样由 KDE 社区开发。其后因为 Webkit 作为分支的诞生,逐步被可以直接将 JS 代码编译为原生机器码的 JavaScriptCore 引擎替代。JavaScriptCore 成为了 Webkit 中的一个重要组件。
②. Chakra 引擎
Chakra 是由微软为 IE9+ 版本开发的 JavaScript 引擎,在一个独立的 CPU 核心上即时编译脚本,与浏览器并行。在 2009 年 11 月 18 日举行的 SunSpider 测试展示了 IE9 的 PDC 版本对脚本的执行远快于 IE8,但是仍然慢于 Firefox 3.5、Google Chrome 4 和 Safari 4。
③. V8 引擎
V8 由 Google 公司开发,是开源的 JavaScript 引擎。V8 在运行之前将 JavaScript 编译成了机器码,而非字节码或是解释执行它,以此提升性能。基于 V8 引擎对 JavaScript 的高性能解析,Node.js 也选择了 V8 引擎作为其在服务端解析 JavaScript 的首选引擎,促进了前端的蓬勃发展。
小结
通过前半部分,我们谈到了浏览器的特点,并通过两次浏览器大战交代了主流浏览器的发展史;通过后半部分,我们看到千姿百态的浏览器内核原来有足够多的共性——每一个新的内核并不是凭空而出的,都从上一个可以替代的内核中吸收了足够多的经验。
这时,如果有人让你谈谈对浏览器内核的理解,你就可以说将其拆分成排版引擎和 JS 引擎来分别说说它们的特点了。但本文只是起点,有关一些浏览器为什么宣称自己是双内核,有关浏览器组成,有关浏览器进程调度,有关内核渲染机制等问题都还没有涉及,可以留在问尾以作延伸思考。
- Hello,我是韩亦乐,现任本科软工男一枚。软件工程专业的一路学习中,我有很多感悟,也享受持续分享的过程。如果想了解更多或能及时收到我的最新文章,欢迎订阅我的个人微信号:韩亦乐。我的简书个人主页中,有我的订阅号二维码和 Github 主页地址;我的知乎主页 中也会坚持产出,欢迎关注。
- 本文内部编号经由我的 Github 相关仓库统一管理;本文可能发布在多个平台但仅在上述仓库中长期维护;本文同时采用【知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议】进行许可。
网友评论