根据我对 yield
关键字的理解,如果从迭代器块内部使用,它将控制流返回给调用代码,当再次调用迭代器时,它将从中断的地方继续。
此外,await
不仅等待被调用方,而且还将控制权返回给调用方,只是在调用方 awaits
调用方法时从中断的地方继续执行。
换句话说—— 没有线,异步和等待的“并发”是由巧妙的控制流引起的错觉,其细节被语法隐藏了。
现在,我是一个前汇编程序员,我非常熟悉指令指针,堆栈等,我知道正常的控制流(子例程,递归,循环,分支)是如何工作的。但这些新概念,我不明白。
当到达 await
时,运行时如何知道下一步应该执行哪段代码?它如何知道什么时候可以从它停止的地方恢复,又如何记住恢复的地方?当前调用堆栈发生了什么变化,是否以某种方式保存了它?如果调用方法在 await
之前进行其他方法调用怎么办——为什么堆栈没有被覆盖?在出现异常和解除堆栈的情况下,运行时究竟如何处理所有这些问题?
当到达 yield
时,运行时如何跟踪应该拾取东西的点?迭代器状态如何保存?