出现了全新的“函数式编程”范式,与过程式编程相比,它需要彻底改变思维模式。它使用高阶函数、纯度、单子等,我们通常在命令式和面向对象语言中不会看到这些。

我的问题是如何 执行 这些语言与命令式或面向对象语言的不同之处在于,例如内存管理或指针等内部结构。

有些函数式语言运行在 JVM 之上。这是否意味着这些语言在内部与 JVM 上的其他语言一样工作?

有帮助吗?

解决方案

函数式编程语言的实现使用了广泛的实现技术。本书对Scheme(一种 Lisp 方言)的实现做了精彩的介绍: Lisp 的小片段 作者:克里斯蒂安·奎因克。

其他提示

由函数式语言生成的代码使用了您在非函数式语言中不同程度地看到的许多功能。垃圾收集已得到普遍使用。尾调用优化是 用 GCC 和 VC++ 完成.

然而,闭包是函数式编程的一个标志。你看不到一个而没有另一个。如果您将“函数式语言”定义为仅指纯函数式语言,那么两者并不是同义词,因为您会发现支持函数式编程的命令式语言中的闭包(例如Javascript 和Scheme(这在技术上是必要的,尽管函数范式是最常用的))。闭包可以通过 意大利面条堆 对于调用堆栈,或者通过在退出堆栈帧时复制出局部变量,或者通过在堆上分配局部变量并让垃圾收集来处理它们。

一旦有了闭包,匿名函数就相对容易了(使用解释器,它们真的很容易)。使用编译器,函数在编译时被转换为字节码,并且字节码(更确切地说,入口点的地址)在运行时与当前环境相关联。

函数组合可以依赖匿名函数。当编译器遇到函数组合运算符时 f . g, ,它创建一个调用两个参数的匿名函数 fg, ,将一个的结果作为参数传递给另一个。

Monad 可以用 OO 语言实现,只是不像纯函数式语言那样必要。I/O monad 并没有什么特别之处,它们只是依赖于底层平台允许副作用的事实。

我想有很多方面,从特别关注受益于功能性语言,一个想到的是:

功能语言使用递归了很多。因此,任何实施应尽量优化这种情况。例如。识别尾递归和转变成一个环的内部(因此节省函数调用开销等栈保存/恢复)。 ( http://en.wikipedia.org/wiki/Tail_recursion

的功能的编程语言的诸如Haskell的实施通常比那些命令式语言的非常不同。你可以读到一个这样做的此处。尽管纸是几年前我相信思想仍在使用。

这想到的最大区别在于,功能性的语言倾向于被设计成使源代码是脱糖数学上简单而强大的中间语言。这种语言通常包含拉姆达,函数调用的if / else,机种,像let,而不是一大堆更多。经变换的代码被深深嵌套的,冗长的,并且不能现实人类可读。表面语法扔掉。

一个像这样的语言的编译器必须做一些内联和几个封闭的优化,以产生体面代码。 (对我来说,这些基线封闭优化显得平凡 - escape分析等等 - 但它可能仅仅是不熟悉的)

一切都在同一处理器上运行(因此同一汇编指令),所以只要你足够深入,一切都同内部。

@outis:虽然语言可能支持他们,封闭在相同的方式,副作用做一个函数的数学概念是相冲突:它们允许你从相同参数不同的结果。这使得封闭件程序,而不是功能性的。

这就是说,存在有利于对全局封闭件(特别是在编译器实现的上下文中)的效率的参数。 [但我知道功能的语言不直接提供封闭件,即使“工作相似者”可以被实现。]

(然而,钻营类似于关闭和不脱离本遭受冲突,并且确实是在功能的语言例行本。)

不管怎么说,在我看来,函数式编程语言是语言,使巨大的努力,使计算成为可表示,如果他们的数学函数。这意味着优化在优化函数倾斜。

可以想像,至少,功能性的语言允许机器上更深的抽象工作比将是一个纯粹的程序的方法是有用的。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top