微软|有人说浏览器内核有上千万行代码,那它真的有这么复杂吗?

微软|有人说浏览器内核有上千万行代码,那它真的有这么复杂吗?

文章图片

微软|有人说浏览器内核有上千万行代码,那它真的有这么复杂吗?

文章图片

微软|有人说浏览器内核有上千万行代码,那它真的有这么复杂吗?

文章图片


首先 , 代码的复杂度和代码多寡不是一个完全正比的关系 。 简单说你一段代码实现的功能人家用一两句实现这两者的复杂度不见得前者更高 , 有时候后者在你看代码的时候反而感觉更复杂 。 浏览器内核确实是很复杂 , 例如html协议本身就是一个松散的协议 , 而且很庞大 。 光是处理这些就相当的麻烦 。 而这只是内核处理的一部分 , 至于有多少行 , who cares 。

有人说用浏览器大小计算代码数量这个思路感觉很新奇啊 , 不说各种非代码资源例如图片声音之类占用空间 , 浏览器除了内核外面还有一层皮呢 。 其次 , 工作关系 , 做过两个相关的开发 , 一个是虚拟机上opengles的浏览器gpu共享渲染缓存的处理 , 一个是静态html文本的图像化 。 后者就相当的折腾了 , 分配的缓冲区不断的需要刷新来适应内容造成的显示区的变化(特别是css设定 , 真是用起来觉得爽 , 写起来吐得慌) 。

前者更是仅仅停留在了代码分析阶段就因为复杂度过高叫停了整个项目 。 这还不要说现代的浏览器还有动态的脚本功能了 。 当然 , 功能不算啥 , 一只猴子也能写出莎士比亚嘛 , 但是 , 要命的是 , 他居然显示还能那么的快 , 哪怕是被嘲笑了无数次的ie , 我的静态分析都达不到他的动态执行的效率 , 而且差距不是一点半点 , 有一个数量级的差别呐 , 想想这难难度 。

再者 , 浏览器要适配几乎无限种可能的页面 , 虽然有标准 , 但想要将任意一一种别人写的网页完美的显示出来真的不是一件容易的事情 , 需要异常庞大的代码量(谷歌浏览器内核2400万行)和复杂的内部结构 。 相对比的你看Windows操作系统有多复杂就知道了 。 浏览器内核跟前端其实关系真的不大 , 除非公司需要或个人爱好 , 可以让前端从页面渲染dom树、w3c标准或ast等角度进行深度定制和调研 。

多年前在某互联网大厂双核浏览器团队的前端团队开发过一段时间 。你知道做客户端浏览器开发的c++程序员喜欢什么内核吗?是IE 。IE虽然是老大哥 , 但内核trident真的比起现代浏览器比如火狐Mozilla的gecko和Safari、Chrome的webkit体积和复杂度、代码量都少的不是一个数量级 。 gecko太复杂了 , 但webkit更复杂 , 这也是后来chrome从chromium开始精简webkit内核的原因 , 起名blink 。

时间和参与的工作业务关系不能讲深入太多 , 一句话 , 前端接触的视觉可见范围的GUI浏览器部分 , 只占浏览器开发及内核的冰山一角 。 不过浏览器内核本身 , 是一个从毛胚到精装修的过程 。 随着网页的发展 , 逐渐复杂化而已 。 浏览器内核太复杂 , 需要兼容的多而已 。 真要说难 , 那恐怕未必 。 只是真要从头设计 , 没有意义 。 难的意思 , 很少有人能做到 。 复杂的意思 , 愿意投入 , 还是能做到的 。 浏览器内核 , 就是愿意投入能做到的事 , 而不是难 。

【微软|有人说浏览器内核有上千万行代码,那它真的有这么复杂吗?】最后 , 浏览器的名字很有迷惑性 , 但是不知道大家发现了么 , 现在慢慢的绝大部分程序都跑在这个东西里 。 那浏览器就成了一个容器 , 一个在操作系统内部的容器 。 实际上浏览器从广义的角度是希望往上是用户 , 往下是硬件的 , 并不是操作系统的一个应用 , 而是操作系统的一部分 , 或者说一层 。 咱们极端点看这个问题 , 假设所有程序都在浏览器内部 , 那应用、浏览器、操作系统的关系是啥呢?实际上这个假设是有实现的 , 就是google 2010年推出的Google Chrome OS 。