【问题标题】:How to get started building a web browser? [closed]如何开始构建 Web 浏览器? [关闭]
【发布时间】:2010-10-10 13:48:17
【问题描述】:

我决定从头开始构建一个网络浏览器。 在开始之前我应该​​了解哪些现代网络浏览器的常见功能、架构和特性

非常感谢任何建议!

【问题讨论】:

  • 是的,这是一个疯狂的项目,但我们不需要在这里拿米奇 - 我认为这是一个很好的讨论点,关于你如何解决这个问题 :)
  • 我记得前段时间的一篇文章,有人哀叹没有人再有胆量构建新的渲染引擎。他说,需要新的浏览器,因为今天的计算机已经不同了。多核。第一步是 Chrome,每个标签有 1 个进程。让我们看看接下来会发生什么。
  • 长一些球,做你想做的事。如果它有效,那就太好了。如果没有,请继续尝试,否则你最终会像社会的另一半说“不要创造任何新东西,就用我们已经拥有的破烂烂摊子。”
  • 你需要 Bradley Cooper Limitless 服用的那种药片之一。 ;)
  • 试一试。我敢打赌,它比这里的人说的要容易得多,尤其是如果您将许多现有组件连接在一起。解析一些文本并输出一些带有文本的彩色框有多难?

标签: c# browser


【解决方案1】:

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

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

您可以查看的一些资源:

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


(来源:geekherocomic.com

祝你好运:-)

【讨论】:

  • 哦,GHC 继续吗?当他们开始做罗斯的巢穴的事情时,我想我取消了订阅。
  • @Ross:是的,他们仍然提供漫画,那个新人叫鲍里斯,来自俄罗斯,他是一个“超级黑客”LOL
  • 如果我想做一个超级超级简单的浏览器作为学习练习,你有推荐的起点吗?例如,只有 HTML 没有 JS 或 CSS。
【解决方案2】:

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

  • 获取外部内容。因此您需要一个 HTTP 库或(不推荐)自己编写。 HTTP 协议有很多复杂性/微妙之处,例如处理过期标头、不同版本(尽管现在大多是 1.1)等;
  • 处理不同的内容类型。 此类事情有一个 Windos 注册表,您可以捎带。我说的是根据 MIME 类型解释内容;
  • 解析 HTML 和 XML:创建 DOM(文档对象模型);
  • 解析和应用 CSS:这需要了解所有属性、所有度量单位以及可以指定值的所有方式(例如“边框:1px 纯黑色”与单独的边框宽度等属性);
  • 实现 W3C 视觉模型(这是真正的关键);和
  • 拥有 Javascript 引擎

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

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

我和其他人齐心协力的原因是渲染引擎很难(而且,正如有人指出的那样,他们的开发已经花费了很多年)。主要的渲染引擎有:

  • Trident:由 Microsoft 为 Internet Explorer 开发;
  • 壁虎:用于 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 引擎也很难。其中有几个往往与特定的渲染引擎相关联:

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

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

这是大量的工作。

【讨论】:

  • * Gecko :) 也同意。主要部分是 HTML 渲染器和 JavaScript 引擎。
  • Opera 创建了自己的。 Presto 是当前的,而 Electra 是他们以前的。
  • 非常深入的回答 - 我忘记了 JavaScript 解析!
  • 不过,世界需要更多有能力构建浏览器的人。 cpeff.org/deeplinks/2016/04/save-firefox.
【解决方案3】:

大多数现代网络浏览器都是庞然大物,而且设计可能相当糟糕,因为它们(以及网络本身)以相当随意的方式发展。

首先,您需要将项目的目标(以及您希望实现的目标)非常明确。这是您只是为了好玩而做的事情,还是您希望其他人使用您的浏览器?如果你期望别人使用它,他们的动机是什么?期望你从头开始开发一个新的浏览器,每个人都可以用来替代 Chrome、Safari、Firefox、IE、Opera 等是不现实的。所有这些项目都有 10-15 年的领先优势你,当你赶上他们时,他们将比你领先 10-15 年。再加上他们背后有更多的人力,所以如果你想让你的项目成功,你会在某个时候需要这种人力。

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

您需要像构建操作系统一样构建 Web 浏览器,因为浏览器本质上就是这样——它是运行 Web 应用程序的操作系统。和操作系统一样,网络浏览器是一个非常复杂的软件,包含许多组件。当然,人们已经成功地从头开始创建新的操作系统。 Linus Torvalds 浮现在脑海中。他使 Linux 成为有史以来最成功的操作系统之一。

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

