【问题标题】:Is Clojure compiled or interpreted?Clojure 是编译的还是解释的?
【发布时间】:2011-08-05 21:51:06
【问题描述】:

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

【问题讨论】:

  • @Marcin 我做了,但这让我有点困惑。你能在投票的同时提供一个回答吗?
  • “Clojure 是一种编译语言 - 它直接编译为 JVM 字节码,但仍保持完全动态。”够清楚吗?
  • 其实那段是把我带到这里的第一段。
  • 那我不明白你为什么感到困惑。 Clojure 严格来说是一种编译语言,就像 Java 和 Scala 一样。与 Java 的不同之处在于它还可以在运行时编译代码并加载它,而不是依赖于不同的编译阶段。
  • 我不确定这会更清晰。

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


【解决方案1】:

两者兼而有之! (当涉及到生成字节码时)

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

  • 如果您想要“解释”,那么您可以在回复中(load "/my/file.clj")
  • 如果您想要 Ahead-Of-Time 编译,我建议您使用 leiningen clojure 项目管理工具。

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

【讨论】:

  • 两者都有!是错误的,它只是一种解释语言的流动,从来没有任何东西被解释过。
  • 我们遇到了纯粹的定义和清晰简洁的答案之间的争论。在最后一段。我说的是创建JVM字节码的过程。
【解决方案2】:

Clojure总是被编译

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

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

例如,以下将在运行时调用 Clojure 编译器来编译和执行 (+ 1 2) 的形式:

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

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

【讨论】:

    【解决方案3】:

    Clojure 是一种编译型 JVM 语言。这意味着当遇到一个新程序时,第一步就是将其编译为 JVM 字节码。

    如果您使用的是 OpenJDK 或其衍生版本,某些 JVM 字节码稍后可能会被 HotSpot 编译为机器码。

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

    【讨论】:

      猜你喜欢
      • 2010-12-03
      • 1970-01-01
      • 1970-01-01
      • 2016-11-19
      • 1970-01-01
      • 2011-07-01
      • 2020-10-27
      • 2012-08-28
      • 2014-04-05
      相关资源
      最近更新 更多