是否有标准化的方法将功能代码转换为命令式代码?

时间:2011-11-30 10:02:45

标签: programming-languages functional-programming imperative-programming

我正在编写一个用于从javascript代码生成php检查的小工具,我想知道是否有人知道将功能代码转换为命令式代码的标准方法?

我发现了这篇论文:Defunctionalization at Work它很好地解释了非功能化。

Lambdalifting和defunctionalization在某种程度上回答了这个问题,但是对于数据结构而言,我们仍然在解析列表,好像它们都是链接列表一样。是否有办法将函数式语言的链表转换为其他高级数据结构,如c ++向量或java arraylists?

4 个答案:

答案 0 :(得分:3)

以下是@Artyom列表的一些补充:

  • 您可以将尾递归转换为循环和赋值
  • 线性类型可用于引入分配,例如如果x为线性且类型与y = f x相同,则x := f x可替换为y
  • 至少有两种去功能化是可能的:当你用一个完整的一阶应用程序的开关替换高阶应用程序时的雷诺型去功能化和内联(但是,递归函数并不总是可以内联)

答案 1 :(得分:2)

也许您有兴趣删除一些语言元素(例如高阶函数),对吗?

为了从程序中消除HOF,有一些技术,如defunctionalization。要删除闭包,可以使用lambda-lifting(也称为闭包转换)。这是你感兴趣的东西吗?

我认为您需要提供您拥有的代码的具体示例,以及您打算生成的目标代码,以便其他人可以提出解决方案。

添加了:

  

是否有办法将函数式语言的链表转换为其他高级数据结构,如c ++向量或java arraylists?

是。链接列表用C ++中的指针表示(具有两个字段的结构“节点”:一个用于“有效负载”,另一个用于“下一个”指针;空列表则表示为NULL指针,但有时人们更喜欢使用特殊的“哨兵价值”)。请注意,如果源语言中的代码不依赖于单链表的表示(在源语言实现中),您还可以使用目标语言中的向量实现“cons”/“nil”操作(不是确定这是否符合您的需求)。这里的想法是为熟悉的操作提供替代实现。

答案 2 :(得分:1)

不,没有。

原因是没有像functional codeimperative code这样具体且定义明确的内容。

此类转换仅适用于抽象的具体实例:例如,存在从Haskell代码到LLVM字节码,F#代码到CLI字节码或从Frege代码到Java代码的转换。

(我怀疑是否有一个从Javascript到PHP。)

答案 3 :(得分:1)

取决于您的需求。通常的答案是“没有这样的工具”,因为结果将无法使用。不过从这个角度看这个:

计算机中的汇编程序指令集定义了命令式计算机。因此编译器需要进行这样的翻译。但是我假设你不想拥有汇编程序代码但更具可读性。

通常这些繁重的程序转换是手动完成的,如果一个人对结果感兴趣,或者如果人类永远不会看到结果则会自动完成。