2

据我所知,HTML 解析由于其强依赖性而难以并行化。

是否存在或正在设计任何并行 HTML 解析器,以便可以并行解析单个 HTML 文档并最终生成单个 DOM 树?

它可能适用于早期的 HTML 版本,也可能适用于最新的 HTML5。

4

1 回答 1

3

从解析的角度来看,HTML 中的“强依赖关系”与您可能解析的任何其他语言中的强依赖关系没有太大区别。真正的问题是解析文件的一部分,通常取决于左边的上下文。并行解析器的问题是如何获取左上下文?

关于如何构建并行解析器的一般理论,通过将文本分成块,分别解析它们并将部分拼接在一起。McKeeman 的论文(参考)声称 N 个处理器的加速比为 0.85N。

我似乎记得一篇论文提出从两端解析文件,在中间相遇。右向解析器生成左上下文;左行解析器生成正确的上下文。您可以通过反转语法相对容易地进行双向扫描,并将前向和后向语法提供给解析器生成器。将它们粘合在一起可能需要参考论文中概述的各种技术。

我们的 DMS Software Reengineering Toolkit 有一个 GLR 解析器,它使用流水线将词法分析阶段与解析分开,并且有一个完整的 HTML4 解析器可用。(DMS 建立在并行基础之上;将其配置为并行解析单个文件也相对容易。)使用 DMS 对语言方言的支持,HTML4 解析器很可能扩展到 HTML5。

作为一般规则,如果您只解析一个程序(或 HTML)文件,这种并行性实际上并不重要,因为它不会对您的整体性能产生太大影响。大多数解析器都非常快,它们的时间主要用于处理单个字符的工作。通过将文件分成块并单独对块进行词法分析,您可能会获得很大的加速,特别是因为大部分 HTML 文件都浪费了空格。

如果您必须处理大量HTML 文件,那么每个文件解析一个线程可能会更好。然后您可以在每个线程中使用非常传统的解析器技术。

于 2012-12-16T00:53:45.007 回答