确实非常的复杂!
首先可以明确的是,浏览器是少有的大型软件系统,其复杂性可以媲美我们每天使用的Windows系统。
微软甚至放弃自家的IE和edge内核,转而使用chrome内核,chrome优秀是一方面,更重要是开发浏览器内核太复杂,太烧钱。当然微软已经不是当年的微软了!
现在微软也在全力拥抱开源,甚至在win10里面支持内置wsl的Linux内核。如果说某一天我们使用的Windows系统,基于Linux内核开发,大家也不要太惊讶。
随着微软加入chrome阵营,chrome实力大增,会加速甩开其他浏览器!说不定某一天苹果也宣布使用chrome内核!
从浏览器的基本功能来看,其核心模块有:
我们知道,目前web系统,都是BS模式的,也就是系统相关的页面,发布在服务器端的。
浏览器想要运行,第一件事情就是向服务器请求页面代码。
这就是网络请求,浏览器的最基本功能之一。
请求到页面之后,需要对页面进行解析,先认识页面,然后才能进行下一步工作。
解析了页面之后,就可以对页面进行渲染了。渲染完成之后,我们就看到了web系统的界面了。
这些功能,似乎看起来没有那么复杂!那浏览器的几千万行代码,到底在实现了哪些复杂的功能呢?
稍后补充。。。
此外,现代浏览器还具备以下特点:
这意味着你不能简单调用操作系统的api来实现功能,必须考虑跨平台问题,还有可能要从头实现某些重要功能。
Google专门为Google chrome打造了高性能的V8引擎,来解释执行JS代码。如今结合nodeJS,V8引擎甚至已经在后端发力。
也就是各种web标准要支持到位,要做到上图一样,360度无死角,才能成为优秀的浏览器。
HTML用来描述网站页面的界面骨架,由一颗树形结构的HTML文档构成,也称为DOM树。
在HTML中,记录了构成页面的各种控件及其位置,参数等等基本结构。页面加载的时候,是最先下载HTML并解析的。
HTML最新版本是HTML5,其中加入了大量新特性,浏览器必须支持这些最新的HTML特性,才能算是一个合格的浏览器。
CSS则是负责页面的美化装修。什么前景色,背景色,圆角边框,边框颜色,边框大小等等。基本上你能想到的界面调整参数,CSS里面都应有尽有!这也正是浏览器的一个复杂模块。目前最新版本是CSS3。
界面骨架有了,也可以做的非常漂亮,尽善尽美了。那页面的逻辑怎么办?
没错,JavaScript就是负责前端页面的逻辑部分的。从最早期的前端输入校验,发展到如今的近乎万能,JavaScript经历了漫长的发展。
其中也经历了各种标准和版本,目前的主流版本是ES6。
浏览器为了支持最新的JavaScript,也需要开发巨量代码。
WebGL是最近几年才火爆起来的一个特性,他将web的渲染性能大幅提升。
因为通过WebGL,我们可以直接调用显卡进行渲染和计算。
这使得在web端实现大型的三维引擎成为可能。比如Three.js,Cesium等等。
为了支持webgl,浏览器又必须进行大量开发工作。
前面说到了JavaScript,使用JavaScript我们已经可以在web端实现大型三维引擎了。
尽管如此,还是不能满足我们目前对于web端的更为复杂的应用的效率要求。还是有很多人认为JavaScript的速度慢。
于是人们又起草了Web Assembly的标准。这是一种类似汇编语言的web标准,号称web端的汇编语言。
其目的在于解决JavaScript执行效率低的问题。同时可以使用C++等高级语言,开发Web Assembly模块。
如今已经有很多Web Assembly结合JavaScript的应用案例了。如Google在其Google earth的web版本中就大量使用该技术。
这也会导致浏览器花费大量代码来支持Web Assembly的各种功能。
非常感谢您能够耐心的看到这里。不知道您有没有发现,我们在Windows里面做的很多事情,在浏览器里面,居然也能做了!这说明浏览器已经慢慢发展到和操作系统差不多的功能了,您说他能不复杂吗!
从事浏览器内核开发有十个年头,主要研究的是webkit内核源码后来去研究谷歌的chrome浏览器,浏览器代码量还是非常的巨大,在webkit开源社区代码的更新速度已经非常快速了,但是谷歌打造的chrome已经投入了2000多员工,每天的代码更新量更是惊人,浏览器内核的代码架构在客户端软件里面算是复杂度非常高,先简单看下浏览器的工作流程,浏览器功能上现在地址栏输入网址,然后浏览器内核的网络模块请求数据,拿到数据之后就进行数据解析。
浏览器内核的数据解析包括三部分,Html,CSS,JavaScript三种脚本的解析,而且不同的脚本对应不同的解析策略,这块代码量在实际操作过程中变动不是很大,变动点主要在于W3C新的标准产生之后,对应的解析代码就需要改变,这块的代码模块的编程模式化比较多,代码不是很容易看懂需要对其解析做出一些了解。网页内容被解析分类之后就要开始进行网页的渲染,网页渲染是浏览器内核的关键,也是决定浏览器性能的关键,谷歌浏览器为了提升这块的性能专门在webkit的基础设计了新的渲染架构,这是谷歌浏览器相对别的浏览器比较快的地方,而且在影响浏览器JavaScript性能的地方做了重新架构并且重新命令为V8引擎,总体来讲谷歌浏览器内核相对传统的webkit做了太多的优化,每天浏览器研发工程师针对不同的点做优化,代码量上千万行也不是夸张的数字。
目前在客户端软件里面浏览器内核和安卓内核代码都属于巨量级的代码,而且在具体编译这两种软件的时候普通的电脑配置根本编译不过,基本上需要8核16G以上的内存来使用,从浏览器内核的工作原理上倒也不是那么复杂,但在具体的标签和事件处理上细节繁多,而且不同的浏览器对于同一个标准的支持也是不一样的,所以同一个网页在不同的浏览器上有不同的展示方式,就是这种道理。
通过浏览器内核的研究还是个人上还是总结出几点经验,无论多么复杂的代码就要从基本的语法细节入手,作为一名合格的程序员首先具备不断优化自己代码逻辑的习惯,通过研究浏览器内核的代码有些很简单的内核代码会被来回的重构,直到琢磨出最优的解决方案,在现实中写代码的时候完成的代码就要进行重新审视,直到拿到最优的解决方案,勇于对自己写的代码说不,直到拿出自己满意的方案。谷歌浏览器内核代码维护者分布在全球各地,不同的国家技术人员同时维护一个大的项目工程,需要掌握共同的编程规范,为了谷歌专门制定了自己的代码写作规范,而且代码就如同程序员自己的脸面,不好的代码展示在大众面前如同人丢了脸面一样,程序员在实际编程的过程中要懂得珍惜自己的羽毛。
无论多么复杂的代码都是由一个个功能模块构成的,在有好的架构情况下把每个功能模块的代码完成好才能让整体完美的结合在一起,再复杂的代码也是基本功能模块完成的,不要看到了大量的代码就觉得距离太遥远,任何一行优秀的代码也是遵守基本的编程规范情况下完成的,希望能帮到你。
请相信,至少百万行.写一个内核模型并不容易, 单说是要兼容各种操作系统的不同版本,各种内存容量,屏幕大小, 网络状况, 还要优化速度, 尽量少崩溃, 也就是容错性, 就不是件容易的事.
主程序要做的事: tcp/ip的解析,http, https , ftp 等各种协议的解析,应答, java script/css/html 的分析及实现, 插件, 哪一个部分单独实现都得几万行代码了.
确实很复杂,因为浏览器的主要功能是通过向服务器请求并在浏览器窗口中显示它来显示您选择的Web资源。但浏览器从“界面”到“渲染”,已经做了非常多的步骤,最终呈现在我们面前就是很简单的网页内容,下面我会详细叙述下浏览器内核的功能。
浏览器的核心部分应该是浏览器核心的“渲染引擎”,其主要作用是解释页面语法并渲染页面。因此,“渲染引擎”确定浏览器如何显示网页的内容和格式信息。不同的浏览器内核对网页编写的语法的解释不同,从而导致呈现效果不同,从而导致兼容性问题。
1.Trident
Trident(IE内核):该内核程序于1997年在IE4中首次采用。它是由Microsoft在Mosaic代码的基础上进行修改的,并在IE11中使用。也通常称为“ IE内核”。由于IE本身的“垄断”,Trident内核很长时间没有更新,这导致与W3C标准的脱节并暴露了安全性问题。
在2011年,Trident开始从IE 9支持HTML5和CSS3。自版本11起,IE最初已支持WebGL技术。IE8的JavaScript引擎是Jscript,IE9开始使用Chakra。Trident内核的常见浏览器是:
2. Webkit
Webkit(Safari内核,Chrome内核原型,开放源代码):它是Apple自己的内核,也是Apple Safari浏览器使用的内核。Webkit引擎包括WebCode排版引擎和JavaScript代码解析引擎。
它们分别来自KDE的KHTML和KJS。它们是GPL条约授权的免费软件,并支持BSD系统开发。Chrome,360 Extreme Speed Browser和Sogou High Speed Browser也使用Webkit作为内核(Chorome使用其自己的V8引擎来理解脚本)。
3. Blink
这是由Google和Opera Software开发的浏览器排版引擎,谷歌将其作为Chromium计划的一部分进行计算,并于2013年4月发布。
此渲染引擎是开源引擎Webkit中WebCore组件的一个分支,用于Chrome(28和更高版本),Opera(15和更高版本)和Yandex浏览器。
浏览器的主要组件是:
呈现引擎将开始从网络层获取请求的文档的内容。通常以8kB的块完成。
之后,这是渲染引擎的基本流程:
渲染引擎将开始解析HTML文档,并将元素转换为称为“内容树”的树中的DOM节点。引擎将解析外部CSS文件和样式元素中的样式数据。样式信息以及HTML中的视觉指令将用于创建另一棵树:渲染树。
渲染树包含具有视觉属性(如颜色和尺寸)的矩形。矩形按正确的顺序显示在屏幕上。
构建渲染树后,它将经历“ 布局 ”过程。这意味着为每个节点提供应在屏幕上显示的确切坐标。下一阶段是绘画,将遍历渲染树,并使用UI后端层绘画每个节点。
重要的是要了解这是一个循序渐进的过程。为了获得更好的用户体验,渲染引擎将尝试尽快在屏幕上显示内容。它不会等到所有HTML解析完毕后才开始构建和布局渲染树。部分内容将被解析并显示,而该过程将继续处理其余部分内容,这些其余内容始终来自网络。
简单来说,目前浏览器大致已经趋向于Webkit系,Webkit系的代码量还是很大的。加上Chrome的使用频率在PC市场中有着绝对市场,而且现在Win10的Edge也加入了Webkit体系,速度加快了不少。所以在不久的将来我们可以预见的是浏览器会以Webkit系为主,然后百花齐放。
这样说比较合适:
一个现代的,全功能的、高性能的浏览器内核必然是很复杂。
关键在需求
和普通软件一样,浏览器内核是否复杂,取决于其需求。
如果需求很多,内核就很复杂;需求不多,就可以比较简单。
现存浏览器内核中,有庞大、复杂的,也有短小精悍的。
简单的浏览器内核
世界上第一个浏览器是运行在NextStep系统上的WorldWideWeb(www这一简写就是从这里来的),这一浏览器恐怕也是最小的浏览器了。
其它较小的浏览器还有:
我做了一个统计,这三个浏览器源代码情况大致如下:
(用scc完成代码统计,并去掉License,HTML及纯文本)
以上可以说明:浏览器代码可以很少,甚至一万行以内即可实现一个浏览器内核。
但大家都知道,现代的全功能浏览器都是庞大的。这正是因为需求多。
全功能现代浏览器为何庞大?
主要有两方面原因。
一方面,浏览器需要兼容各种各样的网页标准。比如:
我们把Javascript支持单独分出来说,因为这部分复杂性比较高。
首先,从古老的Javascript到较新的各种ECMA Script都需要支持,这就不简单。Javascript支持了,DOM数据也要支持吧?
一旦支持全功能编程语言,就涉及更多问题,因为这根本就是要实现一个虚拟机,一个平台。这可以从一些例子看出:如有人在浏览器中用Javascript启动一个Linux系统。
像谷歌的Chrome浏览器,花费了很大工夫在优化Javascript执行性能上,这部分的复杂性就很高了。
现代全功能浏览器其实就是一个虚拟机,一个平台,支持着繁多的标准和语言。这么高的需求下,这一平台的庞大、复杂也是必然的。尤其在渴求性能的情况下,复杂度会更高。
当然,如果缩减需求,比如减少所需支持的标准和语言,降低性能要求,减少功能(比如视音频播放),浏览器也可以做得不那么复杂。
复杂是因为HTML这个玩意从诞生起就没有很严格的标准,更没有严格的执行厂家。各家一套标准,html又是个粗糙不严谨的标记语言,发展初期混乱不堪,各家浏览器为了满足向下兼容又只能把自己弄的异常复杂。chrome源码16GB各种核心代码、测试代码加起来大概2000多万行,但实际编译后也就几十M大小。可见其中的冗余代码有多少。
不是很复杂,是超级复杂。
现在的微软牛逼吧,但是微软浏览器使用的也是Chromium内核,自己现在也没开发属于自己的浏览器内核。
各大浏览器内核如下:
1、IE浏览器内核:Trident内核,也是俗称的IE内核;
2、Chrome浏览器内核:统称为Chromium内核或Chrome内核,以前是Webkit内核,现在是Blink内核;
3、Firefox浏览器内核:Gecko内核,俗称Firefox内核;
4、Safari浏览器内核:Webkit内核;
5、Opera浏览器内核:最初是自己的Presto内核,后来是Webkit,现在是Blink内核;
6、360浏览器、猎豹浏览器内核:IE+Chrome双内核;
7、搜狗、遨游、QQ浏览器内核:Trident(兼容模式)+Webkit(高速模式);
8、百度浏览器、世界之窗内核:IE内核;
9、2345浏览器内核:以前是IE内核,现在也是IE+Chrome双内核;
一个浏览器的内核牵扯的东西太多,不是简简单单一两句话能够说明白的。
浏览器内核的开发,可以说丝毫不比十九世纪中期登陆月球计划简单,甚至犹有过之而无不及。
咱们国内的浏览器,比如百度浏览器,QQ浏览器,UC浏览器,搜狗浏览器等等浏览器,基本上都是使用的原有的内核,利用现成的内核惊醒二次开发,修改,迅速成型,根本没有一家是自己开发的浏览器内核。
浏览器给我们呈现的是一个生动活泼、色彩斑斓、丰富多彩的网络世界。
在我们看来浏览器的窗口界面好像是一个电子相框,呈现出一幅一幅画好的既定画面。
实际上浏览器是将无数的代码转化、渲染成我们所看到的内容,当我们要在浏览器上看到如下图这样的红色框框时,代码需要对框框进行命名,还要对画框框的起点进行描点,然后根据长、宽、颜色等等数据对框框进行绘制。同样框框里面的文字具体要写在框框的那个位置也要进行描点。
可想而知,浏览器在零点几秒的时间内要呈现出生动活泼、色彩斑斓、丰富多彩的页面并不是那么容易,这就好比你站在一幅画面前通过电话告诉你的朋友画上面的内容,然后要让他完美无差的呈现出来。
当我们在浏览器的地址栏中输入文字,并按回车键获得页面内容,分为以下几步:
当浏览器的地址输入文字时,UI线程会判断用户输入的是网址URL还是查询query字段。当用户按下回车键,UI线程会通知网络线程获取网页的内容。
网络线程会执行DNS查询(从域名服务器将域名解析为服务器IP地址),接着向服务器请求建立SSL/TLS连接。如果网络线程接收到了重定向请求头如301,网络线程会通知UI线程服务器要求重定向,另一个URL请求就会被触发。
当请求响应返回时,网络线程会根据内容类型(Content-Type)及MIME类型嗅探判断响应内容的格式。
比如:响应内容的格式是HTML,就会将数据传递给渲染进程;如果是下载文件(rar、zip),就会将数据传输给下载管理器。
安全浏览检查在这个时候也会被触发,如果域名、请求内容匹配到恶意站点,网络线程就会展示一个警告页面,也不会将数据传递给渲染进程。
当网络线程做完检查后就会告诉UI线程所有的数据已经准备好了,UI线程则会寻找渲染进程来渲染页面。
渲染进程准备好后,浏览器进程就会将收到的响应数据流传递给对应的渲染进程让它继续接收到来的HTML数据,这时加载页面就正式开始了,导航栏会被更新,安全指示符和站点设置UI就会展示线页面相关的站点信息。同时Tab的会话历史也会被更新,这样再点前进和后退才能起作用。
渲染进程主要是将HTML、CSS、以及JavaScript转变为我们可以进行交互的网页内容。所有的这一些列的过程的背后其实都有CPU和GPU在后面进行支撑,当然也少不操作系统提供的机制才能在CPU和GPU上面跑。
比如谷歌打造的Chrome浏览器内核Chromium,最开始调了1000个人来开发,代码量达到了2400万行,差不多半个操作系统的规模,项目开发花费了上百亿美元。
实际上Chromium包含了很多东西,如果里面的每一个单独展开来讲,都是一本本厚厚的工具书。比如网络库包含了主机解析、cookies、网络改变探测、SSL、资源缓存、FTP、HTTP、OCSP实现、SOCKS和HTTP代理配置、解析、脚本获取、QUIC等等。
这就是为什么强如微软这样的存在,也放弃了维护他们自己的IE浏览器内核,因为投入太恐怖了,转而投向了开源的Chromium。
Chromium是开源项目但也并不是谁都有能力拿去改的,Chromium号称是模块化、高内聚低耦合,就算你想删除一点点代码都很难,哪还有精力去一点点的去掉里面的一些不需要的功能或增加功能。
以上个人浅见,欢迎批评指正。
认同我的看法,请点个赞再走,感谢!
喜欢我的,请关注我,再次感谢!
是的
1. 浏览器内核研发极为复杂,html标准历经二十多年,经过5个大标准,每一代都会提出新功能新特性,诸多特性功能叠加,但是内核还必须做到向后兼容。
2. 浏览器内核至少包含js引擎和页面渲染引擎两大部分,每一个部分都是一个巨大的系统化工程,像chrome的v8js引擎和blink渲染引擎引擎,都是谷歌历经多年,经历几十个版本迭代才能达到今天的效果。
3. 浏览器都是全免费,这意味着开发商要顶着巨大财务压力去调配大量顶级开发者去研发,这个就决定了只有巨头玩得起内核。
要说浏览器内核复杂不复杂就先从已经成熟的浏览器内核来举例
Chromium浏览器
从目录结构上,chromium包含这些东西:
base,通用代码,基础组件,包含字符串、文件、线程、消息队列等工具类集合。
cc,Chromium compositor 的缩写,负责渲染合成。
chrome,Chromium 浏览器外壳实现。
content,多进程沙盒浏览器的核心代码,管理进程架构和线程架构。
gpu,OpenGL 封装代码,包含 CommandBuffer 和 OpenGL 兼容性支持等。
net,网络栈实现。
ipc,进程间消息通信实现。
media,多媒体封装代码,包含了媒体内容捕获和播放的组件集合。
mojo,类似于 Android 的 AIDL,提供了跨语言(C++ / Java / JavaScript)跨平台的进程间对象(Object)通信机制;。
skia,图形库,这里存放的是 Chromium 对 skia 的 配置和扩展代码,另有third_party/skia 目录存放原生的 skia 代码。
third_party,网页排版引擎。第三方库
ui,UI 框架。
v8,V8 JavaScript 引擎库。
这密密麻麻的一片你认为就没了?但实际上,这里面每一个展开来讲,都是一本厚厚的工具书的容量。比如net,看起来只是个网络库,然而里面包含主机解析,cookies,网络改变探测,SSL,资源缓存,ftp,HTTP, OCSP实现,代理 (SOCKS和HTTP) 配置,解析,脚本获取(包括各种不同系统下实现),QUIC,socket池,SPDY,WebSockets……
然后排版还需要支持世界各国的奇奇怪怪的文字。例如从右往左写、规则复杂无比阿拉伯文。相比之下,汉字这种方块字的排版简直就是弟弟。还有各种奇怪的unicode字符。
【转】奇怪的unicode字符
怎么能处理好这些字符和语言,并配合几千页的html、css排版规则正确显示出来……它的实现至少就已经万行代码了。
强如大牛的微软,也放弃维护他们自己的浏览器内核了。因为需要投入的人力财力实在是太恐怖了。chromium团队,光是开发人员,都已经上千了。
综上所述
一个完整强大的浏览器其内核代码千万行代码不为过但仅仅为了浏览网页满足网络、排版、渲染等主要功能的浏览器其内核代码就会少很多。
我是小杰喜欢请关注我!
其实很多软件的难度并不是其单纯的开发难度,而是和现有生态系统的兼容难度。
就拿浏览器内核来说吧,虽然很难,但是并不是完全遥不可及,我认为让BAT这种级别的公司用100来人的专业程序员团队,开发四五年也就差不多了。很难吗,听起来好像不算太难。
但是假如把和现有浏览器和WEB生态联系起来,让新开发的浏览器内核能够完美展现所有现有网站,大部分浏览器框架可以正常运行不出问题,这个难度就大了去了,我估计难度不亚于造个氢弹,毕竟造氢弹不用考虑兼容性问题。
很多朋友对软件这块的历史局限性没有什么认识,我来简单讲讲。就拿浏览器常用的JavaScript语言来说,它当年其实Brendan Eich大佬花十来天功夫搞出来的,听起来很简单是不是,当年JavaScript确实很简单,但是也因为简单,很多设计问题没有好好考虑,这些问题后来坑了不少程序员。所以后来有了1.0、2.0直到6.0这么多新版本添加新内容取代老内容。但是直到现在2020年,我估计仍然有大量网站还在使用老式的标准,没有对新标准支持。
大家可以看出来,就连这么一个JavaScript,一个内嵌在浏览器里面运行的独立部件,都有这么多门道,过了这么多年还有如此多的遗留问题,更别说浏览器的其他部分了。可以说浏览器这个东西,其实可能有80%都是老旧的一坨Shit,但是大家为了这些网站能够正常运行,不得不捏着鼻子继续在这坨Shit上搞。
可能有朋友说那我直接新弄一个新浏览器不就好了吗?这种想法虽然挺对的,但是必须认识到一件事情,就是如果一件事情错的人非常多,那么这个错误的事情就会变成对的事情。现在的浏览器生态存在很多问题,但是这都是历史遗留问题。另起炉灶的话就碰碰到一个问题,那就是兼容不兼容老版本,不兼容的话,大部分网站你都没办法正常运行,就算运行了也会出现显示错位功能错误等问题,到头来没人用。但是如果兼容的话,如上所述,浏览器里面的坑坑洼洼太多了,一个一个踩过去太浪费精力了,很难有人能够做到。
正因为如此,现在世界上也就Chrome、火狐等少数几个自己开发内核的浏览器,而这些开发者也是维护了几十年的老江湖。而其他浏览器无外乎都是套壳浏览器,因为确实开发难度太大了。
就chrome内核,需要编译5万多的C++代码文件。
如果用图形化开发环境打开工程,因为对象关联实在太过复杂,开发环境很可能会崩溃。对chrome,你只能用脚本自动化编译。
浏览器内核(只说内核)是不依赖操作系统的,包括很多底层支撑的组件都是自己实现,实在是太多代码了。
本人开发浏览器内核。现在大都都是基于chromium。到底复不复杂,说简单一点。整个工程占几个G空间。要编译出来,包括编译中间产物等,要十来G的空间来存放。完全编译一次(20000多个源文件),用顶配i7+32G内存+全固态硬盘的台式机要好几个小时。google他们都是用工作站来做开发的。
鄂公网安备 42068302000331号
温馨提示:本站所有内容均来自互联网,若有侵权请联系站长处理。联系邮箱:yangtata@vip.qq.com