## 編譯
當clojure的源代碼文件被當作腳本文件執行的時候,它們是在運行時被編譯成java的bytecode的。同時我們也可以提前編譯(AOT ahead-of-time)它們成java bytecode。這會縮短clojure程序的啟動時間,并且產生的.class文件還可以給java程序使用。我們推薦按照下面的步驟來做:
1. 為你要編譯的文件選擇一個名字空間,比如: `com.ociweb.talk` 。
2. 在父目錄里面創建兩個目錄: " `src` " 和 " `classes` " 。
3. 使你的其中一個文件的文件名和包名的最后一段相同,比如: `talk.clj` 。
4. 把你的源文件放在 " `src` " 目錄下面,并且創建和名字空間一樣的目錄層級,比如: `src/com/ociweb/talk.clj` 。
5. 在你的源代碼的最上面給你的文件指定名字空間,并且包含:gen-class標記: `(ns com.ociweb.talk (:gen-class))`
6. 在你的主源文件里面,使用 `load` 函數來加載同一個目錄下面的其它源文件, 比如,如果 `more.clj` 在目錄 `src/com/ociweb` 的子目錄 " `talk` "下面那么用這個語句來加載 `(load "talk/more")` .
7. 在其它的源文件里面, 使用 `in-ns` 函數來設置他們的名字空間. 比如, 在more.clj文件上面指定名字空間: `(in-ns 'com.ociweb.talk)。`
8. 把 " `src` " 和 " `classes` " 目錄添加到REPL的classpath里面去。如果你使用了一個腳本來運行REPL, 那么修改那個腳本。
9. 啟動一個REPL。
10. 使用 `compile` 函數來編譯一個給定名字空間的clojure文件: `(compile '_namespace_)。比如` : `(compile 'com.ociweb.talk)` .
這些步驟會為每個函數創建一個單獨的.class文件。他們會被寫到 " `classes` " 文件夾下對應的子文件夾下面去。
如果這個被編譯的名字空間有一個叫做- `main` 的函數, 那么你可以把它當作java的主類的運行。命令行參數會被當作參數傳遞給這個函數。比如,如果 `talk.clj` 包含一個叫 `-main` 的函數, 你可以用下面的命令來運行:
```
java -classpath <em>path</em>/classes:<em>path</em>/clojure.jar com.ociweb.talk <em>args</em>
```