haskell - 运行时是否通常使用类似命令式的函数式语言代码解释

标签 haskell functional-programming ocaml interpreter imperative-programming

我有一个关于函数式语言解释器的一般性问题:

在运行时使用函数式语言与命令式语言(或进入解释器)实际上有什么优势吗?

我看到的所有问题(例如 this )都没有真正解决这个问题,搜索中充斥着关于不同语言定义的争论。

编辑:精简到我最终需要回答的唯一问题。

最佳答案

简短的回答是:一切最终都被编译成某种低级语言(汇编或虚拟机语言)。函数式语言和命令式语言处于同等地位:它们必须编译掉它们的抽象机制以适应机器上可用的东西。
语言的不同之处在于它们与底层低级代码的匹配程度(通过提供低级功能以在需要时手动优化代码)以及它们通过提供强大推理保证的清晰语义来启用或简化哪些优化。

例如,当编译为 native 代码时,递归不是(通常)编译成循环,而是编译成到标签的跳转,就像循环一样:大多数汇编语言既没有循环也没有递归。当然,如果编译成有循环但没有跳转的虚拟机,就需要产生循环;这是一个问题,例如在 Java 虚拟机上,因为一般的尾调用比单独的循环更具表现力,您需要解决这个限制,放弃一些效率。

函数式程序的“优点”可能是因为语义表现更好,您可以更轻松地对程序进行推理,例如以更简单的方式表达优化。现在很多编译器都使用 Single Static Assignment (SSA)中间形式,它基本上是一种低级函数语言¹——尽管它是由编译器社区的人独立发现的。例如,当您消除变量突变并且变量在其所有范围内保持相同的值时,大多数优化会更容易进行。 more efficient ways 中有一些技术可以进行寄存器分配在这样的功能中间形式上。

¹:见 Andrew Appel 1998 年的短文:SSA is Functional Programming ;如果您对 SSA 表格的详细信息感兴趣,这里是 some reading notes关于SSA与其他功能中间形式的关系,如CPS .

您还可以从纯度(没有副作用,或者至少可以很好地控制哪些计算将没有副作用)和静态类型中获得优化优势。从纯度中,您可以获得强大的优化,例如 deforestationfusion (消除中间数据结构),并且通过键入,您可以获得对值的形状的有力保证(这就是为什么一些动态语言尝试允许某种受限形式的类型注释以用于优化目的),从而可以生成更好的代码。

关于访问低级功能:Fortran、C 和 C++ 可能是最好的、最广泛使用的“可以使用非常低级”的语言。一些语言试图提供其中一些功能:例如 ATS (最初是一种函数式编程语言,虽然它是如此的裸机以至于很难看到)提供了对堆栈分配版本堆分配的良好控制,Haskellthe CLR (C#,etc.)提供未装箱的复合类型作为这种低级推理的特例,同样Rust试图为您提供有关内存消耗的低级决策的方法。
但是,当您隔离一小部分对您的性能至关重要的代码并且您想优化它(放弃一些灵 active /简单性/可维护性)时,这当然很有用,但这不会改变您的生活在日常情况下,除非您是嵌入式/内核程序员。您可能会从允许您使用正确的抽象级别并花更多时间为您的问题选择正确的设计和算法的高效语言中获得更多的整体性能提升。当然,一个人可能想要两者兼得,这是可能的,但很困难。

关于haskell - 运行时是否通常使用类似命令式的函数式语言代码解释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11112399/

相关文章:

Haskell Foldl 无法构造无限类型

haskell - 如何在let绑定(bind)中添加类型注释

function - Clojure中的除数函数

OCamlbuild和camlp4选项

haskell - 函数组合中的类型推导

algorithm - 是否可以编写通用算法来使用 Zippers 更新嵌套(无论嵌套如何)数据结构中的元素?

javascript - Ramda 中函数的反向 bool 返回

module - 我在哪里可以找到 OCaml 选项模块?

c - OCaml - 编译使用 Ctypes 的 OCaml 和 C 代码

node.js - 在 Centos 6.9 上安装 Elm