0

我是一名学习 Clojure 的 C++ 程序员,并且在 Java 方面的经验有限。现在,我的 Clojure 程序只引用了库中的一个函数:

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

...
;; Code using join
...

在 C/C++ 中,链接器将消除未使用的函数,因此从库中引用单个函数不会产生重大开销。JVM/Clojure 世界会发生什么?它是 Clojure 编译器特定的还是 JVM 通用的?结果二进制文件会包含来自clojure.string或刚刚使用的所有函数吗?

4

1 回答 1

1

在 JVM 领域没有链接器。JVM 处理加载和链接。Java中的一切| Clojure 是一个共享对象,因此无法消除死代码。你永远不知道加载你的代码会使用什么。

在 clojure 中,每个函数都有自己的 .class 文件(JVM 上最小的“二进制”文件)。这些被压缩成一个 JAR 文件,这是标准的分发单元(这大约相当于 .dll 或 .so)。所以只有你使用的函数会被加载。但是,如果您担心分发大小,那么您就不走运了,或者必须手动拆分 JAR 文件才能找到正确的类文件。

于 2013-09-11T01:05:44.583 回答