如何开始构建Web浏览器?

时间:2009-02-28 22:55:47

标签: c# browser

我决定从头开始构建一个Web浏览器。 现代网络浏览器的常见功能,架构和功能在开始之前我应该​​知道什么?

非常感谢任何推荐!

11 个答案:

答案 0 :(得分:107)

好吧把它分解成碎片。什么是Web浏览器?它有什么作用?它:

  • 获取外部内容。因此您需要一个HTTP库或(不推荐)自己编写。 HTTP协议有很多复杂性/细微之处,例如处理过期标题,不同版本(尽管现在大多数是1.1)等等;
  • 处理不同的内容类型。 Theres是一个Windos注册表,您可以捎带这种事情。我在说这里基于MIME类型解释内容;
  • 解析HTML和XML :创建DOM(文档对象模型);
  • 解析并应用CSS :这需要了解所有属性,所有度量单位以及指定值的所有方式(例如“border:1px solid black”与单独的border-width等财产);
  • 实施W3C视觉模型(这是真正的踢球者);和
  • 有一个Javascript引擎

简而言之,这基本上就是一个Web浏览器。现在,其中一些任务非常复杂。即使是容易听起来的人也很难。获取外部内容。您需要处理以下用例:

  • 要使用多少并发连接?
  • 向用户报告错误;
  • 代理;
  • 用户选项;

我和其他人高兴地抬起眉毛的原因是渲染引擎很难(而且,正如有人指出的那样,人类已经进入了他们的发展阶段)。主要的渲染引擎是:

  • Trident:由Microsoft为Internet Explorer开发;
  • Gecko:用于Firefox;
  • Webkit:用于Safari和Chrome 0-27;
  • KHTML:在KDE桌面环境中使用。几年前,Webkit从KHTML派生出来;
  • Elektra:在Opera 4-6中使用;
  • Presto:在Opera 7-12中使用;
  • Blink:用于Chrome 28 +,Opera 15 +,webkit fork;

前三者必须被视为今天使用的主要渲染引擎。

Javascript引擎也很难。其中有几个往往与特定的渲染引擎相关联:

  • Gecko / Firefox中使用 ;
  • TraceMonkey:将取代Firefox 3.1中的SpiderMonkey并引入JIT(即时)编译;
  • KJS:由Konqueror使用,与KHTML绑定;
  • JScript: Trident的Javascript引擎,在Internet Explorer中使用;
  • JavascriptCore:由Safari浏览器在Webkit中使用;
  • SquirrelFish:将在Webkit中使用并添加类似TraceMonkey的JIT;
  • V8: Google在Chrome和Opera中使用的Javascript引擎;
  • Opera(12.X及更少)也使用了自己的。

当然还有所有用户界面:页面之间的导航,页面历史记录,清除临时文件,输入URL,自动填充URL等等。

这是很多的工作。

答案 1 :(得分:21)

听起来像一个非常有趣的项目,但它需要你投入巨大的努力。

这并不容易,但从学术角度来看,你可以从中学到那么多

您可以查看的一些资源:

但从逼真的角度来看,从头开始编码所需的巨大努力让我想起了这个漫画:

http://www.geekherocomic.com/comics/2009-02-25-coding-overkill.png

祝你好运: - )

答案 2 :(得分:14)

这是一个疯狂的雄心勃勃的项目(特别是对于一个开发者而言),但有一天我想做的事情 - 你可以从中学到很多东西。

我不太了解协议如何工作(你肯定需要研究的东西)或者很多关于浏览器中发生的事情,但是一个很好的起点是开源浏览器的来源,主要是Chrome和Firefox。 Chrome是一个特别好的项目,因为他们只会做我期望你开始的事:Chrome和浏览器的后端。暂时忘记创建渲染引擎 - 使用Webkit或Gekko。

答案 3 :(得分:13)

你的意思是在编写自己的渲染引擎时?

我只能说好运。许多人已进入当前这一代的各种浏览器,如果你想做得比其中任何一个更好,你将需要一些严肃的技能。如果你不得不问从哪里开始,你可能需要花费几年时间才能完成这项任务。

那就是说,这里有一些(明显的)指针:

  1. 编写大量代码来处理小事,例如解决所有projecteuler.net问题
  2. 了解有关您的工具包及其社区标准的所有信息
  3. 写更多代码
  4. 真正掌握有限状态机
  5. 编写更多代码
  6. 了解tcp / ip堆栈以及它如何用于http
  7. 了解所有关于http的信息
  8. 学习标准(html,xml,sgml,css)
  9. 庆祝你的150岁生日。
  10. 开始实际的浏览器项目。
  11. 在此处编辑

    我并不是说它要么是激励性的,要么是消极的,只是试图告诉你浏览器是一个非常大的项目而且真正的大项目需要经过深思熟虑。愚蠢的诚实充满了幽默。

    我一直在编程超过三分之二的生活,我喜欢认为我是一个相当不错的程序员,但是如果我认为我有一半的机会写一个体面的网络,那将是愚蠢的。浏览器从头开始。

    当然,如果这是你想做的事情,不要让我的评论阻挡你。你可能比Internet Explorer做得更好。

