我是C ++程序员学习Clojure并且使用Java经验有限。现在,我有Clojure程序引用库中的一个函数:
(ns app.main
(:gen-class)
(:require [clojure.string :refer [join]))
...
;; Code using join
...
在C / C ++中,链接器将消除未使用的函数,因此从库中引用单个函数没有明显的开销。在JVM / Clojure世界中会发生什么?是Clojure编译器特定还是JVM一般?结果二进制包含clojure.string
或刚使用的所有函数吗?
答案 0 :(得分:1)
在JVM中没有链接器。 JVM处理加载和链接。 Java中的一切| Clojure是一个共享对象,因此无法消除死代码。你永远不知道加载你的代码将会使用什么。
在clojure中,每个函数都有自己的.class文件(JVM上最小的'二进制'文件)。这些被压缩到JAR文件中,这是标准的分发单元(这相当于.dll或.so)。因此,只有您使用的功能才会被加载。但是,如果您担心分发大小,那么您运气不好或者必须手动撕开JAR文件以找到正确的类文件。