6

Joel Spolsky赞扬了不依赖于运行时的程序的本机代码版本。

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

4

4 回答 4

11

这个帖子真的很不清楚。问题似乎是“是否有功能语言的编译器可以生成本机可执行文件而无需安装其他软件?”

一般来说,答案是肯定的。例如,Haskell有一个生成本机二进制文件的编译器。许多其他函数式语言具有类似的编译器。

于 2008-09-19T19:28:11.457 回答
6

是的,还有:

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

F# 没有任何东西,因为据我所知,.NET 没有像 Joel 提到的本机编译器。实际上,CSML 可用于从 ocaml 调用 C#,呃,不确定是否可以将其编译为本机代码 - 似乎不太可能 - 尽管文档暗示了它,但它非常不完整。

于 2008-09-19T19:49:13.717 回答
4

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

例如在 Clojure 中:

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

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

于 2011-02-22T13:42:00.193 回答
1

PLT Scheme有一个 JIT 编译器。

Stalin是一个 Scheme 编译器,它进行了可笑的激进优化。

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

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

函数式语言可以并且已经被非常有效地编译了一段时间。在这方面,命令式语言没有区别。

于 2008-09-20T21:39:55.563 回答