答案 4 :(得分:10)

大多数现代网络浏览器都是巨型动物,可能设计得相当糟糕,因为它们(以及网络本身)以相当随意的方式进化。

首先,您需要首先明确项目的目标(以及您希望实现的目标)。这是你为了好玩而做的事情,还是你希望其他人使用你的浏览器?如果您希望其他人使用它,它们的激励是什么?期望您从头开发一个新的浏览器是不现实的,每个人都可以用它来替代Chrome,Safari,Firefox,IE,Opera等。所有这些项目都有10到15年的领先优势。你,当你赶上他们的时候,他们将比你早10 - 15年。此外,他们拥有更多的人力,所以如果你希望你的项目取得成功,你将需要那个人的力量。

这就是拥有大量资源的大公司Apple和谷歌没有从头开始的原因。甚至微软也从头开始。最初的IE基于Mosaic。今天仍然从头开始的唯一重要浏览器是 Opera Konqueror Lynx ,不幸的是,它们都拥有微不足道的市场份额。让我们暂时忘掉Lynx吧,因为它只是一个纯文本浏览器,大概是它仍然存在的唯一原因是因为它服务于那个特定的利基市场。 Opera可以说是有史以来最好的浏览器之一,但它从未有过很大的市场份额,所以请记住,成功和创新并不是一回事。 KHTML是Konqueror背后的引擎,它本身从未成功,但它是Apple和Google使用的WebKit的基础。我想可以肯定的是,如果从未制作过KHTML,那么Safari和Chrome都不会存在。有趣的是,KHTML和Opera主要由在奥斯陆的同一栋大楼工作的挪威程序员制作。

您需要构建一个类似于构建操作系统的Web浏览器,因为它本质上就是浏览器 - 它是运行Web应用程序的操作系统。和操作系统一样,Web浏览器是一个包含许多组件的非常复杂的软件。当然,人们已经成功地从头开始创建新的操作系统。想到了Linus Torvalds。他创造了Linux,这是迄今为止最成功的操作系统之一。

当然,您面临着额外的挑战,这使得构建新的成功的浏览器比构建新的成功的操作系统更难。浏览器可以完美地运行在Web上浮动的所有遗留代码。现在假设Linus Torvalds被告知他的新操作系统并不重要,除非它完全向后兼容UNIX或某些现有操作系统。我怀疑他会不会打扰,Linux今天可能不会存在。实际上,当然,Linux变得流行的唯一原因是因为它设计得很好并且GNU项目能够制作用于将大量现有代码移植到Linux的工具。如果没有GNU对Linux的意识形态支持,它永远不会有机会。

因此,假设您真的雄心勃勃(或蛮干)足以尝试创建一个新的成功浏览器,那么您应该关注的是架构设计。除非您确定可以通过某种方式改进现有浏览器的设计,否则没有实际的理由从头开始构建新的浏览器。这意味着您需要足够熟悉 WebKit Gecko 的代码,以了解他们所做的设计决策,但您不应该尝试复制他们的设计,因为否则你也可以使用他们的代码。

我个人的想法(没有做足够的研究)是今天的浏览器不够模块化。如果我要创建一个新的浏览器,我会找到一种方法来轻松交换内容(比如将一个JavaScript引擎替换为另一个),并为用户提供比现有浏览器更多的控制权。 。现代浏览器和网页设计师几乎完全控制了用户。为什么用户不能告诉Web浏览器我希望它如何呈现在我的机器上显示的内容?最初的HTML只给出了如何构建内容的指导,随着时间的推移,新的标准变得越来越教条,以至于用户现在处于网页设计师的全部怜悯之中。 Linux的吸引力在于它向用户提供了控制权,这就是为什么有这么多极客支持它并使其成为一个成功的操作系统的原因。

如果我是你,我会花时间研究另一件事是操作系统设计原则。设计一个好的浏览器,至少在理论上应该要求与设计一个好的操作系统相同的原则 - 特别是在并发流程,安全模型等方面。

