Clojureがコンパイルされている場所を読みました。Jython や JRuby のように解釈されるのではなく、Java や Scala のように本当にコンパイルされますか?
3 に答える
Clojure は常にコンパイルされます。
Clojure コンパイラーは Java バイトコードを生成します。これは通常、JVM によってネイティブコードに JIT コンパイルされます。
混乱を招く可能性があるのは、必要に応じて実行時にコンパイラを呼び出すことができることを意味する、Clojure の動的でインタラクティブな性質です。これはすべて、Lisp の「コードはデータである」という伝統の一部です。
たとえば、次の例では、実行時に Clojure コンパイラを呼び出して、フォームをコンパイルおよび実行します(+ 1 2)
。
(eval '(+ 1 2))
=> 3
実行時にコンパイラを呼び出す機能は非常に便利です。たとえば、実行中の Clojure アプリケーションの途中で、REPL を使用して新しいコードをコンパイルおよび実行できます。しかし、この「対話型」の開発スタイルと「解釈される」スタイルを混同しないことが重要です。Clojure の開発は対話型ですが、常にコンパイルされます。
両方っぽい!(バイトコードの生成に関して)
Clojureは、コードのロード時に、インタープリター言語の感覚とフローを備えたJVMバイトコードにオンザフライでコンパイルされ、コンパイルされた言語のフローを備えたJVMバイトコードに事前にコンパイルされます。これらは両方とも、Clojureが速度のために依存する動的最適化を処理するJavaHotspotコンパイラーによってマシンコードにJITコンパイルされます。面白くするために、「ロード/評価済み」コードは実行時にオンザフライでコンパイルでき、AOTコンパイル済みコードは実行時にソースをロードして評価できます。
- 「解釈」したい場合は、担当者
(load "/my/file.clj")
から行うことができます。 - 事前コンパイルが必要な場合は、leiningenclojureプロジェクト管理ツールの使用をお勧めします。
この場合、コンパイルとインタープリターについて言及するときは、ソースコードをJVMバイトコードに変換することについて話していることを明確にする必要があります。すべてのJVM言語は、実行時にJVMによってコンパイルされるため、区別はあまり重要ではありません。
Clojure はコンパイル済みの JVM 言語です。つまり、新しいプログラムに直面したときの最初のステップは、それを JVM バイトコードにコンパイルすることです。
OpenJDKまたはその派生物を使用している場合、一部のJVMバイトコードは後でHotSpotによってマシンコードにコンパイルされる場合があります。
高水準言語として、Clojure は動的型付けの形式を持っています。これは、「完全に動的」というフレーズが言及しているものです。