gpt4 book ai didi

iterator - 如何实现识别迭代器的编译器?

转载 作者:行者123 更新时间:2023-12-05 00:43:20 25 4
gpt4 key购买 nike

我使用迭代器有一段时间了,我喜欢它们。

但是,尽管我仔细考虑过,但我无法弄清楚“识别迭代器的编译器”是如何实现的。我也研究过它,但找不到任何资源来解释编译器设计上下文中的情况。

详细地说,大多数关于迭代器的文章都暗示有某种“魔法”可以实现所需的行为。他们建议编译器维护一个状态机,以便跟踪执行的位置(看到最后一个“ yield 返回”的位置)。我对 Iterators 的这个属性特别感兴趣,它支持惰性求值。

顺便说一下,我知道什么是状态机,已经上过编译器设计类(class),研究过龙书。但显然,我无法将我所研究的内容与 csc 的“魔法”联系起来。

任何知识或不同的想法表示赞赏。

最佳答案

它比看起来更简单。编译器可以将迭代器函数分解为单独的块;块除以 yield声明。

状态机只需要跟踪我们当前所在的块,并在下一次调用迭代器时直接跳转到这个块。我们还需要跟踪所有局部变量(当然)。

然后,我们需要考虑一些特殊情况,特别是包含 yield 的循环。 s。幸运的是,IL(但不是 C# 本身)允许 goto跳入循环并恢复它们。

请注意,有一些非常复杂的边缘情况,例如C# 不允许 yieldfinally阻塞,因为将函数留在 yield 上非常困难(不可能?) ,然后恢复函数,执行清理,重新抛出任何异常并保留堆栈跟踪。

Eric Lippert 发布了一条 in-depth description的过程。 (也请阅读他链接到的文章!)

关于iterator - 如何实现识别迭代器的编译器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1118145/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com