为什么现代Web浏览器的代码库如此之大?

时间:2011-12-15 06:19:54

标签: html firefox google-chrome browser

Chrome,Firefox和Safari(WebKit)等现代网络浏览器的代码库非常庞大。我很好奇是什么特别使他们的实现变得如此重要,以至于他们需要大量的代码。

作为一个推论,如果一个假设的浏览器只支持严格的HTML5和JavaScript,为了避免兼容性攻击,代码库是否会显着缩小?

2 个答案:

答案 0 :(得分:7)

关于第一个问题,请考虑现代浏览器需要实现的内容(某些浏览器会将其中的一部分工作推送到操作系统服务):

  1. 至少有几种解析器:XML,HTML,JavaScript,CSS。
  2. 至少四个独立的布局系统(CSS box model,flexbox,SVG,MathML)。
  3. 至少一个图形库;对于跨平台浏览器,这需要每平台后端(IE9 +只使用系统Direct2D库;据我所知,Mac上的Safari只使用Quartz。)
  4. 一个高性能虚拟机,带有JIT,垃圾收集器,一些标准库(一直在增长;请参阅类型化数组和各种其他最新的JavaScript功能)。
  5. DOM实现,包括HTML特定和特定于SVG的DOM接口等各种内容。
  6. 音频和视频处理设施(Mac上的Safari再次将IE卸载到操作系统)。
  7. 图像处理设施,至少支持JPG / GIF / PNG。同样,某些浏览器可能能够将部分内容卸载到操作系统中。
  8. 用于将字节流转换为Unicode字符的库。同样,有时可以将其卸载到操作系统,有时也不会卸载。
  9. 对于跨平台浏览器,某种可移植性层抽象出平台特定的位。
  10. 带有事务和可编程API的HTML编辑器;认为是满足的。
  11. textareas的纯文本编辑器。其中一些可以与HTML编辑器共享,也许。
  12. 拼写检查程序,可能会也可能不会卸载到操作系统。
  13. 支持HTTP的网络库,可能是SPDY,可能是FTP,也可能是其他一些协议。同样,这可能会也可能不会卸载到操作系统。
  14. 用于处理SSL和其他各种加密需求的加密库。同样,这可能会也可能不会卸载到操作系统。
  15. 至少有一个数据库实现(sqlite似乎很受欢迎)。
  16. 实际用户界面的各种代码和诸如此类的。
  17. 用于处理所有这些之间交互的胶水代码:在JavaScript和DOM之间来回管理调用的代码,在DOM更改时管理重新计算样式和布局信息的代码,处理document.write注入字符串等内容的代码从JavaScript到解析器的输入流,等等。请注意,胶水代码的数量通常是交互模块数量的二次方。
  18. 我可能错过了一些事情,但这不是我的头脑。

    除此之外,至少Gecko和WebKit都有字符串和数组之类的模板库(因为C ++标准库有各种缺点)。

    其余的......在这一点上,许多“兼容性黑客”实际上是Web标准的一部分。所以你无法完全避免它们。您的场景涉及JavaScript和HTML,但不涉及SVG或MathML或CSS。如果你真的只是指HTML和JavaScript而不是CSS或其他,那么你显然可以删除一堆代码。如果你包括所有这些,加上HTML5的音频和视频功能,并希望你的浏览器表现良好,那么我怀疑你可以把它做得更小。

答案 1 :(得分:1)

我认为现代网络浏览器是复杂的应用程序。主要是,他们有渲染引擎,必须处理不同种类的HTML,处理非HTML格式(如XML,RSS等),CSS处理程序,Javascript引擎有时使用JIT。

除此之外,它们还具有插件架构和API,用于抽象平台之间差异的部分,通常使用其他应用程序使用的组件构建。

这使得它们非常重要。至于你的作品,我想是的。 Lynx非常小,不支持Javascript或花哨的HTML。