Clojure компилируется или интерпретируется? - PullRequest
36 голосов
/ 15 апреля 2011

Я где-то читал, Clojure компилируется. Действительно ли он скомпилирован, как Java или Scala, а не интерпретирован, как Jython или JRuby?

Ответы [ 3 ]

50 голосов
/ 15 апреля 2011

Clojure всегда компилируется .

Компилятор Clojure создает Java-байт-код, который обычно затем JIT-компилируется в собственный код JVM.

То, что может сбивать с толку, - это динамическая и интерактивная природа Clojure, что означает, что вы можете вызывать компилятор во время выполнения, если хотите. Это все часть лисповской традиции «код - данные».

Например, следующее вызовет компилятор Clojure во время выполнения, чтобы скомпилировать и выполнить форму (+ 1 2):

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

Возможность вызывать компилятор во время выполнения очень полезна - например, он позволяет вам компилировать и запускать новый код в середине работающего приложения Clojure с помощью REPL. Но важно не путать этот «интерактивный» стиль разработки с «интерпретацией» - разработка Clojure является интерактивной, но все равно всегда компилируется.

17 голосов
/ 15 апреля 2011

Оба-иш!(когда дело доходит до генерации байт-кода)

Clojure на лету компилируется во время загрузки кода в байт-код JVM, который имеет ощущение и потокинтерпретируемый язык и заблаговременно скомпилированный в байт-код JVM, который имеет поток скомпилированного языка. оба они затем компилируются в машинный код компилятором Java Hotspot, который заботится о динамической оптимизации, от которой зависит Clojure в отношении скорости.просто чтобы сделать вещи интереснее, «загруженный / оцененный» код может компилироваться на лету во время выполнения, а скомпилированный код AOT может загружать и оценивать исходный код во время выполнения.

  • Если вы хотите «интерпретировать», тогда вы можете (load "/my/file.clj") из отчета.
  • Если вы хотите, чтобы компиляция опережала время, могу ли я предложить использовать инструмент управления проектами clojure leiningen .

В этомВ случае, когда я упоминаю компиляцию и интерпретацию, я должен понимать, что я имею в виду превращение исходного кода в байт-код JVM. Все языки JVM компилируются JVM во время выполнения , так что различиене очень интересно.

5 голосов
/ 15 апреля 2011

Clojure - это скомпилированный язык JVM. Это означает, что первый шаг, который необходимо предпринять при столкновении с новой программой, - это скомпилировать ее в байт-код JVM.

Часть байт-кода JVM может быть позже скомпилирована в машинный код с помощью HotSpot, если вы используете OpenJDK или его производную.

Как язык высокого уровня, Clojure имеет форму динамической типизации, на которую ссылается «полностью динамическая» фраза.

...