Clojure是编译还是解释?

Osc*_*Ryz 37 interpreted-language compilation clojure jvm-languages compiled-language

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

mik*_*era 51

总是编译 Clojure .

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

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

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

(eval '(+ 1 2))
=> 3
Run Code Online (Sandbox Code Playgroud)

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


Art*_*ldt 18

两个十岁上下的!(当涉及到生成字节码时)

Clojure 在代码加载时编译成JVM字节码,它具有解释语言的感觉和流程,并且提前编译成JVM字节码,它具有编译语言的流程.然后,这两个都由Java Hotspot编译器JIT编译成机器代码,该编译器负责Clojure对速度的依赖的动态优化.只是为了让事情变得有趣"加载/评估"代码可以在运行时动态编译,AOT编译的代码可以在运行时加载和评估源代码.

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

在这种情况下,当我提到编译与解释时,我应该清楚我正在谈论将源代码转换为JVM字节码.所有JVM语言都是由JVM在运行时编译的,因此区分并不是非常有趣.

  • 我们正在讨论纯粹的定义和清晰简洁的答案之间的争论.在最后一段.我在谈论创建JVM字节码的过程. (3认同)

kit*_*yst 5

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

如果您使用的是OpenJDK或它的派生版本,则某些JVM字节码可能会在以后由HotSpot编译为机器代码。

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