据我了解yield,如果从迭代器块内部使用该关键字,它将控制流返回到调用代码,并且当再次调用该迭代器时,它将从中断的地方开始。
同样,await不仅要等待被调用方,而且还会将控制权返回给调用方,仅在调用方awaits方法时从中断处接管。
换句话说,没有线程,异步和等待的“并发性”是由聪明的控制流引起的错觉,其细节被语法隐藏了。
现在,我是一名前汇编程序员,并且对指令指针,堆栈等非常熟悉,并且了解了正常的控制流程(子例程,递归,循环,分支)的工作方式。但是这些新结构-我不明白。
当await到达,如何运行时知道什么是一段代码下一步应该执行?它如何知道何时可以从上次中断的地方恢复,以及如何记住在哪里?当前调用堆栈发生了什么,是否以某种方式保存了它?如果调用方法在此之前进行其他方法调用await怎么办-为什么堆栈不被覆盖?在异常和堆栈展开的情况下,运行时到底将如何处理所有这些问题?
何时yield到达,运行时如何跟踪应该拾取的点?迭代器状态如何保存?
梵蒂冈之花