如何开始构建Web浏览器?[关闭]


88

我决定花些力气从头开始构建Web浏览器。在开始之前,我应该了解现代Web浏览器的常见功能,体系结构和功能是什么?

任何建议都受到高度赞赏!


9
是的,这是一个疯狂的项目,但是我们不需要在这里拿米奇-我认为这是关于如何解决这个问题的一个很好的讨论点:)
Ross

8
我记得前一段时间的一篇文章,有人抱怨说,没有人再有胆量来构建新的渲染引擎了。他说,需要新的浏览器,因为当今的计算机有所不同。多核。第一步是Chrome,每个选项卡进行1次处理。让我们看看接下来会发生什么。
stesch

35
成长一些球,做你想做的。如果可行,那就太好了。如果没有,那就继续努力,否则你将像社会的另一半一样说:“不要创造任何新东西,只要利用我们已经拥有的破烂狗屎。”
uSeRnAmEhAhAhAhAhA13年

7
您需要Bradley Cooper服用Limitless中的其中一种药。;)
Ali Gajani 2015年

3
搏一搏。我敢打赌,它比这里的人们要容易得多,尤其是如果您将许多现有组件连接在一起的话。解析一些文本并输出其中带有文本的彩色框有多困难?
伊恩·沃伯顿

Answers:


125

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

  • 获取外部内容。 因此,您需要一个HTTP库或(不推荐)自己编写此库。HTTP协议有很多复杂性/细微之处,例如处理到期标头,不同的版本(尽管如今大多数情况下为1.1)等;
  • 处理不同的内容类型。 对于此类事情,您可以使用Windos注册表。我在这里讨论基于MIME类型的内容;
  • 解析HTML和XML:创建DOM(文档对象模型);
  • 解析并应用CSS:这需要理解所有属性,所有度量单位以及可以指定值的所有方式(例如,“ border:1px纯黑色”与单独的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;
  • 闪烁:用于Chrome 28 +,Opera 15 +,webkit fork;

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

JavaScript引擎也很难。其中有一些倾向于与特定的渲染引擎相关联:

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

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

那是很多工作。


*壁虎:)也同意。主要部分是HTML渲染器和JavaScript引擎。
09年

1
歌剧创造了自己的。Presto是当前版本,而Electra是他们之前的版本。
蒂姆·沙利文

很棒的深入答案-我忘了JavaScript一起解析!
罗斯

1
但是,这个世界需要更多有能力构建浏览器的人。cp eff.org/deeplinks/2016/04/save-firefox
Pacerier '17

26

听起来这是一个非常有趣的项目,但需要您付出巨大的努力。

这不是一件容易的事,但是从学术角度来看,您可以从中学到很多

您可以检查一些资源:

但是从现实的角度来看,从头开始编写代码需要付出巨大的努力,这使我想起了这部漫画:


(来源:geekherocomic.com

祝好运 :-)


哦,GHC还在继续吗?当他们开始做罗斯的巢穴之事时,想想我已经退订了。
罗斯,2009年

@罗斯:是的,他们仍然提供漫画,那个来自俄罗斯的新人叫鲍里斯,他是“超级黑客”
哈哈

17

大多数现代Web浏览器都是巨大的野兽,并且可能设计得很差,因为它们(以及Web本身)以一种相当随意的方式发展。

您首先需要非常明确地说明项目目标(以及您希望实现的目标)。这是您只是为了娱乐而做的事情,还是希望其他人使用您的浏览器?如果您期望其他人使用它,那么对他们的激励将是什么?期望您从头开始开发一个新的浏览器,使每个人都可以替代Chrome,Safari,Firefox,IE,Opera等,这是不切实际的。所有这些项目都需要10-15年的开发时间您,当您赶上他们时,他们将比您再领先10至15年。另外,他们背后还有很多人力资源,因此,如果您希望您的项目成功,那么在某个时候就需要这种人力资源。