最后,在完成了大量的研究之后,我应该开始编写代码:

  1. 重新设计 Mosaic ,但有自己的设计理念。如果您只是为了娱乐或自己的教育福利而这样做,我也会建议这样做。阅读原始的HTML 1.0和HTML 2.0规范,以及HTTP 1.1规范和当前的URI规范,并确保您的浏览器遵守所有这些规范。您当然可以下载已经处理传输协议,URI约定等的现有软件,但如果您认真考虑设计自己的浏览器,我认为从头开始做这些事情也是一个很好的练习,所以你可以很好地理解所有拼图如何组合在一起。在步骤0结束时,您应该拥有一个至少与90年代最先进的浏览器相当的浏览器。这是一个很好的第一个里程碑。您实际上可以在ftp://ftp.ncsa.uiuc.edu/Mosaic/下载原始Mosaic,并查看它与您的浏览器的对比情况。看看当前网站如何在像Mosaic这样的古老浏览器中呈现,这也是一个很好的练习。

  2. 在浏览器中添加对DOM的支持。首先关注W3C DOM Level 1和Level 2,因为几乎所有当前浏览器都完全支持这些。然后看第3级和第4级.DOM对于Web编程非常重要,因此如果您要实际构建一个现代Web浏览器,它的整个设计必须考虑到这一点。由于您使用C#编写浏览器,因此您可能需要考虑如何利用现有的.NET对象模型。

  3. 查看现有的脚本引擎,看看是否可以将它们移植到您的项目中。我不鼓励你编写自己的JavaScript解释器,不仅因为它本身就是一个非常大的项目,而且因为已经有很多工作用于优化JS编译器(例如V8)。因此,除非你是编译器设计的大师,否则你手工构建的JS解释器可能不如已经存在的那样,即使它完全遵循EMCAScript规范。同样,我认为脚本引擎应该是与实际浏览器完全独立的模块,所以我认为拥有一个允许你替换任何脚本引擎的框架,而不是构建一个脚本引擎会更有用。只适用于您的浏览器。

  4. 查看北美排名前10-20的网站(Google,Facebook,YouTube,Twitter,维基百科,亚马逊,热门博客平台等)的HTML / CSS / JS源代码,并设计浏览器与这些网站合作良好。这是一个比较容易解决的问题,而不是制作符合所有现有标准的浏览器(当前浏览器仍然做得不好),更不用说使浏览器正确呈现网络上的所有网站(没有人能做到这一点)。人们会抱怨你的浏览器违反标准等等,但这并不像人们抱怨他们无法通过浏览器访问Google或Facebook那样大。我无法想到任何浏览器在其首次发布时正确遵循所有(甚至大多数)标准,所以我说不要打扰尝试。如果你可以做一些人们想要使用的东西,那么就会有第二版或第三版,那么你就可以担心标准了。

答案 5 :(得分:6)

正如其他人已经说过的那样,网络浏览器是一个巨大的项目。你必须担心tcp / ip&套接字,渲染html,使用css,创建DOM模型,执行javascript,处理格式错误的标记和代码,以及处理所有类型的文件,然后你甚至可以考虑所有的事情期待从浏览器(即书签,历史,私人浏览,安全等)这是一个巨大的项目。

话虽如此,可以做到。我的建议是去看看Firefox的来源。我知道你说你想从头开始构建一个浏览器,但首先从开源项目中学习会非常有帮助。

我会下载Firefox源代码,然后慢慢删除它。换句话说,我会使用源代码并删除所有书签功能。然后,我将删除处理插件的能力。然后,我将删除有关保存文件的所有代码。我会继续这个过程,直到我有一个非常基本的Web浏览器。我会查看那段代码。

然后,我开始建立自己的。我将从拆开Firefox中获得的知识中获益,并将其用于构建新的浏览器。

给你带来了很多好运!

答案 6 :(得分:6)

Udacity现在有一个名为“构建Web浏览器”的课程 - https://www.udacity.com/course/programming-languages--cs262

答案 7 :(得分:4)

您可以从结构良好且有效的XHTML开始,这应该比您的浏览器在真实“生活”中遇到的标签汤更容易。

然后你必须找到一种方法来将网页上的真实HTML折叠到你的需要。

但不要自欺欺人:浏览器不是一个小项目。

答案 8 :(得分:2)

......然后开始担心安全问题

(非功能性和交叉问题通常应该在前面考虑:)但

答案 9 :(得分:1)

非常雄心勃勃的项目,但是一个开发人员无法独自完成这项任务,你需要一个团队(项目经理,测试员......),也许你应该检查你的语言选择c#只适用于windows(我知道linux上的单声道,但它不一样) 无论如何,我祝你好运,我很乐意使用你的浏览器:D

答案 10 :(得分:0)

你手上有很多空闲时间,不是吗? AFAIK,大多数浏览器都是用C ++编写的,并非所有用户都在他们的计算机上安装了.NET框架,如果他们这样做,可能不是你需要的版本。

这可能需要几年的时间,但无论如何,有很多开源浏览器,FireFox,谷歌Chrome等等,你可以先看看代码,祝你好运:)