编译器在解析过程中花费大部分时间在哪里?

时间:2009-07-09 00:35:31

标签: language-agnostic parsing compiler-construction lexical-analysis

我在Sebesta book中读到,编译器大部分时间花在lexing源代码上。因此,与语法分析器不同,优化词法分析器是必要的。

如果这是真的,为什么词法分析阶段与语法分析相比需要花费这么多时间?

我的意思是通过语法分析推导过程。

4 个答案:

答案 0 :(得分:8)

首先,我认为事实并非如此:在许多编译器中,大部分时间都不花在lexing源代码上。例如,在C ++编译器(例如g ++)中,大部分时间花在语义分析上,特别是在重载决策中(试图找出要执行的隐式模板实例化)。此外,在C和C ++中,大多数时间通常用于优化(创建单个函数或整个翻译单元的图形表示,然后在这些图形上运行长算法)。

当比较词汇和句法分析时,词汇分析可能确实更昂贵。这是因为两者都使用状态机,即每个元素有一定数量的动作,但词法分析(字符)中的元素数量要比语法分析(代币)大得多。

答案 1 :(得分:1)

词法分析是将源代码中的所有字符转换为标记的过程。例如

foreach (x in o)

逐字符读取 - “f”,“o”等

词法分析器必须确定所看到的关键词(“foreach”,而不是“for”等等。)

当语法分析发生时,程序代码“只是”一系列令牌。也就是说,我同意上面的答案,词汇分析不一定是最耗时的过程,只是它有最大的流程可供使用。

答案 2 :(得分:0)

这实际上取决于你在lexing和parsing之间画线的地方。我倾向于对令牌的内容有非常有限的看法,因此我的解析器在解析上比在lexing上花费更多的时间,不是因为它们更快,而是因为它们只是做得更少。

答案 3 :(得分:0)

当然,lexing很贵。部分原因与有限的内存和多个文件操作有关,可以读取程序位。现在,内存以GB为单位测量,这不再是一个问题,出于同样的原因,可以完成更多的工作,因此优化更为重要。当然,优化是否有多大帮助是另一个问题。