我决定从头开始构建一个Web浏览器.在开始之前我应该知道的现代Web浏览器的常见功能,体系结构和功能是什么?
任何建议都非常感谢!
好吧把它分解成碎片.什么是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引擎也很难.其中有几个往往与特定的渲染引擎相关联:
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中使用的Javascript引擎;
Opera(12.X及更少)也使用了自己的.
当然还有所有用户界面:页面之间的导航,页面历史记录,清除临时文件,输入URL,自动填充URL等等.
这是很多工作.
听起来像一个非常有趣的项目,但它需要你投入巨大的努力.
这不是一件容易的事,但从学术角度来看,你可以从中学到很多东西.
您可以检查的一些资源:
HTMLayout.NET:快速,轻量级和可嵌入的HTML/CSS渲染器和布局管理器组件.
GeckoFX:Windows Forms控件,可在任何Windows窗体应用程序中嵌入Mozilla Gecko浏览器控件.
SwiftDotNet:基于C#的Webkit的浏览器
Gecko DotNetEmbed
壁虎#
渲染网页 - 一步一步
但从现实的角度来看,从头开始编码所需的巨大努力让我想起了这个漫画:
http://www.geekherocomic.com/comics/2009-02-25-coding-overkill.png
祝好运 :-)
你的意思是在编写自己的渲染引擎时?
我只能说好运.许多人已进入当前这一代的各种浏览器,如果你想做得比其中任何一个更好,你将需要一些严肃的技能.如果你不得不问从哪里开始,你可能需要花费几年时间才能完成这项任务.
也就是说,这里有一些(明显的)指针:
写了很多做小事的代码,比如解决所有projecteuler.net问题
了解有关您的工具包及其社区标准的所有信息
写更多代码
掌握有限状态机的真正把握
写更多代码
了解tcp/ip堆栈的所有内容以及它如何用于http
学习关于http的所有知识
学习标准(html,xml,sgml,css)
庆祝你的150岁生日.
开始实际的浏览器项目.
在这里编辑
我并不是说它要么是激励性的,要么是消极的,只是试图告诉你浏览器是一个非常大的项目而且真正的大项目需要经过深思熟虑.直言不讳充满了幽默.
我一直在编程超过三分之二的生活,我喜欢认为我是一个相当不错的程序员,但我认为我有一半的机会从头开始编写一个像样的网络浏览器是愚蠢的. .
当然,如果这是你想做的事情,不要让我的评论挡在你的路上.你可能比Internet Explorer做得更好.
这是一个疯狂的雄心勃勃的项目(特别是对于单个开发人员而言),但有一天我想做的事情 - 你可以从中学到很多东西.
我不太了解协议如何工作(你肯定需要研究的东西)或者很多关于浏览器中发生的事情,但是一个很好的起点是开源浏览器的来源,主要是Chrome和Firefox浏览器.Chrome是一个特别好的项目,因为它们只会执行我希望您开始使用的内容:Chrome和浏览器的后端.暂时忘记创建渲染引擎 - 使用Webkit或Gekko.
大多数现代网络浏览器都是巨型动物,并且可能设计得相当糟糕,因为它们(以及网络本身)以相当随意的方式进化.
您需要首先明确地实现项目的目标(以及您希望实现的目标).这是你为了好玩而做的事情,还是你希望其他人使用你的浏览器?如果您希望其他人使用它,它们的激励是什么?期望您从头开发一个新的浏览器是不现实的,每个人都可以用它来替代Chrome,Safari,Firefox,IE,Opera等.所有这些项目都有10到15年的领先优势.你,当你赶上他们的时候,他们将比你提前10到15年.此外,他们背后有更多的人力,所以如果你想让你的项目取得成功,你需要在某些时候拥有这种力量.
这就是为什么拥有大量资源的大公司苹果和谷歌并非从零开始.甚至微软也从头开始.最初的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的吸引力在于它向用户提供了控制权,这就是为什么这么多极客支持它并使其成为一个成功的操作系统的原因.
如果我是你,我会花时间研究的另一件事是操作系统设计原则.设计一个好的浏览器,至少在理论上应该要求与设计一个好的操作系统相同的原则 - 特别是在并发流程,安全模型等方面.
最后,经过大量的研究后,我认为应该开始编码:
重新设计Mosaic,但有自己的设计理念.如果您只是为了娱乐或自己的教育福利而这样做,我也会建议这样做.阅读原始的HTML 1.0和HTML 2.0规范,以及HTTP 1.1规范和当前的URI规范,并确保您的浏览器遵守所有这些规范.您当然可以下载已经处理传输协议,URI约定等的现有软件,但如果您认真考虑设计自己的浏览器,我认为从头开始做这些事情是一个很好的练习,所以你得到了很好地理解所有拼图如何组合在一起.在步骤0结束时,您应该拥有一个至少与90年代最先进的浏览器相当的浏览器.这是一个很好的第一个里程碑.您可以在ftp://ftp.ncsa.uiuc.edu/Mosaic/下载原始Mosaic,并查看它与您的浏览器的对比情况.查看当前网站如何在像Mosaic这样的古老浏览器中呈现也是一个很好的练习.
在浏览器中添加对DOM的支持.首先关注W3C DOM Level 1和Level 2,因为几乎所有当前浏览器都完全支持这些.然后看看Level 3和Level 4. DOM对于Web编程非常重要,因此如果您要实际构建一个现代Web浏览器,那么整个设计必须考虑到这一点.由于您使用C#编写浏览器,因此您可能需要考虑如何利用现有的.NET对象模型.
查看现有的脚本引擎,看看是否可以将它们移植到您的项目中.我不鼓励你编写自己的JavaScript解释器,不仅因为这本身就是一个非常大的项目,而且因为已经有很多工作用于优化JS编译器(例如V8).因此,除非你是编译器设计的大师,否则你手工构建的JS解释器可能不如已经存在的那样,即使它完全遵循EMCAScript规范.同样,我认为脚本引擎应该是与实际浏览器完全独立的模块,所以我认为拥有一个允许你替换任何脚本引擎的框架,而不是构建一个脚本引擎会更有用.只适用于您的浏览器.
查看北美排名前10-20的网站(谷歌,Facebook,YouTube,Twitter,维基百科,亚马逊,流行的博客平台等)的HTML/CSS/JS源代码,并设计您的浏览器以便与这些网站良好协作.这需要解决的问题比制作符合所有现有标准的浏览器(当前浏览器仍然没有完美做到的事情)更难以解决,更不用说使浏览器正确呈现网络上的所有网站(没有人可以去做).人们会抱怨你的浏览器打破了标准等等,但这并不像人们抱怨他们无法通过浏览器访问Google或Facebook那样大.我想不出任何浏览器在其首次发布时正确遵循所有(甚至大多数)标准,所以我说甚至不打扰尝试.如果你可以做一些人们想要使用的东西,那么就会有第二版或第三版,那么你就可以担心标准了.
正如其他人已经说过的那样,网络浏览器是一个巨大的项目.你必须担心tcp/ip和套接字,渲染html,使用css,创建DOM模型,执行javascript,处理格式错误的标记和代码,以及处理所有类型的文件,然后你甚至可以考虑人们期望的所有事情.浏览器(即书签,历史,私人浏览,安全等)这是一个庞大的项目.
话虽如此,它可以做到.我的建议是去看看Firefox的来源.我知道你说你想从头开始构建一个浏览器,但首先从一个开源项目中学习是非常有帮助的.
我会下载Firefox源代码,然后慢慢删除它.换句话说,我将获取源并删除所有书签功能.然后,我将删除处理插件的能力.然后,我将删除有关保存文件的所有代码.我会继续这个过程,直到我得到一个非常基本的网络浏览器.我会查看那段代码.
然后,我开始建立自己的.我将从拆开Firefox中获得的知识中获取知识,并将其用于构建新的浏览器.
一个全部的运气给你!
Udacity现在有一个名为"构建Web浏览器"的课程 - https://www.udacity.com/course/programming-languages--cs262