3

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

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

我的意思是语法分析派生过程。

4

4 回答 4

8

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

在比较词法分析和句法分析时,确实可能词法分析的成本更高。这是因为两者都使用状态机,即每个元素有固定数量的动作,但是词法分析(字符)中的元素数量比句法分析(令牌)中的要大得多。

于 2009-07-09T00:56:27.957 回答
1

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

foreach (x in o)

逐个字符读取 - “f”、“o”等。

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

到句法分析发生时,程序代码“只是”一系列标记。也就是说,我同意上面的答案,即词法分析不一定是最耗时的过程,只是它有最大的工作流。

于 2009-07-09T00:59:37.817 回答
0

这实际上取决于您在词法分析和解析之间划清界限的位置。我倾向于对令牌是什么的看法非常有限,因此我的解析器在解析上花费的时间比在词法分析上花费的时间要多得多,这不是因为它们更快,而是因为它们做得更少。

于 2009-07-29T05:39:28.873 回答
0

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

于 2009-09-21T20:32:18.070 回答