【发布时间】:2018-10-06 15:19:09
【问题描述】:
在两本书中提到了一种词法分析器优化技术:K.Cooper 等人的《Engineering a compiler》。和 C.Fischer 等人制作的编译器。这是第一本书(第 69 页)的例外:
虽然逐个字符的 I/O 会产生清晰的算法公式,但每个字符的过程调用开销相对于在表驱动或直接编码扫描仪中模拟 DFA 的成本是显着的。为了降低每个字符的 I/O 成本,编译器编写器可以使用缓冲 I/O,其中每个读取操作返回更长的字符串或缓冲区,然后扫描程序通过缓冲区索引。扫描器维护一个指向缓冲区的指针...
我的问题是,这种技术的意义是什么?既然操作系统通常已经实现了内存缓冲,那么为什么作者建议我们实现一个缓冲区呢? (此外,高级语言提供的标准库通常有一个由文件流处理例程维护的缓冲区,例如 C++ 的 std::ifstream)。
我知道在某些应用程序中,例如数据库系统,自定义缓冲区机制不仅是可取的(更了解访问模式),而且有时是必要的(恢复、日志记录)。类似的推理是否适用于编译器中的词法分析器?如果有,怎么做?
编辑: 这是一个类似的问题:link,但我想了解更多关于自定义缓冲区的参数(如支持数据库系统中的缓冲区的参数),如果有的话。
另一篇帖子here 比较了手动缓冲与 C++ 中的 std::fstream 缓冲。
【问题讨论】:
-
所有应用程序都使用缓冲区。它不仅限于编译器编写者。自 1955 年左右以来,操作系统一直在缓冲。没有任何改变。每个字符的系统调用开销太高而无法支付。
-
@EJP 是的。但是,既然操作系统和语言库已经有了自定义缓冲区,那么它真的可以加快词法分析器的速度吗?
-
操作系统和语言库总是拥有它。您的问题基于错误的假设。
-
@EJP 对不起,我不明白.. 我的假设是什么?
-
您的假设是,关于缓冲的某些内容最近发生了变化,导致您书中的引用无效。您一直在说诸如“现在内存缓冲通常已经由操作系统实现”和“现在操作系统和语言库拥有它”之类的话。没有“现在”。他们一直都有。什么也没有变。从任何地方一次获取 > 1 个字符总是更快。你也在问为什么作者说现在他们做了一些事情,据说事情已经改变了,这毫无意义。