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

mor*_*rog 5 html browser firefox google-chrome

适用于Chrome,Firefox和Safari(WebKit)等现代Web浏览器的代码库非常庞大.我很好奇是什么特别使他们的实现非常简单,他们需要大量的代码.

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

Bor*_*sky 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将字符串注入到解析器的输入流中的代码的代码,等等.请注意,胶水代码的数量通常是交互模块数量的二次方.

我可能错过了一些东西,但这不是我的头脑.

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

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