Clojure是编译的还是解释的?



我在某处读到Clojure是编译的。它真的像Java或Scala那样是编译的,而不是像Jython或JRuby那样是解释的吗?

Clojure是总是编译

Clojure编译器生成Java字节码,通常由JVM将其jit编译为本机代码。

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

例如,下面的代码将在运行时调用Clojure编译器来编译和执行表单(+ 1 2):

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

在运行时调用编译器的能力非常有用——例如,它使您能够在运行的Clojure应用程序中使用REPL编译和运行新代码。但重要的是不要将这种"交互式"开发风格与"解释"开发风格混为一谈——Clojure开发是交互式的,但仍然总是编译的。

都是!(当涉及到生成字节码时)

Clojure是动态的——在代码加载时编译成JVM字节码,具有解释语言的感觉和流程,而提前编译成JVM字节码,具有编译语言的流程。然后,Java Hotspot编译器将这两个 JIT编译成机器码,该编译器负责Clojure依赖于速度的动态优化。"加载/求值"的代码可以在运行时动态编译,而AOT编译的代码可以在运行时加载和求值源代码。

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

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

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

如果你使用的是OpenJDK或者它的衍生版本,一些JVM字节码可能会被HotSpot编译成机器码。

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

相关内容

  • 没有找到相关文章

最新更新