2

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

我发现这篇论文:工作中的去功能化它很好地解释了去功能化。

Lambdalifting 和去功能化在一定程度上回答了这个问题,但是数据结构呢,我们仍然在解析列表,就好像它们都是链表一样。是否有办法将函数式语言的链表转换为其他高级数据结构,如 c++ 向量或 java 数组列表?

4

4 回答 4

3

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

  • 您可以将尾递归转换为循环和赋值
  • 线性类型可用于引入赋值,例如y = f xx := f x如果 x 是线性的并且与y
  • 至少有两种去功能化是可能的:雷诺型去功能化,当你用一个充满一阶应用程序的开关替换高阶应用程序时,以及内联(但是,递归函数并不总是可以内联)
于 2011-11-30T11:51:42.723 回答
2

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

为了从程序中消除 HOF,有一些技术,例如去功能化。要删除闭包,您可以使用 lambda-lifting(又名闭包转换)。这是你感兴趣的事情吗?

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

添加:

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

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

于 2011-11-30T10:56:42.793 回答
1

不,那里没有。

原因是没有像functional codeor这样具体且定义明确的东西imperative code

这种转换只存在于抽象的具体实例中:例如,有从 Haskell 代码到 LLVM 字节码、F# 代码到 CLI 字节码或 Frege 代码到 Java 代码的转换。

(我怀疑是否有从 Javascript 到 PHP 的版本。)

于 2011-11-30T10:11:43.147 回答
1

取决于你需要什么。通常的答案是“没有这样的工具”,因为结果将无法使用。但是从这个角度来看:

计算机中的汇编程序指令集定义了命令式机器。因此编译器需要做这样的翻译。但是我假设您不想拥有汇编代码,而是更易读的东西。

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

于 2011-11-30T10:37:26.577 回答