2013-09-10 31 views
0

我是C++程序員,學習Clojure並且對Java有限的經驗。現在,我有Clojure的程序從庫引用只有一個功能:Clojure(JVM):鏈接(引用)庫

(ns app.main 
    (:gen-class) 
    (:require [clojure.string :refer [join])) 

... 
;; Code using join 
... 

在C/C++連接器將刪除未使用的功能,所以從庫中引用一個函數沒有顯著的開銷。 JVM/Clojure世界會發生什麼?它是特定於Clojure編譯器還是JVM一般?將導致二進制包含從clojure.string或僅用於所有功能?

+0

沒有生成的二進制文件。有一個爲每個命名空間生成的類文件,並且我認爲將命名空間加載到ram的模塊化處於類文件的級別(在需要ns時加載)。 – noisesmith

回答

1

在JVM域中沒有鏈接器。 JVM處理加載和鏈接。在Java中的所有東西| Clojure是一個共享對象,因此無法清除死代碼。你永遠不知道什麼會被加載你的代碼使用。

在clojure中,每個函數都有自己的.class文件(JVM上最小的'binary'文件)。這些被壓縮成一個JAR文件,這是標準的分發單元(這大約相當於.dll或.so)。所以只有你使用的函數纔會被加載。但是,如果您擔心分發大小,那麼您運氣不佳,或者必須手動撕開JAR文件才能找到正確的類文件。

+0

謝謝,這是一個完整的答案。我不知道功能是一個班級。這很可能是'IFn'的實施。 – demi

+1

@demi http://clojure.org/compilation是我可以找到關於compliation如何工作的最佳參考。 – stonemetal