如何开始构buildWeb浏览器?
我决定从头开始构buildWeb浏览器。 在开始之前,我应该了解哪些现代Web浏览器的常见function,体系结构和function ?
任何build议,高度赞赏!
好把它分解成碎片。 什么是Web浏览器? 它有什么作用? 它:
- 获取外部内容。 所以你需要一个HTTP库或(不build议)自己写这个。 HTTP协议有很多复杂/细微之处,例如处理expires头文件,不同版本(尽pipe现在大多数是1.1)等等。
- 处理不同的内容types。 这是一个Windosregistry,你可以搭载这种东西。 我在这里讲解基于MIMEtypes的内容;
- 分析HTML和XML :创build一个DOM(文档对象模型);
- 分析和应用CSS :这需要了解所有的属性,所有的度量单位和所有的值可以指定的方式(例如“border:1px纯黑”与单独的边框宽度等属性)。
- 实现W3C视觉模型 (这是真正的踢球者); 和
- 有一个Javascript引擎 。
这基本上是一个简单的Web浏览器。 现在其中一些任务非常复杂。 即使是那些容易听起来的声音也很难。 获取外部内容。 你需要处理用例如:
- 有多less个并发连接要使用?
- 向用户报告错误;
- 代理;
- 用户选项;
- 等等
我和其他人共同提高我们的眉毛的原因是渲染引擎是困难的(正如有人指出,人类年已经进入他们的发展)。 主要的渲染引擎是:
- Trident:由微软为Internet Explorer开发的;
- 壁虎:在Firefox中使用;
- Webkit:用于Safari和Chrome 0-27;
- KHTML:用于KDE桌面环境。 Webkit从几年前的KHTML中分离出来;
- Elektra:用于歌剧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:在Internet Explorer中使用的Trident的Javascript引擎;
- JavascriptCore:由Safari浏览器在Webkit中使用;
- SquirrelFish:将在Webkit中使用,并增加JIT如TraceMonkey;
- V8: Chrome和Opera中使用Google的Javascript引擎;
- 歌剧(12.X和更less)也使用自己的。
当然还有所有用户界面的东西:页面之间的导航,页面历史logging,清除临时文件,inputURL,自动完成URL等等。
这是很多工作。
听起来像一个非常有趣的项目,但它会要求你投入巨大的努力。
这不是一件容易的事,但从学术的angular度来看,你可以从中学到很多东西。
您可以检查的一些资源:
- HTMLayout.NET :快速,轻量级和可embedded的HTML / CSS渲染器和布局pipe理器组件。
- GeckoFX :在任何Windows窗体应用程序中embeddedMozilla Gecko浏览器控件的Windows窗体控件。
- SwiftDotNet :基于C#中的Webkit浏览器
- 壁虎DotNetEmbed
- 壁虎#
- 呈现一个网页 – 一步一步
但从现实的angular度来看,从头开始编码需要付出巨大的努力,这让我想起了这个漫画:
comics/2009-02-25-coding-overkill.png
祝你好运 :-)
这是一个疯狂的雄心勃勃的项目(特别是对于一个开发人员),但是总有一天我愿意去做 – 你可以从中学到很多东西。
我对协议的工作方式(你肯定需要研究的东西)或者在浏览器中发生的事情不了解很多,但是一个很好的开始的地方是开源浏览器的源头,主要是Chrome和Firefox浏览器。 Chrome浏览器是一个特别好的项目,因为它们只做我期望的开始:Chrome和浏览器的后端。 首先忘记创build渲染引擎 – 使用Webkit或Gekko。
你的意思是在写你自己的渲染引擎?
我只能说好运。 许多男人的时代已经进入了当代的各种浏览器,如果你想要比他们中的任何一个都做得更好,你需要一些认真的技能。 如果你不得不问从哪里开始,那么在尝试完成这个任务之前,你可能需要经过几年的学习。
这就是说,这里有一些(明显的)指针:
- 写很多小东西的代码,像解决所有projecteuler.net问题
- 学习一切你可以关于你的工具包和它的社区标准
- 写更多的代码
- 真正掌握有限状态机
- 写更多的代码
- 学习所有关于tcp / ip堆栈以及它如何用于http
- 学习所有你可以关于HTTP
- 学习标准(html,xml,sgml,css)
- 庆祝你的150岁生日。
- 开始实际的浏览器项目。
在这里编辑下面
我的意思不是要激励或者激励,而是试图告诉你浏览器是一个非常大的项目,真正的大项目需要很多的思考。 坦率的诚实撒上幽默。
我已经编程了三分之二的生活,我喜欢认为我是一个相当不错的程序员,但是我认为从头开始编写一个体面的Web浏览器的机会是半个的,这是愚蠢的。 。
当然,如果这是你想要做的,不要让我的评论挡住你的方式。 你可能比Internet Explorer做得更好。
大多数现代networking浏览器都是巨兽,而且可能devise得相当不好,因为它们(以及networking本身)以相当随意的方式进化。
您需要首先明确地制定项目的目标 (以及您希望实现的目标)。 这是你只是为了好玩而做的事,还是你希望其他人使用你的浏览器? 如果你期望别人使用它,他们的动机是什么? 期望你将从头开发一个新的浏览器,每个人都可以用来替代Chrome,Safari,Firefox,IE,Opera等,这是不现实的。所有这些项目都有10到15年的开端你,当你追上他们的时候,他们会比你早10到15年。 另外,他们身后有更多的人力,所以如果你想让你的项目取得成功,那么在某个时刻你就需要那个人的力量。
这就是苹果和Google这些拥有大量资源的大公司并没有从零开始的原因。 连微软都没有从头开始。 原来的IE是基于Mosaic的。 今天仍然是从头开始的唯一重要浏览器是Opera , Konqueror和Lynx ,不幸的是它们的市场份额都很小。 让我们暂时忘记Lynx,因为它是一个纯文本浏览器,据推测,它仍然是唯一的原因是因为它服务于特定的利基。 歌剧可以说是有史以来最好的浏览器之一,但它从来没有很大的市场份额,所以要记住,成功和创新不是一回事。 KHTML是Konqueror的引擎,它从来没有成功,但它是Apple和Google使用的WebKit的基础。 我认为可以肯定地说,如果KHTML从来没有做过,那么Safari或Chrome都不存在。 有趣的是,KHTML和Opera都是由挪威的程序员在奥斯陆同一栋楼里工作的。
您需要考虑构build一个像构build操作系统一样的Web浏览器,因为这本质上就是浏览器 – 它是运行Web应用程序的操作系统。 就像操作系统一样,网页浏览器是一个非常复杂的软件,有许多组件。 当然,人们已经成功地从头开始创build新的操作系统。 Linus Torvalds浮现在脑海。 他制作了Linux,这是有史以来最成功的操作系统之一。
当然,你还面临着一个额外的挑战,这使得构build一个新的成功的浏览器比build立一个新的成功的操作系统更困难。 预计浏览器将完美地运行在networking上的所有遗留代码。 现在假设Linus Torvalds被告知,除非它完全向后兼容UNIX或某些现有的操作系统,否则他的新操作系统无关紧要。 我怀疑他会困扰,Linux可能不会存在。 当然,实际上,Linux成为stream行的唯一原因是因为它devise的很好,GNU项目能够将大量现有代码移植到Linux上。 没有GNU对Linux的意识形态支持,它永远不会有机会。
所以,假设你真的是雄心勃勃(或者是傻瓜式),试图创造一个新的成功的浏览器,那么你应该关注的是架构和devise 。 除非您确定可以通过某种方式改进现有浏览器的devise,否则从零开始构build新的浏览器没有实际的理由。 这意味着您需要足够熟悉WebKit和Gecko的代码,以了解他们所做的devise决策,但是您不应该试图复制他们的devise,否则您可能只是使用他们的代码。
我个人的想法(没有做足够的研究)是今天的浏览器不够模块化。 如果我要创build一个新的浏览器,我会find一种方法来轻松地进行交换(比如用一个JavaScript引擎replace另一个JavaScript引擎),并且为用户提供比现有的浏览器更多的控制权。 现代的浏览器和网页devise师几乎把所有的控制都从用户手中带走了。 为什么用户不能告诉Web浏览器如何呈现正在我的机器上显示的内容? 原始的HTML只给出了如何构build内容的指导方针,随着时间的推移,新的标准变得越来越教条化,直到用户现在完全处于网页devise者的地位。 Linux的吸引力在于它控制了用户,这就是为什么这么多的极客支持它,并成为一个成功的操作系统。
另一件事情,我花时间研究,如果我是你,是操作系统devise原则。 devise一个好的浏览器,至less在理论上,需要与devise一个好的操作系统相同的原则 – 尤其是在并发进程,安全模型等方面。
最后,在做了大量的研究之后,我认为这是你应该开始编码的地方:
-
重新devise马赛克 ,但有自己的devise理念。 这也是我build议,如果你只是为了好玩或自己的教育好处。 阅读原始的HTML 1.0和HTML 2.0规范,以及HTTP 1.1规范和当前的URI规范,并确保您的浏览器遵守所有规格。 你当然可以下载已经处理传输协议,URI约定等的现有软件,但是如果你真的想要devise自己的浏览器,我认为从头开始做这些事情是一个很好的练习,所以你可以很好的理解所有的拼图如何融合在一起。 在第0步结束时,你应该有一个浏览器,至less可以与90年代最先进的浏览器相媲美。 这是一个好的第一个里程碑。 实际上,您可以在ftp://ftp.ncsa.uiuc.edu/Mosaic/下载最初的Mosaic,并查看它与浏览器的比较。; 看看现在的网站如何在古代的浏览器如马赛克中渲染也是一个很好的练习。
-
添加对DOM的支持到您的浏览器。 首先关注W3C DOM Level 1和Level 2,因为几乎所有当前的浏览器都完全支持这些。 然后看第3级和第4级.DOM对于networking编程来说是非常重要的,所以如果你打算真正build立一个现代化的networking浏览器,那么整个devise必须考虑到这一点。 由于您正在使用C#编写浏览器,因此您可能需要考虑如何利用现有的.NET对象模型。
-
看看现有的脚本引擎,看看你是否可以移植到你的项目。 我不鼓励你编写你自己的JavaScript解释器,不仅因为这本身就是一个非常大的项目,而且还因为JS编译器(例如V8)的优化已经做了很多工作。 所以,除非你是编译器devise的专家,否则你的手工编译的JS解释器可能会比已经存在的JS解码器逊色,即使它完全遵循EMCAScript规范。 再次,我认为脚本引擎应该是一个完全独立于实际浏览器的模块,所以我认为有一个框架可以替代任何脚本引擎,而不是构build一个脚本引擎只适用于您的浏览器。
-
查看北美前10-20个网站(Google,Facebook,YouTube,Twitter,维基百科,亚马逊,stream行博客平台等)的HTML / CSS / JS源代码,并devise浏览器以便与这些网站。 与使浏览器符合所有现有标准(目前的浏览器仍然不能完美实现的东西)相比,这是一个更容易处理的问题,更不用说使浏览器能够正确呈现networking上的所有网站(没有人可以去做)。 人们会抱怨说,你的浏览器打破了标准,但是这不是一个大问题,因为人们抱怨他们无法通过浏览器访问Google或Facebook。 我想不出任何浏览器在第一个版本上都遵循了所有(甚至是大多数)标准,所以我说甚至不用去尝试。 如果你能做出一些人们想要使用的东西,那么将会有第二或第三版本,那么你可以担心在那个时候的标准。
Udacity现在有一门名为“构buildWeb浏览器”的课程 – https://www.udacity.com/course/programming-languages–cs262
正如其他人已经说过的,networking浏览器是一个巨大的项目。 你必须担心tcp / ip和套接字,渲染html,使用css,创build一个DOM模型,执行javascript,处理格式错误的代码和处理所有types的文件,甚至可以考虑所有人们所期望的事情一个浏览器(即书签,历史,隐私浏览,安全等)这是一个巨大的项目。
这就是说,这是可以做到的。 我的build议是去看Firefox的来源。 我知道你说你想从头开始构build浏览器,但是首先从开源项目中学习会非常有帮助。
我会下载Firefox源代码,并慢慢剥离下来。 换句话说,我会采取的源代码,并删除所有的书签function。 然后,我删除了处理插件的能力。 然后,我会删除所有有关保存文件的代码。 我会继续这个过程,直到我有一个非常基本的networking浏览器。 我会查看该代码。
然后,我会开始build立自己的。 我会把我从Firefox中分离出来的知识拿出来,然后把它用来构build一个新的浏览器。
祝你好运 !
您可以从格式良好且有效的XHTML开始,这应该比您的浏览器在真实“生活”中遇到的标签汤更容易。
然后,你必须find一种方法来从networking上弯曲真正的HTML到你的需要。
但不要欺骗自己:浏览器不是一个小项目。
然后开始担心安全
(非function性和横切关注点应该在前面尽pipe:))
非常雄心勃勃的项目,但一个开发人员不能单独做到这一点,你需要一个团队(项目经理,testing人员…),也许你应该审查你的select语言C#作品只在Windows上(我知道在Linux单声道,但它不是同样)无论如何,我祝你好运,我会很乐意使用您的浏览器:D
你真的有很多空闲时间在你手中,不是吗? AFAIK,大多数浏览器是用C ++编写的,并不是所有的用户都在他们的计算机上安装了.NET框架,如果他们这样做,可能不是你需要的版本。
这可能需要你几年,但无论如何,有很多开源的浏览器,FireFox,谷歌浏览器等,你可以先看看代码,祝你好运:)