功能语言与语言实现的观点有何不同

din*_*sim 13 lisp haskell functional-programming ml

有一个全新的"函数式编程"范式,与程序式编程相比,需要彻底改变思维模式.它使用更高阶函数,纯度,monad等,我们通常在命令式和面向对象语言中看不到它们.

我的问题是这些语言的实现与命令式或面向对象语言的区别在于,例如,内存管理或内部指针等.

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

out*_*tis 8

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

但是,闭包是函数式编程的标志.你没有看到一个没有另一个.如果你定义"函数式语言"只能引用纯函数式语言,那么两者不是同义的,因为你会发现支持函数式编程的命令式语言中的闭包(例如Javascript和Scheme(这在技术上是必要的,尽管功能范式主要是什么)用过的)).可以使用spaghetti堆栈为调用堆栈实现闭包,或者在退出堆栈帧时复制局部变量,或者通过在堆上分配局部变量并让垃圾收集来处理它们.

一旦你有闭包,匿名函数相对容易(使用解释器,它们真的很容易).使用编译器,函数在编译时转换为字节码,字节码(而不是入口点的地址)在运行时与当前环境相关联.

功能组合可以依赖匿名功能.当一个编译器遇到一个函数组合算子f . g,它创建调用两个参数匿名函数fg,传递一个的结果作为参数向所述其他.

Monads可以用OO语言实现,它们不像纯函数式语言那样必要.I/O monad并不是特别的,他们只是依赖于底层平台允许副作用的事实.


Rai*_*wig 5

功能编程语言的实现使用了广泛的实现技术.对于Scheme(Lisp方言)的实现的一个很好的介绍给出了这本书:由Christian Queinnec撰写的Lisp in Small Pieces.