Functional programming “的实际应用和最新进展”;高效、安全的空间封闭转换”;阿佩尔和邵

Functional programming “的实际应用和最新进展”;高效、安全的空间封闭转换”;阿佩尔和邵,functional-programming,compiler-construction,closures,sml,smlnj,Functional Programming,Compiler Construction,Closures,Sml,Smlnj,将函数程序编译为机器语言时,编译器必须选择如何实现闭包。在下面的示例(方案语法)中,函数f返回过程(lambda(y)(+x y)),其机器表示(其闭包)必须包括一个代码指针和一个x值 (lambda (f x) (lambda (y) (+ x y)) 闭包转换是为这种机器表示选择布局的过程。两种典型的策略是链表或平面闭包。虽然平面闭包可能涉及额外的值复制,但简单的链表在空间上通常是不安全的(变量在最后一次使用后保持活动状态) Keep、Hearn和Dybvig在他们的论文中描述了一种优

将函数程序编译为机器语言时,编译器必须选择如何实现闭包。在下面的示例(方案语法)中,函数
f
返回过程
(lambda(y)(+x y))
,其机器表示(其闭包)必须包括一个代码指针和一个
x

(lambda (f x)
  (lambda (y) (+ x y))
闭包转换是为这种机器表示选择布局的过程。两种典型的策略是链表或平面闭包。虽然平面闭包可能涉及额外的值复制,但简单的链表在空间上通常是不安全的(变量在最后一次使用后保持活动状态)

Keep、Hearn和Dybvig在他们的论文中描述了一种优化平面闭合策略的算法。当编译策略是基于堆栈的时,该算法给出了良好的结果。对于在堆上分配激活记录的基于CPS的编译器(参见Appel),Keep等人的算法似乎无法给出最佳结果

另一方面,Appel和Shao在他们的论文中提出了一个非常复杂的闭包转换算法,其中闭包被实现为平面闭包和纯链表之间的某种东西,这对于空间是安全的,并且适合于使用CPS并显式传递连续性的编译器。文中的算例表明,该算法具有很好的效果

鉴于Appel和Shao的论文已经有20年的历史了,我想知道在CPS中对函数语言执行闭包转换是否仍然是最先进的

他们在论文中提到,该算法已在SML/NJ(1.03z)版本中成功实现;不过,我还没有成功地在当前版本的SML/NJ中找到该算法的实现

该算法是否在实际编译器中使用?或者,当在堆上分配激活记录时,是否存在已知的用于闭包转换的优化或其他算法,这些优化或算法在空间上既安全又高效(这反过来又允许对
调用/cc
进行O(1)实现)?这些算法是否曾经被实现过,或者它们的理由是否与它们的效率背道而驰


为了允许对各种策略进行实验,如果答案包括(对)(开源)算法实现的引用,或者至少包括对现有编译器的引用,那就更好了。这也可能暗示这些算法在实践中是如何证明的。

该论文的最后一部分说,该算法是在SML/NJ和FLINT中实现的,参考了网站。您可以浏览该网站,或者直接转到“这是我在发布此问题之前尝试过的”。:-)不幸的是,我没有成功地找到那段代码。然后我建议给论文作者发一封电子邮件。独立的实现也很有意义。或者SML/NJ是唯一使用这种闭包转换形式的编译器吗?我不知道,但我敢打赌邵博士对谁可能在使用他的算法有更好的把握。