Clojure是编译还是解释?

时间:2011-04-14 21:29:03

标签: clojure compilation jvm-languages interpreted-language compiled-language

我在某处编写了Clojure。它是真的编译过的,比如Java或Scala,而不是解释,比如Jython或JRuby?

3 个答案:

答案 0 :(得分:49)

Clojure 始终编译

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

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

例如,以下内容将在运行时调用Clojure编译器来编译并执行表单(+ 1 2)

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

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

答案 1 :(得分:16)

两者肥胖型! (当涉及到生成字节码时)

Clojure在飞行中 compiled at code load time 进入JVM字节码,它具有解释语言的感觉和流程,并且 ahead-of-time compiled 进入JVM字节码,它具有编译语言的流程。 然后由Java Hotspot编译器对这两个进行JIT编译到机器代码中,该编译器负责Clojure对速度的依赖的动态优化。只是为了让事情变得有趣“加载/评估”代码可以在运行时动态编译,AOT编译的代码可以在运行时加载和评估源代码。

  • 如果您想要“解释”,那么您可以从repl。{/ li> (load "/my/file.clj")
  • 如果您想进行Ahead-Of-Time编译,我是否可以建议使用leiningen clojure项目管理工具。

在这种情况下,当我提到编译与解释时,我应该清楚我正在谈论将源代码转换为JVM字节码。所有JVM语言都是compiled by the JVM at runtime所以区别不是真的很有趣。

答案 2 :(得分:4)

Clojure是一种编译的JVM语言。这意味着面对新程序时所采取的第一步是将其编译为JVM字节码。

如果你正在使用OpenJDK或它的衍生物,那么稍后可以通过HotSpot将一些JVM字节码编译成机器代码。

作为一种高级语言,Clojure有一种动态类型,这就是“完全动态”一词所指的内容。