【问题标题】:Who is faster: PEG or GLR?谁更快:PEG 还是 GLR?
【发布时间】:2012-08-01 11:51:07
【问题描述】:

我正在尝试为C/AL programming language 创建某种lint 工具。所以基本上我需要对源代码进行语法和词法分析。我打算从头开始编写解析器,但后来发现有很多工具可以帮助自动生成这些解析器。

我需要性能,因为在一段中检查 20 兆字节的代码是正常情况,我需要该工具可以通过自定义规则进行扩展。所以我决定使用 JavaScript。

到目前为止,我已经找到了两个可以使用 JisonPEG.js 的生成器。

它们中的哪一个给了我更多的解析性能?也许不是比较库,而是算法?

哪个更适合我的需求(解析通用编程语言)?

更新: 我发现了类似的问答:

【问题讨论】:

    标签: javascript performance parser-generator peg glr


    【解决方案1】:

    一般来说,您可以从 Jison 实现的 shift-reduce 解析器获得非常好的解析性能。这可能有点老派,但它可以在非常紧张的内存需求和线性时间中工作。

    PEG 生成一种不同类型的解析器,它可能功能更强大,但需要更多内存才能产生相同的结果。 IE。 PEG 将需要与输入成比例的内存量,而 LALR 解析器将在更少的空间(一些表和一个小堆栈)中完成。

    【讨论】:

    • 如果像 GLR 或 LALR 这样的 LR 解析器对语法施加的限制(GLR 只使用更多的内存,而且速度有点慢),那么 LR 很可能是一个更快的解析器。解析器需要更长的时间来生成,因为它需要计算它的表。但在一般情况下,LR 解析器是非常高效的机器。
    • 除了使用解析器生成器的人之外,没有人关心解析器生成器运行多长时间。连他都不在乎;大解析器在几秒钟内生成,至少对于 LALR 解析器生成器和我所知道的大多数其他解析器。
    【解决方案2】:

    “我需要性能(对于 20Mb)......所以我决定使用 Javascript”。这些是矛盾的。

    精心编码的递归下降解析器可以非常快,但您必须编写大量代码。通常,LALR(1) 解析器(由 Bison 从语法等生成)非常快,并且非常容易编码。 (有 展示如何将 LALR 解析器直接编译为机器代码的技术论文;这些解析器速度非常快,但您需要实现很多自定义机制来构建解析器)。

    如果您想以最少的汗水实现高性能解析,您应该考虑LRStar。 (我知道并高度尊重作者,但除此之外与此无关)。这产生 非常快的 LALR 解析器。缺点:你必须让你的语法 LALR 兼容。 您将不得不以与您相同的方式扩展您的“规则” 扩展任何其他 C 程序:通过编写 C 代码。这似乎并没有更糟 比编写 JavaScript 恕我直言,但规则可能会执行得更快 在你考虑的规模上,这很重要。

    GLR 解析必然比 LALR 慢,因为它需要做更多的记账。但这只是一个不变的因素。与 LRStar 这样的高性能引擎相比,它可能非常重要(例如,100 倍)。这可能是值得的麻烦,因为将您的语法塑造成形状要容易得多,而且不那么复杂的语法可能会使编写自定义规则更容易。如果你真的有数百万行代码,这些解析器充其量只能是中等速度。

    PEG 基本上是一种回溯。它必须尝试一些事情,并在它们不起作用时回溯。它们必须比 LALR 解析器慢,至少要慢于它们所做的回溯量。你还有语法塑造问题。

    不过,您会发现,如果您想做的话,仅仅解析是不够的 任何最微弱的复杂。在这种情况下,您不想优化解析; 您想优化基础设施以进行程序分析。看我的文章 Life After Parsing 另一种选择。

    【讨论】:

    • 谢谢!我已经提到我想在lint 中有自定义规则,所以我肯定需要脚本语言和JavaScript(V8 node.js 实现)似乎比python、ruby 更快...
    • 我认为你没有理解我关于“解析后的生活”的观点。您似乎已经在 J​​avaScript 上确定了您对规则语言的选择,在这种语言中,您基本上拥有零基础设施来支持您的分析任务。因此,您可以利用广泛可用的语言来编写规则,并且不支持这些规则。我对你的实际成功感到悲观,除非你的规则基本上是微不足道的......那有什么意义呢?
    • 我正在阅读“解析后的生活”。它很长,我很不耐烦。对不起。我之所以关注 JS,是因为有一些 lint 工具提供了可用的源代码,这些源代码是用 JavaScript 编写的。我希望它会帮助我。但你是对的。任务艰巨……
    • 什么是“MSLOC”?
    • == "数以百万计的源代码行"。我修改了答案以使这一点更清楚。
    【解决方案3】:

    到目前为止,我已经找到了两个可以使用 Jison 和 PEG.js 的生成器。 哪一个给我更多的解析性能?

    根据我创建的 JavaScript Parser Libraries 基准 似乎 PEG.js 更快(至少在 Chrome/V8 上)。

    您可以在此处在线运行它: http://sap.github.io/chevrotain/performance/

    请注意,此基准测试使用非常简单的 JSON 语法进行比较 解析库的性能不是更大更复杂的编程语言语法。

    【讨论】:

      猜你喜欢
      • 2010-12-21
      • 2012-02-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-16
      • 2011-03-26
      相关资源
      最近更新 更多