- 论坛徽章:
- 3
|
本帖最后由 captivated 于 2011-09-06 22:33 编辑
回复 64# 幻の上帝
抛开Lisp, Scheme, Erlang之流先不谈,C/C++的函数调用,实现方式就是栈,对吧。
我还说栈的本质是LIFO,在单栈的情况下,这是“最后压入的栈帧最先弹出”的唯一实现方式,错不了吧?告诉我除了栈之外,你还知道什么结构能具有LIFO的性质。更直白地说吧,栈就是LIFO的同义词,或者干脆地说它们是同一个词也可以。
好嘛,非要扯coroutine, 那就看coroutine嘛。
“Coroutines are computer program components that generalize subroutines to allow multiple entry points for suspending and resuming execution at certain locations. ”
“ "Subroutines are special cases of ... coroutines." —Donald Knuth.”
上面出自Wikipedia. 大意是说,Subroutines是Coroutines特例,而Coroutines是Subroutines的范化。Coroutines可以具有多个入口点,也可以在喜欢的地方暂停/恢复执行。
简单的说,真正要实现的东西,是一个执行流。这个执行流可以从caller贯穿到callee,而它们必须要完成的事情是从被调用者处return或者yield(好吧,coroutine嘛,必须要用个不一样的名字才能显示不同之处,对吧?)后,执行流能从调用处继续。要完成这样的事情,只要在调用者处保存“执行指针”,在被调用者处返回时转向调用者的“执行指针”就可以了,所以使用栈当然不是必须的。
好,那我们就来看实现。Coroutine说白了是什么?如果不借助栈的能力(一丁点都不许),那么每一个coroutine都是一个“单体”,这个coroutine,如果调用另外一个coroutine,那么被调用的那个coroutine和调用方一定不在同一个栈上。当然你可以把它们放在一起,并把调用方和被调用方一起放置的地方叫栈,然后告诉我两个coroutine在同一个栈上。
说白了,可以认为每一个coroutine都是一个栈,不过这个栈只放一个coroutine. 当然也可以认为既然一个栈只放一个coroutine,那么它当然也就不叫栈了。
结论:
1. 执行流的实现怎样都可以,跟是否使用栈无关。
2. 栈是广泛的实现执行流以及caller/callee调用链的方式之一,它又简单又实用,方便廉价。
3. coroutine其实也没啥,链表之类的结构就足够实现。优点有多大?其实也没啥优点,就是每个routine都可以“同时被调用”,这个和栈不同,对于栈来说,如果某个函数被调用,那么它一定处于一个栈上的某个栈深的位置。这个应该就是coroutine所谓的多个执行绪下会有神马优势的依据。更直白地说,一个栈就是一个执行流,因为coroutine的理念是一个routine就是一个栈,因此直接当一个routine就是一个线程。
4. coroutine的缺点?没深入研究,我不乱说。反正非coroutine不可的我没见过,现在不都是多线程用得好好的么。
5. 说当前计算机系统中,栈是最重要的概念之一,仍然没有错。 -- 相反,很对,大大滴对,因为C/C++以及许许多多的语言执行流实现就是栈,根据这个,多线程的实现也就是一个栈一个线程。另外,就算不用来实现执行流,栈也有别的用处。而解释C/C++的函数调用,栈当然是最好的方式了,非要去扯神马coroutine! |
|