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 имеет форму динамической типизации, на которую ссылается "полностью динамическая" фраза.

Другие вопросы по тегам