这就是拥有大量资源的苹果和谷歌没有从头开始的原因。甚至没有微软从头开始。原始的IE基于Mosaic。至今仍是从零开始的唯一重要浏览器是OperaKonquerorLynx,不幸的是,它们的市场份额都很小。现在让我们忘掉Lynx,因为它是一个纯文本浏览器,大概它仍然存在的唯一原因是因为它服务于特定的利基市场。Opera可以说是有史以来最好的浏览器之一,但是它从来没有占有很大的市场份额,因此请记住,成功和创新不是一回事。KHTML是Konqueror背后的引擎,Konqueror从未成功,但它是Apple和Google都使用的WebKit的基础。我认为可以肯定地说,如果从未制作过KHTML,就不会存在Safari或Chrome。有趣的是,KHTML和Opera基本上都是由在奥斯陆同一座大楼工作的挪威程序员制作的。

您需要像构建操作系统那样看待构建Web浏览器,因为本质上这就是浏览器-它是用于运行Web应用程序的操作系统。就像操作系统一样,Web浏览器是一个非常复杂的软件,包含许多组件。当然,人们已经成功地从头开始创建了新的操作系统。莱纳斯·托瓦尔兹(Linus Torvalds)浮现在脑海。他使Linux成为有史以来最成功的操作系统之一。

当然,您还面临其他挑战,这使得构建新的成功浏览器比构建新的成功操作系统更加困难。期望浏览器能够完美地运行所有漂浮在网络上的旧代码。现在,假设Linus Torvalds被告知,除非与UNIX或某些现有操作系统完全向后兼容,否则他的新操作系统就无关紧要。我怀疑他会烦恼,而Linux可能今天不会存在。当然,实际上,使Linux流行的唯一原因是因为它设计合理,并且GNU项目能够提供将大量现有代码移植到Linux的工具。没有GNU对Linux的意识形态支持,它永远不会有机会。

因此,假设您确实有足够的雄心勃勃(或很顽强)尝试创建一个成功的新浏览器,那么您应该重点关注的是体系结构设计。除非您确定可以以某种方式改进现有浏览器的设计,否则没有从头开始构建新浏览器的实际理由。这意味着您需要足够熟悉WebKitGecko的代码以了解他们的设计决策,但是您不应该尝试复制他们的设计,因为否则您可能只使用他们的代码。

我个人的想法(没有做足够的研究)是当今的浏览器不够模块化。如果我要创建一个新的浏览器,我将找到一种方法,使输入和输出的交换变得容易(例如用另一个JavaScript引擎替换),并为用户提供比现有浏览器更多的控制权。现代的浏览器和网页设计师几乎将所有控制权从用户手中夺走了。用户为什么不能告诉Web浏览器我希望它如何呈现在计算机上显示的内容?原始的HTML仅提供了有关如何组织内容的指南,并且随着时间的流逝,更新的标准变得越来越教条化,以至于用户现在完全可以由Web设计师决定。Linux的吸引力在于它可以将控制权交还给用户,而且

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

最后,在进行了很多研究之后,我认为这是您应该开始编码的地方:

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

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

  3. 查看现有的脚本引擎,看看是否可以将其移植到您的项目中。我不鼓励您编写自己的JavaScript解释器,这不仅是因为它本身是一个非常大的项目,而且还因为优化JS编译器(例如V8)已经投入了很多工作。因此,除非您是编译器设计的专家,否则您手工构建的JS解释器可能会逊色于现有的JS解释器,即使它完美地遵循了EMCAScript规范。同样,我认为脚本引擎应该是与实际浏览器完全独立的模块,因此,我认为拥有一个框架来替代任何脚本引擎而不是构建脚本引擎会更加有用。仅适用于您的浏览器。

  4. 查看北美排名前10-20的网站(Google,Facebook,YouTube,Twitter,Wikipedia,亚马逊,流行的博客平台等)的HTML / CSS / JS源代码,并设计您的浏览器以使其与这些网站兼容。与使浏览器符合所有现有标准(当前的浏览器仍不能完美运行)相比,这要解决的问题要棘手得多。去做)。人们会抱怨您的浏览器不符合标准,因此,这并不像人们抱怨他们无法使用您的浏览器访问Google或Facebook那样大。我想不到任何浏览器在其第一版中就正确地遵循了所有(甚至大多数)标准,因此我说甚至都不必尝试。


1
如今,大多数Web浏览器代码的+1都从1990年代就被大量的废话糟透了。Google试图通过创建Blink来解决此问题,Blink基本上是Webkit,删除了880万行废话,但仍然有大量无法移动的根深蒂固的废话卡在Blink内。
Pacerier '17

