32

我读过Clojure编译的地方。像Java或Scala一样,它是否真的被编译,而不是像Jython或JRuby一样被解释?Clojure是编译还是解释?

+1

JFGI。看看项目主页。 – Marcin 2011-04-14 21:30:43

+1

@Marcin我做了,但它让我困惑了一下。你能否与donwvote一起提供一个aswer? – OscarRyz 2011-04-14 21:32:00

+1

“Clojure是一种编译语言 - 它直接编译为JVM字节码,但仍保持完全动态。”够清楚了吗? – Marcin 2011-04-14 21:33:56

回答

44

Clojure是总是编译

Clojure编译器生成Java字节码,通常由JVM JIT编译为本地代码。

可以混淆的是Clojure的动态和交互性,这意味着如果你愿意,可以在运行时调用编译器。这是Lisp“代码是数据”传统的一部分。

例如,下面将调用在运行时Clojure的编译器来编译和执行的形式(+ 1 2)

(eval '(+ 1 2)) 
=> 3 

调用在运行时编译的能力是非常有用的 - 例如,它使您能够使用REPL在正在运行的Clojure应用程序中编译和运行新代码。但重要的是不要混淆这种“互动式”发展风格与“解读”--Clojure开发是互动式的,但仍然是经常编译的。

15

双方! (当涉及到生成字节码)

Clojure是上最飞越时compiled at code load time到JVM字节码,其具有感和解释语言的流,及ahead-of-time compiled到JVM字节码,其具有流的编译语言。 这两个都是由Java Hotspot编译器将JIT编译为机器代码,后者负责Clojure的速度依赖的动态优化。只是为了使事情变得有趣“加载/评估”代码可以在运行时即时编译,并且AOT编译代码可以在运行时加载和评估源代码。

  • 如果你想“解释”,那么你可以从0123的(load "/my/file.clj")从repl。
  • 如果你想要提前编译,我可以建议使用leiningen clojure项目管理工具。

在当我提到编译与解释我应该清楚,我说的是打开源代码转换成JVM字节码这种情况。所有的JVM语言都是compiled by the JVM at runtime,所以区别并不是很有趣。

+1

两个!是错误的,它只有一种解释型语言的流程,没有任何解释。 – nickik 2011-04-14 21:41:52

+3

我们正在陷入纯粹的定义和明确的简洁答案之间的争论。在最后一段。我正在讨论创建JVM字节码的过程。 – 2011-04-14 21:49:48

+0

编辑,使之更清晰,谢谢kickik – 2011-04-14 22:08:00

4

Clojure是一种编译的JVM语言。这意味着当遇到新程序时,第一步就是将其编译为JVM字节码。

如果您使用的是OpenJDK或其衍生产品,某些JVM字节码稍后可能会通过HotSpot编译为机器代码。

作为一种高级语言,Clojure具有动态类型的形式,这就是“完全动态”的短语所指的。