是否有函数式编程语言的本机编译器

时间:2008-09-19 19:18:47

标签: functional-programming

Joel Spolsky praised本机代码版本的程序,它们不依赖于运行时。

哪些本机代码编译器可用于函数式语言?

4 个答案:

答案 0 :(得分:11)

这篇文章真的很不清楚。问题似乎是“是否存在可以生成本机可执行文件而无需安装其他软件的函数式语言编译器?”

答案通常是肯定的。例如,Haskell具有生成本机二进制文件的a compiler。许多其他函数式语言都有类似的编译器。

答案 1 :(得分:6)

是的,还有:

ocamlc是字节码编译器,ocamlopt是本机代码编译器。 GCL将Common Lisp编译为本机二进制文件。

F#没有任何东西,因为据我所知,.NET没有像Joel提到的原生编译器。实际上,CSML可以用来从ocaml调用C#,呃,不确定你是否可以将它编译成本机代码 - 虽然文档暗示它很可能 - 但它是非常不完整的。

答案 2 :(得分:4)

许多函数式语言的编译方式与其他任何语言一样。

例如在Clojure中:

  • reader将源代码文本转换为代表程序的数据结构(s-expression
  • 如果需要,则应用宏来转换代码
  • 然后Clojure编译器将代码转换为Java字节码 - 这与Java,Scala和其他JVM语言使用的机器可移植格式相同
  • 最后,JVM中的JIT compiler将字节码转换为本机机器码,可能会动态执行各种优化。这是在运行的任何平台上直接执行的代码。

一个有趣的观点是,所有这些都是动态发生的,即在程序执行期间的任何时候,您都可以编写新的源代码,将其传递给阅读器和各种编译步骤,并运行新编译的本机代码,无需必须重新启动程序。这很重要,因为它可以interactive development at the REPL启用,同时仍然提供完全编译代码的好处。

答案 3 :(得分:1)

PLT Scheme有一个JIT编译器。

Stalin是一个Scheme编译器,可以进行可笑的积极优化。

除了CLISP之外,我所知道的所有Common Lisp实现都编译为本机代码。 (然而,是否应该将CL视为功能性语言取决于“功能性”一词的含义。)

MLton是标准ML的高度优化编译器。

功能语言可以并且有一段时间非常有效地编译。在这方面,命令式语言没有区别。