zoukankan      html  css  js  c++  java
  • 如何开发一款浏览器[转]

    作为互联网时代用户日常使用最为频繁的一种产品,浏览器领域一直是各大厂商的“兵家必争之地”,甚至有“得浏览器者得天下”的说法。桌面端IE、Firefox、Chrome的争夺一直非常激烈,最近又有腾讯、搜狗、360等公司的加入,各自都开发出具有自身特点的浏览器。在移动端也一样,UC浏览器、海豚浏览器、猎豹浏览器、QQ浏览器等等都加入到这场混战之中。那么,想要开发出一款浏览器,需要有哪些知识储备,又有哪些难点呢?最近在知乎上出现了两场讨论,我们可以从中窥得一斑。

    问题之一是“开发一款浏览器内核需要学习哪些方面的知识?”,这是一位准备做毕业设计的学生提出的,他“不准备直接用现成的开源浏览器内核(比如WebKit或者KHTML这些)来做套壳,而是打算自己用C/C++从零开始,写一个简单的浏览器内核,也就是所谓的排版引擎或者网页渲染引擎。考虑到自己的能力,目标暂定为能够支持html1.0”。

    冬眠给出了比较详细的解答:

    网页开发:你要知道inline与block有什么不同,什么是box model,ie是怎么实现的,标准的是怎么样的。

    网络方面:浏览器会使用URL,表单提交,下载,DNS等一系列知识,深一些的比如说在chrome下面输入chrome://dns,看看什么叫 prefetch DNS,浅一点至少要知道怎么实现表单提交,表单提交分那些格式。在网络那一层要怎么拼。

    编译原理:简单的是状态机,具体的是CSS的解析,Javascript的解析。其实光HTML,CSS的解析就够做一个毕设的了,举一个简单的例子,浏览器是边下载边解析,边显示的,这个地方就有不少的坑等着你,光拿一个开源的xml解析器可不行,html的解析中还有图文混排等功能,整个地方又是无数的坑。 就不要说javascript的引擎了,龙书中写的只是一小部分,里面还牵涉到什么JIT等一大堆东西。

    图形:硬件加速,你在chrome浏览器中地址栏中输入 chrome://gpu,里面出现频率最高的就是Hardware accelerated。

    前UC浏览器产品经理张瑞从浏览器的工作周期角度给出了建议:

    首先是联网模块:包括域名解析(这个可以忽略)、发起请求,连接线程的管理等(单线程请忽略)。

    然后是解析模块:包括了html的解析、DOM树的建立等。尤其是html的解析,会涉及到容错方面的考虑,DOM树要考虑各种场景下的效率(好吧,毕业设计可以不考虑效率)。

    接下来是渲染模块:根据你建立的DOM树,按照网页所描述的内容展示字体、色块等,这个没什么好说的。

    还有其他,比如网页对象的管理、页面事件的响应、插件管理。

    另一个问题是“开发一款浏览器的难点有哪些?”,范围并不限于PC端还是移动端的浏览器。

    余天升认为难点在于浏览器的两个关键部分:布局引擎和JavaScript解释器。

    布局引擎就是我们常说的浏览器的内核,主要处理HTML和CSS。简单的说,就是它决定了什么东西该在什么地方怎么样显示。对于网页这种视觉工程来说,布局引擎的重要程度不言而喻。

    对于布局引擎的难点,大概有这些方面:

    1. 对标准的支持和扩展: 有一些标准的内容可能会难以实现,或者会带来一些安全的问题,所以各大浏览器对于标准都会有一些的裁剪,而另外又有一些拓展。
    2. 布局性能: 布局引擎的性能,包括内存、CPU等指标,能够直接影响用户的体验。简单来说就是显示快不快,占用内存多不多。
    3. 其他: 类型稳定性、可拓展性这样的一些其他类型软件共有的特点。

    JavaScript解释器本来应该是浏览器内核的一部分,但是现在前端大量对JavaScript的应用,和浏览器厂商对这个部分的重视,开始分离出来了。既然拿出来了,JavaScript解释器的性能,包括时间性能、内存性能这些因素就很重要了,需要各种优化编译过程,优化生成代码,优化指令的工作。

    其他的一些难点,就是一些软件上通用的东西,如何挖掘用户需求,如何让用户使用得更满意,比如单窗口向多标签的转变,快速拨号,鼠标手势这些功能。

    程序猎人认为问题应该分为技术难点和非技术难点:

    如果是非技术难点,最大的就是人才和资金。如果找不到合适的人才,筹不到足够的资金,开发工作是否能开始都是个问题。

    如果是作为商业产品开发,就随之而来另一个难点:盈利方式。现在免费浏览器满天飞,你花了钱开发了浏览器,如何与其他产品竞争,如何收回成本甚至盈利。

    再看技术难点,余天升说的比较全面。但顺序上,我觉得稳定性和可靠性要更重要一些。对于几乎一切软件,这两点都是最重要的。只不过要求的标准看要定多高了。浏览器肯定不需要银行系统那么高的可靠性和稳定性。

    另外,从技术上看,你是要重新开发一个渲染引擎还是利用现有引擎。如果要重新开发引擎,那么难点就会多很多。各种协议、标准的支持,自身的特性,性能都是不得不考虑的问题。

    由此看来,想要开发出一款浏览器,并不是一件容易的事情,其中涉及到的各种知识和需要处理的难点都非常多,不过这么多的付出也会得到相应的回报。InfoQ的读者们,你是否也考虑过开发一款浏览器呢,对于如何开发一款浏览器有什么样的看法呢?欢迎加入讨论。

  • 相关阅读:
    HDU 1010 Tempter of the Bone(DFS剪枝)
    HDU 1013 Digital Roots(九余数定理)
    HDU 2680 Choose the best route(反向建图最短路)
    HDU 1596 find the safest road(最短路)
    HDU 2072 单词数
    HDU 3790 最短路径问题 (dijkstra)
    HDU 1018 Big Number
    HDU 1042 N!
    NYOJ 117 求逆序数 (树状数组)
    20.QT文本文件读写
  • 原文地址:https://www.cnblogs.com/zhouwenJS/p/3685193.html
Copyright © 2011-2022 走看看