根据这个答案
所有这些编程语言都是无栈(stackless)的
- Stackless Python
- PyPy
- Lisp
- Scheme
- Tcl
- Lua
- Parrot VM
那么什么叫做无栈呢?它们不使用调用栈吗?如果不使用调用栈,它们会使用什么?
根据这个答案
所有这些编程语言都是无栈(stackless)的
那么什么叫做无栈呢?它们不使用调用栈吗?如果不使用调用栈,它们会使用什么?
CALL_FUNCTION
操作码,表示你即将进入一个函数。这会导致分发器构建具有相关信息的新框架,并带有展开标志返回到分发器。从那里开始,分发器重新开始,将解释器指向最上面的帧。while
、do
、if
、switch
等)。他们不使用调用栈,因为它们采用延续传递样式。如果您不熟悉尾递归优化,了解这意味着什么可能是一个很好的第一步。
为了在该模型上模拟传统的调用/返回,调用者不会推送返回地址,并期望剩余的框架保持不变,而是将其余的代码和任何仍然需要的变量(其余的被释放)封闭起来。然后,它执行对被调用方的尾调用,将此续体作为参数传递。当被调用者“返回”时,它通过调用此续体并将返回值作为参数传递给它来实现。
就上述而言,这只是一种复杂的函数调用方式。但是,它可以很好地推广到更复杂的情况: