32

我讀過Clojure編譯的地方。像Java或Scala一樣,它是否真的被編譯,而不是像Jython或JRuby一樣被解釋?Clojure是編譯還是解釋?

+1

JFGI。看看項目主頁。 – Marcin 2011-04-14 21:30:43

+1

@Marcin我做了,但它讓我困惑了一下。你能否與donwvote一起提供一個aswer? – OscarRyz 2011-04-14 21:32:00

+1

「Clojure是一種編譯語言 - 它直接編譯爲JVM字節碼,但仍保持完全動態。」夠清楚了嗎? – Marcin 2011-04-14 21:33:56

回答

44

Clojure是總是編譯

Clojure編譯器生成Java字節碼,通常由JVM JIT編譯爲本地代碼。

可以混淆的是Clojure的動態和交互性,這意味着如果你願意,可以在運行時調用編譯器。這是Lisp「代碼是數據」傳統的一部分。

例如,下面將調用在運行時Clojure的編譯器來編譯和執行的形式(+ 1 2)

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

調用在運行時編譯的能力是非常有用的 - 例如,它使您能夠使用REPL在正在運行的Clojure應用程序中編譯和運行新代碼。但重要的是不要混淆這種「互動式」發展風格與「解讀」--Clojure開發是互動式的,但仍然是經常編譯的。

15

雙方! (當涉及到生成字節碼)

Clojure是上最飛越時compiled at code load time到JVM字節碼,其具有感和解釋語言的流,及ahead-of-time compiled到JVM字節碼,其具有流的編譯語言。 這兩個都是由Java Hotspot編譯器將JIT編譯爲機器代碼,後者負責Clojure的速度依賴的動態優化。只是爲了使事情變得有趣「加載/評估」代碼可以在運行時即時編譯,並且AOT編譯代碼可以在運行時加載和評估源代碼。

  • 如果你想「解釋」,那麼你可以從0123的(load "/my/file.clj")從repl。
  • 如果你想要提前編譯,我可以建議使用leiningen clojure項目管理工具。

在當我提到編譯與解釋我應該清楚,我說的是打開源代碼轉換成JVM字節碼這種情況。所有的JVM語言都是compiled by the JVM at runtime,所以區別並不是很有趣。

+1

兩個!是錯誤的,它只有一種解釋型語言的流程,沒有任何解釋。 – nickik 2011-04-14 21:41:52

+3

我們正在陷入純粹的定義和明確的簡潔答案之間的爭論。在最後一段。我正在討論創建JVM字節碼的過程。 – 2011-04-14 21:49:48

+0

編輯,使之更清晰,謝謝kickik – 2011-04-14 22:08:00

4

Clojure是一種編譯的JVM語言。這意味着當遇到新程序時,第一步就是將其編譯爲JVM字節碼。

如果您使用的是OpenJDK或其衍生產品,某些JVM字節碼稍後可能會通過HotSpot編譯爲機器代碼。

作爲一種高級語言,Clojure具有動態類型的形式,這就是「完全動態」的短語所指的。