1
...如果Google今天开始构建浏览器,它肯定会从头开始构建它,但是现在,对于他们来说,使用Titanic太昂贵了,因为所有员工都已经知道Blink。一家拥有深厚技能,资金雄厚的新创公司可以创建竞争性的浏览器操作系统,绝对可以胜过Chrome。
Pacerier '17

15

您是说编写自己的渲染引擎?

我只能说好运。当今的各种浏览器已经投入了很多年的时间。如果您想做得更好,那么您将需要一些认真的技能。如果您不得不问从哪里开始,那么您可能需要进行数年的研究,才可以尝试执行此任务。

也就是说,这里有一些(显而易见的)指针:

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

在这里编辑

我并不是说要激励别人或激励别人,只是想向您展示浏览器是一个非常大的项目,而真正的大项目则需要很多思考。坦率的诚实洒上幽默。

我从事编程工作已经超过了我三分之二的时间,我想认为自己是一个相当不错的程序员,但是认为我有一半的机会从头开始编写一个不错的Web浏览器是很愚蠢的事。 。

当然,如果这是您要执行的操作,请不要妨碍我的评论。您可能比Internet Explorer做得更好。


12
我应该提到:如果要从头开始创建苹果派,则必须先创建一个Universe。
克里斯2009年

@ Mk12:的确如此,谢谢。更新。
克里斯(Kris)

1
@Kris当没有什么可创建的宇宙时,如何创建它?
uSeRnAmEhAhAhAhAhA13 2013年

1
@ user2645707:我不知道,我只是在模仿比我聪明的人。quotationspage.com/quote/26980.html
克里斯(Kris)2013年

12
为“您可能比Internet Explorer做得更好” +1。
Pulah Nandha 2014年

14

这是一个疯狂的野心勃勃的项目(尤其是对于单个开发人员而言),但是我有一天想做些事情-您可以从中学到很多。

我对协议的工作原理(您确实需要研究的东西)或浏览器中发生的事情一无所知,但是一个很好的起点是开源浏览器(主要是Chrome和火狐浏览器。Chrome是一个非常好的项目,因为它们只能完成我希望您开始的工作:Chrome和浏览器的后端。首先不要忘记创建渲染引擎-使用Webkit或Gekko。


8

正如其他人已经说过的那样,Web浏览器是一个巨大的项目。您必须担心tcp / ip&sockets,渲染html,使用CSS,创建DOM模型,执行javascript,处理格式错误的标记和代码以及处理所有类型的文件,然后才可以考虑人们的所有期望。浏览器(即书签,历史记录,私人浏览,安全性等),这是一个巨大的项目。

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

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

然后,我将开始构建自己的。我将利用拆解Firefox所获得的知识,并将其用于构建新的浏览器。

一个全部的运气给你!


您能否提供任何有关如何解散Firefox的指针?我的意思是,我得到一个exe文件,安装后得到一个包含很多dll文件的源文件夹。我如何研究执行此操作的实际代码以及此操作背后的逻辑?
2013年

这则评论晚了,但是无论如何。.EXE和.DLL文件是编译步骤的结果,您不能期望对此有所了解。您将需要源代码(某些C ++和其他语言在不同的文件中)来使程序有意义。程序员需要理解他们自己的程序,因此他们倾向于分离并记录代码的各个功能部分。
罗伊·普林斯


4

您可以从格式正确且有效的XHTML开始,它应该比您的浏览器在实际的“生活”中遇到的标记汤更容易。

然后,您必须找到一种方法,将真正的HTML从Web弯曲到您的需求。

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


3

...然后开始担心安全性

(尽管非功能性和跨领域的关注通常应该被预先考虑:))


1

一个非常雄心勃勃的项目,但是一个开发人员不能一个人完成,您需要一个团队(项目经理,测试人员...),也许您应该查看自己的语言选择c#仅在Windows上有效(我知道Linux上的mono,但事实并非如此)同样)无论如何,我希望你好运,我将很乐意使用您的浏览器:D


0

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

这可能会花费您数年时间,但是无论如何,那里有许多开源浏览器,如FireFox,Google Chrome等。您可以先看一下代码,祝您好运:)


1
Chrome不是开源的;但是其大多数源代码都可以在Chrome项目中找到
匿名
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.