【发布时间】:2014-03-02 07:51:29
【问题描述】:
我想知道通常称为 generator 的东西在扩展或用于跨越多个堆栈帧和协程时是否仍然存在功能差异,因为它们由某些语言提供本机。
一方面,我看到像 Python 这样的语言获得了一些特性(最后一个是 3.3 版中的 yield from),这些特性使得协同程序的大多数行为的实现变得简单,而无需提供实际的协同程序。另一方面,我看到像 Kilim 和 Javaflow 这样的项目,它们将实际的协程添加到 Java,但有一些限制,例如必须注释每个方法当协程产生已检查异常时,可能在堆栈上。
虽然这些项目都不允许 Java 程序为协程使用不同的堆栈,这正是 Lua 等语言用来实现协程的方式,但它们仍然提供了据我所知,可以从协程实现中可以预期。但这使得它们与在 Python 中使用 yield from 可以完成的事情非常相似(在实现中),我能看到的唯一区别是在 Python 中,可能产生的函数的每个调用站点都必须使用 from yield 调用而在 Java 中,可能产生的函数必须使用已检查异常进行注释,而不更改调用方法的语句。
那么协同程序之间的功能实际上是否仍然存在差异,例如它们提供的协同程序。 Lua,以及在 Python 中使用生成器和 yield from 可以做什么,或者我们应该说 Python(以及具有类似生成器实现的语言)现在提供协程?
【问题讨论】: