2010-06-24 4 views
13

Il semble que pour installer Clojure dans chaque nouvel IDE, je dois le réinstaller complètement et en créer une copie. Et l'exécution du REPL semble être en cours d'exécution d'un programme Java. Je viens d'un arrière-plan Ruby, où les programmes Ruby sont exécutés par ruby program.rb, et le ruby ​​étant un programme exécuté d'un endroit, sur le fichier (je suis conscient que cela est similaire à comment cela fonctionne pour Java, python, etc.).Comment les programmes/compilateurs/interprètes de clojure fonctionnent-ils réellement?

Est-ce que le "interpréteur" de clojure est simplement un fichier Java compilé qui prend le fichier .clj comme argument, et fait des choses dessus?

Répondre

29

Premièrement, Clojure n'a pas d'interprète. Tout le code Clojure est compilé dans le bytecode JVM lors de son chargement. J'insiste sur ce point, car c'est là que commence l'excellente histoire de Clojure. Deuxièmement, vous n'installez pas vraiment Clojure dans le sens où vous faites Ruby. Clojure se présente sous la forme d'un fichier jar, qui est juste un groupe de classes Java; Si vous placez le fichier jar sur votre chemin de classe, vous pouvez exécuter les méthodes de ces classes. De ces classes, clojure.main fournit une méthode main pour exécuter REPL et "scripts". Par conséquent, l'exécution de REPL exécute en effet un programme Java (c'est-à-dire JVM); et exécuter un fichier clj revient à demander clojure.main de le charger et de l'exécuter (le travail réel est transféré à d'autres classes dans l'implémentation de Clojure, mais clojure.main est le point d'entrée). BTW, c'est exactement la même chose qu'avec JRuby. Chaque programme JVM est finalement "simplement un fichier Java compilé", ou peut-être un tas de ces fichiers. Pour l'exécuter, vous devez charger une instance JVM et exécuter la méthode main appropriée. Notez que les programmes C (tels que ruby -the-command) ne sont différents que dans la mesure où le système d'exploitation sait comment trouver leurs fonctions main pour vous (l'équivalent de classpath de Java fonctionne également différemment, mais les concepts principaux sont les mêmes). Avec les programmes JVM, vous devez utiliser un exécutable compatible avec le système d'exploitation (java/java.exe) pour lancer le processus.

+0

Lorsque vous chargez un fichier .clj dans 'clojure.main', qu'arrive-t-il au fichier réel? Vous mentionnez qu'il est "compilé" dans le bytecode JVM ... est-ce à un point où ce code JVM est sorti en tant que fichier supplémentaire, et ce fichier est exécuté par la JVM elle-même? –

+0

Normalement, aucun fichier '.class' n'est produit, mais vous pouvez le demander si vous le souhaitez (voir' (doc compile) 'et' (doc * compile-files *) '). Il n'y a aucune raison de s'inquiéter à ce sujet la plupart du temps. Notez que ce mode de fonctionnement n'est pas particulier à Clojure; Python fait la même chose, en compilant des fichiers '.py' en bytecode Python, puis en l'exécutant. Une différence est que Python sort les modules compilés en tant que fichiers '.pyc' par défaut, mais cela n'est même pas toujours possible (par exemple en raison de problèmes de permission) et n'a aucune incidence sur la façon dont le code est exécuté. –

+0

Si je crée un fichier '.class' et que je le passe à Bob, serait-il capable de l'exécuter sans installer clojure? –

Questions connexes