Clojure是编译还是解释?

| 我读过Clojure编译的地方。它真的像Java或Scala一样被编译,而不是像Jython或JRuby那样被解释吗?     
已邀请:
Clojure总是被编译。 Clojure编译器生成Java字节代码,然后通常将其通过JVM JIT编译为本地代码。 令人困惑的是Clojure的动态和交互性质,这意味着您可以在运行时调用编译器。这就是Lisp“代码就是数据”传统的全部内容。 例如,以下将在运行时调用Clojure编译器来编译并执行格式“ 0”:
(eval \'(+ 1 2))
=> 3
在运行时调用编译器的功能非常有用-例如,它使您可以使用REPL在正在运行的Clojure应用程序中间编译和运行新代码。但是重要的是不要将这种“交互”的开发风格与“解释”相混淆-Clojure开发是交互式的,但始终会被编译。     
双双! (涉及生成字节码时) Clojure在代码加载时即时编译为具有解释语言的感觉和流程的JVM字节码,并提前编译为具有编译语言的流程的JVM字节码。然后,这两种方法都由Java Hotspot编译器JIT编译成机器代码,该编译器负责Clojure依赖于速度的动态优化。只是为了使事情变得有趣,“已加载/评估的”代码可以在运行时动态编译,而AOT编译的代码可以在运行时加载和评估源代码。 如果您想要“解释”,则可以从代表中
(load \"/my/file.clj\")
。 如果您想提前编译,我建议使用leiningen clojure项目管理工具。 在这种情况下,当我提到编译与解释时,我应该清楚地是在谈论将源代码转换为JVM字节码。所有JVM语言都是在运行时由JVM编译的,因此区分并不是很有趣。     
Clojure是一种编译的JVM语言。这意味着,面对新程序时,第一步是将其编译为JVM字节码。 如果您使用的是OpenJDK或它的派生版本,则某些JVM字节码可能会在以后由HotSpot编译为机器代码。 作为一种高级语言,Clojure具有一种动态类型化的形式,这就是“完全动态”这一短语所指的。     

要回复问题请先登录注册