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.在这种情况下,当我提到编译与解释时,我应该清楚我正在谈论将源代码转换为JVM字节码.所有JVM语言都是由JVM在运行时编译的,因此区分并不是非常有趣.
Clojure是一种编译的JVM语言。这意味着,面对新程序时,第一步是将其编译为JVM字节码。
如果您使用的是OpenJDK或它的派生版本,则某些JVM字节码可能会在以后由HotSpot编译为机器代码。
作为一种高级语言,Clojure具有一种动态类型化的形式,这就是“完全动态”这一短语所指的。