因此,假设您真的有足够的野心(或鲁莽)来尝试制作一款成功的新浏览器,那么您应该关注的是架构设计。除非您确定可以以某种方式改进现有浏览器的设计,否则没有实际理由从头开始构建新浏览器。这意味着您需要对 WebKitGecko 的代码足够熟悉,以了解他们所做的设计决策,但您不应该尝试复制他们的设计,因为否则你还不如直接使用他们的代码。

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

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

最后,在做了大量的研究之后,我认为这是你应该开始编码的地方:

  1. 重新设计马赛克,但使用您自己的设计理念。如果您只是为了娱乐或您自己的教育利益而这样做,这也是我的建议。阅读原始的 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,因为几乎所有当前的浏览器都完全支持它们。然后看看 Level 3 和 Level 4。DOM 是 web 编程的基础,所以如果你要真正构建一个现代 web 浏览器,它的整个设计都必须考虑到这一点。由于您使用 C# 编写浏览器,因此您可能需要考虑如何利用现有的 .NET 对象模型来发挥自己的优势。

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

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

【讨论】:

  • +1 对于今天的大多数 Web 浏览器代码来说,从 1990 年代开始就存在大量的旧垃圾。 Google 试图通过创建 Blink 来解决这个问题,它基本上是 Webkit with 8.8 million lines of crap removed,但即便如此,仍然有大量不可移动的根深蒂固的垃圾卡在 Blink 中。
  • ...如果谷歌今天开始构建浏览器,肯定会从头开始构建它,但现在它太贵了,因为它的所有员工都无法改造泰坦尼克号已经知道闪烁。一家拥有深厚技能和资金雄厚的资金来创建竞争性浏览器操作系统的新创业公司绝对可以比 Chrome 更具优势。
【解决方案4】:

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

我只能说祝你好运。当前一代的各种浏览器已经有很多年了,如果你想比它们中的任何一个做得更好,你将需要一些严肃的技能。如果你不得不问从哪里开始,那么你可能还有几年的学习时间才能尝试这样的任务。

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

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

在此处编辑

我的意思不是要激励或消极,只是想向您展示浏览器是一个非常大的项目,而真正的大项目需要大量的思考。直率的诚实中夹杂着幽默。

我已经有超过三分之二的时间在编程,我喜欢认为自己是一个相当不错的程序员,但如果我认为我有一半的机会写出一个像样的网络,那就太愚蠢了从头开始浏览器。

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

【讨论】:

  • 我应该提到:如果你想从头开始创建一个苹果派,你必须从创建一个宇宙开始。
  • 人年?几个世纪,确定吗?
  • @Kris 在没有任何东西可以创建宇宙的情况下如何创建宇宙?
  • @user2645707:我不知道,我只是在模仿比我聪明的人。 quotationspage.com/quote/26980.html
  • +1 表示“你可能比 Internet Explorer 做得更好。”
【解决方案5】:

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

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

【讨论】:

  • Chrome 不是开源的;但是它的大部分源代码都可以在 chromium 项目中找到
【解决方案6】:

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

【讨论】:

    【解决方案7】:

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

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

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

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

    祝你好运

    【讨论】:

    • 你能提供任何关于如何分解 Firefox 的指针吗?我的意思是,我得到一个exe 文件,在安装它后,我得到一个包含大量dll 文件的源文件夹。我如何研究执行此操作的实际代码以及其背后的逻辑?
    • 这条评论迟到了,但无论如何。 .EXE 和 .DLL 文件是编译步骤的结果,您不能指望它有多大意义。您需要源代码(不同文件中的一些 C++ 和其他语言)才能理解该程序。程序员需要理解他们自己的程序,因此他们倾向于分离和记录代码的各个功能部分。
    【解决方案8】:

    这是一个雄心勃勃的项目(尤其是对于单个开发人员而言),但我希望有朝一日能够做到这一点 - 你可以从中学到很多东西。

    我不太了解协议的工作原理(您肯定需要研究的东西)或浏览器中发生的事情,但一个很好的起点是开源浏览器的来源,主要是 Chrome 和 Firefox。 Chrome 是一个特别值得一看的项目,因为它们只做我希望你开始做的事情:chrome 和浏览器的后端。首先忘记创建渲染引擎 - 使用 Webkit 或 Gekko。

    【讨论】:

      【解决方案9】:

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

      那么你必须找到一种方法,将来自网络的真实 HTML 转变为你的需要。

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

      【讨论】:

        【解决方案10】:

        ...那就开始担心安全问题

        (不过,通常应该预先考虑非功能性和横切关注点 :))

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-08-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-11-25
          相关资源
          最近更新 更多