Clojure是编译的还是解释的?

Clojure是编译的还是解释的?,clojure,compilation,jvm-languages,interpreted-language,compiled-language,Clojure,Compilation,Jvm Languages,Interpreted Language,Compiled Language,我在Clojure编译的地方读到过。它真的是像Java或Scala那样编译的,而不是像Jython或JRuby那样解释的吗!(在生成字节码时) Clojure正在飞入JVM字节码(具有解释语言的感觉和流程)和JVM字节码(具有编译语言的流程)。然后,Java Hotspot编译器将这两种代码JIT编译成机器代码,该编译器负责Clojure在速度上依赖的动态优化。为了让事情变得有趣,“加载/评估”代码可以在运行时动态编译,而AOT编译的代码可以在运行时加载和评估源代码 如果需要“解释”,则可以从

我在Clojure编译的地方读到过。它真的是像Java或Scala那样编译的,而不是像Jython或JRuby那样解释的吗!(在生成字节码时)

Clojure正在飞入JVM字节码(具有解释语言的感觉和流程)和JVM字节码(具有编译语言的流程)。然后,Java Hotspot编译器将这两种代码JIT编译成机器代码,该编译器负责Clojure在速度上依赖的动态优化。为了让事情变得有趣,“加载/评估”代码可以在运行时动态编译,而AOT编译的代码可以在运行时加载和评估源代码

  • 如果需要“解释”,则可以从repl中
    (加载“/my/file.clj”)
  • 如果您想提前编译,我建议您使用clojure项目管理工具

在本例中,当我提到编译与解释时,我应该清楚地知道,我所说的是将源代码转换为JVM字节码。所有的JVM语言都是如此,所以区别并不是很有趣

Clojure总是被编译

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

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

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


在运行时调用编译器的能力非常有用——例如,它使您能够通过使用RePL在运行的Culjure应用程序的中间编译和运行新代码。但重要的是不要将这种“交互式”开发风格与“解释式”开发混淆——Clojure开发是交互式的,但始终是编译的。

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

如果您使用的是OpenJDK或它的派生版本,一些JVM字节码可能稍后会被HotSpot编译成机器代码


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

@Marcin我有,但这让我有点困惑。你能在donwvote的同时提供一个aswer吗?“Clojure是一种编译语言——它直接编译到JVM字节码,但仍然是完全动态的。”足够清楚了吗?事实上,这一段首先把我带到了这里。然后我不明白你为什么会感到困惑。Clojure严格来说是一种编译语言,就像Java和Scala一样。与Java的不同之处在于,它还可以在运行时编译代码并加载代码,而不是依赖于不同的编译阶段。我不确定这会有多清晰。两者都有!这是错误的,它只是解释语言的流动,从来没有解释过任何东西。我们正在陷入纯粹的定义和清晰简洁的答案之间的争论。在最后一段。我说的是创建JVM字节码的过程。
(eval '(+ 1 2))
=> 3