【问题标题】:Is there a standardized way to transform functional code to imperative code?有没有标准化的方法将功能代码转换为命令代码?
【发布时间】:2012-01-09 13:57:00
【问题描述】:
我正在编写一个用于从 javascript 代码生成 php 检查的小工具,我想知道是否有人知道将功能代码转换为命令式代码的标准方法?
我发现这篇论文:Defunctionalization at Work 它很好地解释了去功能化。
Lambdalifting 和去功能化在一定程度上回答了这个问题,但是数据结构呢,我们仍然在解析列表,就好像它们都是链表一样。有没有办法将函数式语言的链表转换为其他高级数据结构,如 c++ 向量或 java 数组列表?
【问题讨论】:
标签:
programming-languages
functional-programming
imperative-programming
【解决方案1】:
以下是@Artyom 列表中的一些新增内容:
- 您可以将尾递归转换为循环和赋值
- 线性类型可用于引入赋值,例如
y = f x 可以替换为 x := f x 如果 x 是线性的并且与 y 具有相同的类型
- 至少有两种去功能化是可能的:当你用一个充满一阶应用的开关替换高阶应用时的雷诺型去功能化,以及内联(但是,递归函数并不总是可以内联)李>
【解决方案2】:
也许您有兴趣删除一些语言元素(例如高阶函数),对吧?
为了从程序中消除 HOF,有一些技术,例如去功能化。要移除闭包,您可以使用 lambda-lifting(又名闭包转换)。这是你感兴趣的东西吗?
我认为您需要提供您拥有的代码的具体示例以及您打算生成的目标代码,以便其他人提出解决方案。
添加:
是否有办法将函数式语言的链表转换为其他高级数据结构,如 c++ 向量或 java 数组列表?
是的。链表在 C++ 中用指针表示(结构“节点”有两个字段:一个用于“有效负载”,另一个用于“下一个”指针;空列表则表示为 NULL 指针,但有时人们更喜欢使用特殊的“哨兵价值观”)。请注意,如果源语言中的代码不依赖于单链表的表示(在源语言实现中),您还可以使用目标语言中的向量来实现“cons”/“nil”操作(不是确定这是否适合您的需求)。这里的想法是为熟悉的操作提供替代实现。
【解决方案3】:
不,没有。
原因是没有像functional code 或imperative code 这样具体且定义明确的东西。
这种转换只存在于抽象的具体实例中:例如,有从 Haskell 代码到 LLVM 字节码、F# 代码到 CLI 字节码或 Frege 代码到 Java 代码的转换。
(我怀疑是否有一个从 Javascript 到 PHP。)
【解决方案4】:
取决于你需要什么。通常的答案是“没有这样的工具”,因为结果将无法使用。但是从这个角度来看:
计算机中的汇编指令集定义了命令式机器。因此编译器需要做这样的翻译。但是我假设您不想拥有汇编代码,而是更易读的东西。
如果人们对结果感兴趣,通常这些繁重的程序转换是手动完成的,或者如果结果不会被人看到,则自动完成。