有人在模块化编译器中使用过Pottier和Gauthier的多态去功能化功能吗?


15

去功能化是一种程序转换,可将高阶程序转换为一阶程序。这个想法是,给定一个程序,只有有限的许多lambda抽象,因此您可以用id替换每个lambda,并使用对在该id上分支的apply过程的调用来替换每个函数应用程序。有时 在函数语言的编译器中使用此方法,但是它的适用性受到以下事实的限制:去功能化是整个程序的转换(您必须静态地了解程序中的所有功能),因此,只有整个程序的编译器才能使用它。

但是,Pottier和Gauthier使用了涉及GADT的更为复杂的类型化方法,从而为它提供了一种多态性类型的去功能化算法。现在,有了它们的编码,就可以向其lambda数据类型添加一个包罗万象的大小写,它不是标签,而是包含一个高阶函数。这意味着应该有可能使用它们的编码来逐模块地解除功能。

有没有人做过这个,并指出我使用这种想法的编译器?(玩具编译器还可以,实际上是首选。)

Answers:


6

一种方法描述为

Georgios Fourtounis和Nikolaos S. Papaspyrou。2013。在取消功能的编译器中支持单独编译。 2013年板岩

正如@gasche所提到的:

解决该问题的另一种方法是考虑每个模块可以定义自己的“去功能化的函数”类型和调度程序/处理程序。

ñ一世0<一世<ññ-一世


4

现在,有了它们的编码,就可以向其lambda数据类型添加一个包罗万象的大小写,它不是标签,而是包含一个高阶函数。这意味着应该有可能使用它们的编码来逐模块地解除功能。

您能详细说明一下您的意思吗?我不明白添加基本情况(是数据类型,分配功能的模式匹配还是两者都可以?)如何以您描述的方式帮助模块化?顺便说一句,为什么您要确切地指“逐个模块”的基础?

我可以想象在给定的模块/程序内部使用“基本情况”进行选择性去功能化:您将为化函数功能类型添加一个额外的构造函数,该构造函数不是标签,而是简单地嵌入所有'a -> 'b函数,从而打包一个函数在此构造函数中,与其给它一个reified标签,不如防止其失功能。

解决该问题的另一种方法是考虑每个模块可以定义自己的“去功能化的函数”类型和调度程序/处理程序。模块中的函数M1将具有类型,M1.arrow并使用M1.apply等等来应用。虽然对于函数的一阶使用而言效果很好,但我不太清楚如何将其扩展为高阶函数(不必知道其功能参数的来源):如果您将函数与其调度程序捆绑在一起,则您将重新进入间接函数调用的领域。

最后,您在论文中引用了对整个程序与模块化方法的快速提及,但我看不到它与您的建议有何关系。它们所描述的内容以功能和数据类型(可以在多个独立模块中定义的功能和类型)的“开放扩展”表示。这主要是一种ML方法,用于描述您可以在链接时推迟对独立模块的分析/转换的组合的事实,从而放松了整个程序转换的必要性。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.