语言词法分析:一次或单独对字符串进行词法分析的性能更好?

Posted

技术标签:

【中文标题】语言词法分析:一次或单独对字符串进行词法分析的性能更好?【英文标题】:Language lexing: better performance to lex a string all at once or individually? 【发布时间】:2017-05-16 06:44:06 【问题描述】:

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

我曾考虑采用惰性路线,只需对整个源代码流进行词法分析,然后让解析器处理数据。

我注意到许多其他编译器和解释器仅在解析器模块请求另一个令牌时才在解析期间进行 lex。

在代码性能方面,对于程序而言,一次对所有源代码进行 lex 源代码然后解析生成的标记或 lex 并单独解析标记是否更快?

【问题讨论】:

按需 lex 更快。否则,您会增加巨大的延迟:在词法分析完成之前,甚至无法开始解析。 为什么会更快呢?我正在尝试理解这个理论。 总的来说,我认为这是一个很好的问题,但它不适合 ***。 *** 需要特定的问题,这是一个非常广泛的问题,试图涵盖词法分析可能发生的所有方式。因此,我投票结束。 要给出一些答案,这取决于。某些语言/语法的设计使您不必对整个输入进行 lex/parse 来获得一些输出,例如设计 RTF 的原因之一是当内存不足时,数百或数千页的文本文件只能通过 lex/parse 标题读取,然后向前扫描到分隔页面的某些标签。一旦到达页面标签,就可以对该页面进行完整的 lex/parse。 【参考方案1】:

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

此外,更快并不总是更好。如果您的解析器在技术上更快,但使用了太多内存,它可能会崩溃或至少最终交换,这会再次减慢它。如果您的解析器速度极快但生成的代码效率低下,您的用户将为您更快的开发速度付费。您必须编写实际代码并在分析器中运行它,以便能够判断什么是真正更好的,并提出哪些标准对您很重要。

一开始就对所有内容进行标记/词法分析意味着您可以优化内存分配,从而减少调整标记列表大小等的时间,但这也意味着必须对整个文件进行词法分析,然后才能对其进行部分分析已解析。

OTOH 如果您根据需要进行解析,您可能需要更频繁地以小步骤附加到数组,因此您将支付内存损失,但在例如像 javascript 这样的解释型语言,您可能只需要解析实际用于此运行的部分。

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

【讨论】:

哦,你的问题可能和***.com/questions/24306893/…有点关系 我应该说我的目标硬件可能同时适用于嵌入式和大型系统。我的语言并不完全是一种“一刀切”的语言,但我肯定更喜欢它具有低级功能和速度,以至于你可以用这种语言编写操作系统内核。跨度> 请注意,您的开发环境和部署平台之间存在差异。如果您的编译器在大多数情况下只交叉编译到嵌入式系统,那很好,但例如如果您的部署平台是 Web 服务器,并且您的语言旨在将 CGI 实现为解释脚本,那么它必须在您的服务器硬件上运行。尽管如此,即使如此,也很少有人尝试在实际的嵌入式硬件上运行这样的服务器。我会为 2.0 版优化您的解释器,除非您现在有迫切需要。

以上是关于语言词法分析:一次或单独对字符串进行词法分析的性能更好?的主要内容,如果未能解决你的问题,请参考以下文章

编译原理 SysY语言的词法分析程序

编译原理 SysY语言的词法分析程序

编译原理 SysY语言的词法分析程序

201506110135陈若倩词法分析实验报告

[编译原理]词法分析器的分析与实现

词法分析