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.
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? –
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. –
Si creo un archivo '.class', y se lo paso a Bob, ¿podría ejecutarlo sin instalar clojure? –