Clojure компилируется или интерпретируется?
Я где-то читал, Clojure компилируется. Это действительно скомпилировано, как Java или Scala, а не интерпретировано, как Jython или JRuby?
3 ответа
Clojure всегда компилируется.
Компилятор Clojure создает Java-байт-код, который обычно затем JIT-компилируется в собственный код с помощью JVM.
То, что может сбивать с толку, - это динамическая и интерактивная природа Clojure, что означает, что вы можете вызывать компилятор во время выполнения, если хотите. Это все часть лисповской традиции "код - данные".
Например, следующее вызовет компилятор Clojure во время выполнения, чтобы скомпилировать и выполнить форму (+ 1 2)
:
(eval '(+ 1 2))
=> 3
Возможность вызывать компилятор во время выполнения очень полезна - например, он позволяет вам компилировать и запускать новый код в середине работающего приложения Clojure с помощью REPL. Но важно не путать этот "интерактивный" стиль разработки с "интерпретацией" - разработка Clojure является интерактивной, но все же всегда компилируется.
Оба-иш! (когда дело доходит до генерации байт-кода)
Clojure на лету компилируется во время загрузки кода в байт-код JVM, который имеет смысл и поток интерпретируемого языка, и заблаговременно компилируется в байт-код JVM, который имеет поток скомпилированного языка. оба они затем JIT скомпилированы в машинный код компилятором Java Hotspot, который заботится о динамической оптимизации, от которой Clojure зависит в скорости. просто чтобы сделать вещи интереснее, "загруженный / оцененный" код может компилироваться на лету во время выполнения, а скомпилированный код AOT может загружать и оценивать исходный код во время выполнения.
- Если вы хотите "интерпретировать", то вы можете
(load "/my/file.clj")
из респ. - Если вы хотите заблаговременную компиляцию, могу я предложить использовать инструмент управления проектами leiningen clojure.
В этом случае, когда я упоминаю компиляцию или интерпретацию, мне должно быть ясно, что я говорю о превращении исходного кода в байт-код JVM. Все языки JVM компилируются JVM во время выполнения, поэтому различие не очень интересно.
Clojure - это скомпилированный язык JVM. Это означает, что первый шаг, который необходимо предпринять при столкновении с новой программой, - это скомпилировать ее в байт-код JVM.
Некоторый байт-код JVM может быть позже скомпилирован в машинный код с помощью HotSpot, если вы используете OpenJDK или его производную.
Как язык высокого уровня, Clojure имеет форму динамической типизации, на которую ссылается "полностью динамическая" фраза.