Подтвердить что ты не робот

Является ли Clojure скомпилированным или интерпретируемым?

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

4b9b3361

Ответ 1

Clojure всегда скомпилирован.

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

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

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

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

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

Ответ 2

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

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

  • Если вы хотите "интерпретировать", вы можете (load "/my/file.clj") из repl.
  • Если вы хотите компилировать Ahead-Of-Time, могу ли я предложить использовать leiningen Clojure инструмент управления проектами.

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

Ответ 3

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

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

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