2010-06-24 111 views
13

看来,要在每个新的IDE中安装Clojure,我必须完全重新安装并创建它的副本。运行REPL似乎正在运行一个Java程序。clojure程序/编译器/解释器如何实际“工作”?

我来自Ruby背景,其中Ruby程序运行于ruby program.rb,ruby是一个从一个地方执行的程序到文件(我知道这与它对java的工作原理类似, python等等)。

clojure“解释器”仅仅是一个编译的Java文件,它将.clj文件作为参数,并对它做了什么?

回答

29

首先,Clojure没有翻译。所有Clojure代码在加载时都会编译为JVM字节码。我强调这一点,因为这是Clojure出色的表演故事开始。其次,你并不真正“安装”Clojure,因为你在做Ruby。 Clojure是一个jar文件,它只是一堆Java类;如果你把jar文件放在你的类路径上,你可以运行这些类的方法。在这些类中,clojure.main提供了用于运行REPL和“脚本”的main方法。所以,运行REPL确实运行着一个Java(也就是JVM)程序;并且运行一个clj文件总计要求clojure.main加载并运行它(实际工作在Clojure的实现中交给了其他类,但clojure.main是入口点)。顺便说一句,这与JRuby完全一样。每个JVM程序最终“仅仅是一个编译的Java文件”,或者可能是一堆这样的文件。要运行它,您需要有一个JVM实例加载它并运行适当的main方法。请注意,C程序(例如ruby -the-command)的区别仅在于操作系统知道如何为您找到它们的main函数(当然,Java的类路径的作用也相当不同,但主要概念是相同的)。使用JVM程序,您需要使用适用于操作系统的可执行文件(java/java.exe)来解决问题。

+0

将.clj文件加载到'clojure.main'中时,实际文件会发生什么变化?你提到它被“编译”成JVM字节码......这是否将JVM代码作为额外文件输出,并且该文件是由JVM本身运行的? – 2010-06-24 19:23:59

+0

通常不会生成实际的'.class'文件,尽管你可以问他们(请参阅'(doc编译)'和'(doc * compile-files *)')。大部分时间没有理由担心这一点。请注意,这种操作模式根本不是Clojure所特有的; Python做同样的事情,编译'.py'文件到Python字节码然后运行它。一个区别是,Python默认输出编译好的模块为'.pyc'文件,但这并不总是可能的(例如,由于权限问题),并且与执行代码的方式无关。 – 2010-06-24 20:09:29

+0

如果我创建一个'.class'文件,并将它交给Bob,他能够在不安装clojure的情况下运行它吗? – 2010-06-25 01:07:35