2010-06-24 16 views
13

Parece que para instalar Clojure en cada IDE nuevo, tengo que volver a instalarlo por completo y crear una copia del mismo. Y ejecutar el REPL parece que está ejecutando un programa Java.¿Cómo funcionan realmente los programas/compiladores/intérpretes de clojure?

Vengo de un fondo de Ruby, donde los programas de Ruby se ejecutan por ruby program.rb, y el ruby ​​es un programa ejecutado desde un lugar, en el archivo (soy consciente de que esto es similar a cómo funciona para Java, python, etc. también).

¿Es el "intérprete" de clojure simplemente un archivo compilado de Java que toma el archivo .clj como argumento y le hace cosas?

Respuesta

29

En primer lugar, Clojure no tiene ningún intérprete. Todo el código de Clojure se compila en el bytecode de JVM cuando se está cargando. Estoy enfatizando este punto, porque así es como comenzó la excelente historia de Clojure.

En segundo lugar, realmente no "instala" Clojure en el sentido de que lo hace Ruby. Clojure viene como un archivo jar, que es solo un montón de clases de Java; si coloca el archivo jar en su classpath, puede ejecutar los métodos de esas clases. De esas clases, clojure.main proporciona un método main para ejecutar REPLs y "scripts". Por lo tanto, ejecutar el REPL está ejecutando un programa Java (es decir, JVM); y ejecutar un archivo clj equivale a pedir clojure.main para cargarlo y ejecutarlo (el trabajo real se transfiere a otras clases en la implementación de Clojure, pero clojure.main es el punto de entrada). Por cierto, esto es exactamente lo mismo que con JRuby.

Cada programa JVM es en última instancia "simplemente un archivo compilado de Java", o tal vez un montón de dichos archivos. Para ejecutarlo, necesita tener una instancia de JVM que lo cargue y ejecute el método main apropiado. Tenga en cuenta que los programas C (como ruby -the-command) solo son diferentes porque el sistema operativo sabe cómo encontrar sus funciones main (bueno, el equivalente del classpath de Java también funciona de manera bastante diferente, pero los conceptos principales son los mismos) Con los programas JVM, debe usar un ejecutable compatible con el sistema operativo (java/java.exe) para iniciar el proceso.

+0

Cuando carga un archivo .clj en 'clojure.main', ¿qué ocurre con el archivo real? Mencionas que se está "compilando" en el bytecode de JVM ... ¿es esto un punto en el que ese código JVM se emite como un archivo extra, y ese archivo lo ejecuta la propia JVM? –

+0

Normalmente no se producen archivos '.class', aunque puede solicitarlos si lo desea (consulte' (compilación de doc) 'y' (doc * compile-files *) '). No hay razón para preocuparse por esto la mayor parte del tiempo. Tenga en cuenta que este modo de operación no es particular para Clojure en absoluto; Python hace lo mismo, compila archivos '.py' a Python bytecode y luego lo ejecuta. Una diferencia es que Python genera los módulos compilados como archivos '.pyc' de manera predeterminada, pero esto ni siquiera es posible (por ejemplo, debido a problemas de permisos) y no influye en la forma en que se ejecuta el código. –

+0

Si creo un archivo '.class', y se lo paso a Bob, ¿podría ejecutarlo sin instalar clojure? –

Cuestiones relacionadas