32

Leo en alguna parte Clojure está compilado. ¿Está realmente compilado, como Java o Scala, en lugar de interpretado, como Jython o JRuby?¿Se compila o interpreta Clojure?

+1

JFGI. Mire la página de inicio del proyecto. – Marcin

+1

@Marcin Lo hice pero me confunde un poco. ¿Podría proporcionar un aswer junto con donwvote? – OscarRyz

+1

"Clojure es un lenguaje compilado: se compila directamente en el bytecode de JVM, pero sigue siendo completamente dinámico". ¿Bastante claro? – Marcin

Respuesta

44

Clojure es siempre compilado.

El compilador Clojure produce código de bytes Java, que normalmente es JIT compilado a código nativo por la JVM.

Lo que puede ser confuso es la naturaleza dinámica e interactiva de Clojure, lo que significa que puede invocar el compilador en tiempo de ejecución si lo desea. Todo esto es parte de la tradición de Lisp "código es datos".

Por ejemplo, la siguiente invocará el compilador Clojure en tiempo de ejecución para compilar y ejecutar la forma (+ 1 2):

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

La capacidad de invocar el compilador en tiempo de ejecución es muy útil - por ejemplo, se le permite compilar y ejecutar código nuevo en el medio de una aplicación Clojure en ejecución mediante el uso de REPL. Pero es importante no confundir este estilo de desarrollo "interactivo" con ser "interpretado": el desarrollo de Clojure es interactivo, pero siempre compilado.

15

Both-ish! (Cuando se trata de la generación de código de bytes)

Clojure es sobre el FLY- compiled at code load time en bytecode JVM, que tiene la sensación y el flujo de un lenguaje interpretado, y ahead-of-time compiled en bytecode JVM, que tiene el flujo de de un lenguaje compilado. ambos son luego JIT compilados en código de máquina por el compilador Java Hotspot que se ocupa de la optimización dinámica de la que Clojure depende para la velocidad. solo para hacer que el código interesante "cargado/evaluado" pueda compilarse sobre la marcha en tiempo de ejecución, y el código compilado AOT puede cargar y evaluar la fuente en tiempo de ejecución.

  • Si desea "interpretado", entonces se puede (load "/my/file.clj") a partir de la réplica.
  • Si desea la compilación Ahead-Of-Time, le sugiero que utilice la herramienta de administración de proyectos leiningen clojure.

En este caso, cuando menciono la compilación vs interpretando Debería estar claro que estoy hablando de convertir el código fuente en bytecode JVM. Todos los lenguajes JVM son compiled by the JVM at runtime por lo que la distinción no es realmente muy interesante.

+1

Ambos! Es incorrecto, es solo el flujo de un lenguaje interpretado, nunca hay nada interpretado. – nickik

+3

nos encontramos con la disputa entre deffinitions puros y respuestas claras y concisas. en el último párrafo. Estoy hablando del proceso de creación de bytecode JVM. –

+0

editado para hacer que el distinctin sea más claro, gracias kickik –

4

Clojure es un lenguaje JVM compilado. Eso significa que el primer paso que toma cuando se enfrenta con un nuevo programa es compilarlo en bytecode de JVM.

Algunos de los códigos de byte JVM pueden compilarse luego en código de máquina mediante HotSpot, si está utilizando OpenJDK o una derivada de este.

Como lenguaje de alto nivel, Clojure tiene una forma de tipado dinámico, que es a lo que se refiere la frase "completamente dinámica".

Cuestiones relacionadas