语言词法分析:一次性或单独对字符串进行词法分析的性能更好?
Language lexing: better performance to lex a string all at once or individually?
我正在尝试构建我的第一个类 C 编程语言,可能是一个解释器,我刚刚迈出了第一步,也就是词法分析器。
我考虑过采用懒惰的方法,将整个源代码流简单地放在一起,然后让解析器处理数据。
我注意到当解析器模块要求另一个标记时,许多其他编译器和解释器在解析期间只使用 lex。
就代码性能而言,程序是一次性对所有源代码进行 lex 分析然后解析生成的标记,还是 lex 并分别分析标记?
"faster" 这个词有点模糊。有不同类型的速度(延迟、绝对开始到结束持续时间、编译速度、执行速度),并且取决于您如何实现语言的前端和后端,任何一种方法都可以更快。
此外,速度并不总是更好。如果你的解析器在技术上更快,但使用了太多内存,它可能会崩溃或者至少最终会交换,这会再次减慢它的速度。如果您的解析器快如闪电但生成的代码效率低下,您的用户将为您更快的开发速度买单。您必须编写实际代码并将其 运行 放入分析器中,才能分辨出真正更好的代码,并提出哪些标准对您很重要。
Tokenizing/Lexing 一切都在一开始意味着你可以优化内存分配,从而花更少的时间调整你的令牌列表等,但这也意味着整个文件必须在它之前被词法分析甚至可以部分解析。
OTOH 如果您根据需要进行解析,您可能不得不更频繁地以小步向数组追加,因此您将付出内存损失,但在例如像 JavaScript 这样的解释型语言,您可能只需要解析实际用于此 运行-through.
的部分
所以这在很大程度上取决于您的语言细节,以及您希望运行使用的硬件。在内存很少且没有交换空间的嵌入式系统中,您可能别无选择,只能逐步进行 lex,因为整个程序源代码可能无法容纳在内存中。如果你的语言的语法需要大量的前瞻性,你可能看不到渐进式词法分析的任何好处,因为无论如何你都在阅读它......
我正在尝试构建我的第一个类 C 编程语言,可能是一个解释器,我刚刚迈出了第一步,也就是词法分析器。
我考虑过采用懒惰的方法,将整个源代码流简单地放在一起,然后让解析器处理数据。
我注意到当解析器模块要求另一个标记时,许多其他编译器和解释器在解析期间只使用 lex。
就代码性能而言,程序是一次性对所有源代码进行 lex 分析然后解析生成的标记,还是 lex 并分别分析标记?
"faster" 这个词有点模糊。有不同类型的速度(延迟、绝对开始到结束持续时间、编译速度、执行速度),并且取决于您如何实现语言的前端和后端,任何一种方法都可以更快。
此外,速度并不总是更好。如果你的解析器在技术上更快,但使用了太多内存,它可能会崩溃或者至少最终会交换,这会再次减慢它的速度。如果您的解析器快如闪电但生成的代码效率低下,您的用户将为您更快的开发速度买单。您必须编写实际代码并将其 运行 放入分析器中,才能分辨出真正更好的代码,并提出哪些标准对您很重要。
Tokenizing/Lexing 一切都在一开始意味着你可以优化内存分配,从而花更少的时间调整你的令牌列表等,但这也意味着整个文件必须在它之前被词法分析甚至可以部分解析。
OTOH 如果您根据需要进行解析,您可能不得不更频繁地以小步向数组追加,因此您将付出内存损失,但在例如像 JavaScript 这样的解释型语言,您可能只需要解析实际用于此 运行-through.
的部分所以这在很大程度上取决于您的语言细节,以及您希望运行使用的硬件。在内存很少且没有交换空间的嵌入式系统中,您可能别无选择,只能逐步进行 lex,因为整个程序源代码可能无法容纳在内存中。如果你的语言的语法需要大量的前瞻性,你可能看不到渐进式词法分析的任何好处,因为无论如何你都在阅读它......