延续传球风格与积极修剪的调用堆栈?

时间:2009-02-06 16:42:39

标签: interpreter continuations trampolines

我正在考虑像CPS这样的东西,用于基于演员的语言的翻译。

函数参数在变量数组中传递,并且continuation在同一个数组中返回,因此是一个简单的函数

def add (x,y) => x + y

所以来自read / eval / loop的调用将是

print( add(7, 5) )

将在进入

[&add, x, y, &print, _, &repl, ...]

其中_是一个空槽,其中写入了函数返回值。

在下一步执行时,参数变为

[&print, 12, &repl, ...]

然后

[repl, ...]

等等。 C中的实现基本上是

for (;;)
   args = (args[0].function_pointer)(args);

检查是否在args数组的末尾运行并分配更多空间。

参数是连续的,作为对象的'continuation'只是参数的一个子集。

如果我要实现一流的延续,他们需要克隆参数数组;你也没有免费关闭。主要目标是简单生成机器代码,并允许您暂停和恢复执行。

虽然这个方案的灵感来自于对CPS的思考,但它并不是CPS,并且与积极修剪的C堆栈看起来非常相似 - 只是实时变量,以及每个函数的返回点。

这个样式有名称,特别是参数数组吗?它是一种蹦床+堆栈,虽然我习惯称之为'堆栈'更多的是历史而不是执行的未来。

1 个答案:

答案 0 :(得分:2)

这几乎是Forth。拥有一流的堆栈非常类似于延续。