协同程序原理
这里不会完整的解释协同程序的运作原理,但是一个大概的介绍还是很有必要的。
协同程序是一个彻底的实现了汇编技术(不需要VM或OS的支持),挂起通过代码转换实现。总的来说,每个挂起函数被转换为状态机,这里的状态等价于挂起调用。在挂起之前,下一个状态被存储在相关的局部变量的一个属性中或者编译器生成的类中。在协同程序被唤醒时,局部变量会被存储,并且状态机会处理挂起程序之后的内容。
一个挂起的协同程序可以被存储,作为对象进行传递,这样来保持它的挂起状态和局部性。这种对象的类型叫做Continuation,这里描述的全部的代码转换等价于经典的Continuation-passing-style。因此,挂起程序使用了一个额外的Continuation类型参数。
更多的关于协同程序如何工作的细节请参考this design document。在其他语言(C#或ECMAScript 2016)中的async/await相关描述都是类似的,尽管他们的实现可能和Kotlin中的描述有些不同。