关于解析:语言lexing:一次性或单独地提取字符串的性能更好?

Language lexing: better performance to lex a string all at once or individually?

我正在尝试构建我的第一个类C编程语言,可能是一个解释器,我刚刚迈出了第一步,也就是词法分析器。

我想通过简单地将整个源代码流全部放在一个然后让解析器处理数据来采取惰性路由。

我注意到,当解析器模块要求另一个令牌时,许多其他编译器和解释器在解析期间只是lex。

在程序的代码性能方面是否更快地同时使用lex源代码然后解析生成的标记或lex并单独解析标记?


"更快"是一个模糊的词。有不同类型的速度(延迟,绝对开始到完成持续时间,编译速度,执行速度),并且根据您实现语言的前端和后端的方式,任何一种方法都可以更快。

此外,更快并不总是更好。如果你的解析器在技术上更快,但是使用了太多的内存,它可能会崩溃或至少最终交换,这会再次降低它的速度。如果您的解析器闪电般快但生成的代码效率低下,那么您的用户将为您的开发速度加快付费。您必须编写实际代码并在分析器中运行它才能分辨出哪些更好,并提出哪些条件对您很重要。

在开始时对所有内容进行标记/排版意味着您可以优化内存分配,从而减少调整令牌列表等的时间,但这也意味着整个文件必须先进行修改才能进行部分解析。

OTOH如果你根据需要进行解析,你可能需要更频繁地以小步骤附加到你的阵列,所以你将支付内存惩罚,但是例如像JavaScript这样的解释语言,您可能只需要解析实际用于此运行的部分。

所以它很大程度上取决于您的语言细节以及您希望运行的硬件。在内存很少且没有交换的嵌入式系统中,您可能别无选择,只能逐步使用lex,因为整个程序源代码可能不适合内存。如果你的语言的语法需要很多前瞻,你可能看不到任何好处,因为你无论如何都要阅读它...