当我通过以下方式之一将(大)模块导入主模块时:
import Mymodule
import qualified Mymodule as M
import Mymodule (MyDatatype)
与我不导入该模块时相比,编译后的二进制文件增长了同样巨大的数量。无论我是否在该模块中使用任何内容,或者不在主模块中使用任何内容,都会发生这种情况。编译器(我在 Debian 测试中使用 GHC)不应该只在二进制文件中添加运行它所需的内容吗?
在我的具体情况下,我的模块中有一个巨大的地图,我不在主模块中使用它。有选择地导入我真正需要的内容,并没有改变编译后的二进制文件的增长。
就 GHC 而言,导入列表只是为了可读性和避免名称冲突;它们根本不影响链接的内容。
此外,即使您只从库中导入了一些函数,它们可能仍然依赖于库内部的大部分函数,因此您不一定期望看到仅使用一些可用接口的大小会减小。
默认情况下,GHC 链接整个库,而不仅仅是您使用的部分;您可以通过使用以下命令构建库来避免这种情况-split-objs
GHC 选项(或将split-objs: True
在你的 cabal-install 配置文件中(~/.cabal/config
在 Unix 上)),但它会减慢编译速度,并且 GHC 开发人员似乎不推荐:
-split-objs
告诉链接器将通常生成的单个目标文件拆分为多个目标文件,每个顶级 Haskell 函数或模块中的类型一个。这仅对库有意义,这意味着链接到库的可执行文件更小,因为它们只链接到它们需要的目标文件。然而,单独组装所有部分的成本很高,因此这比正常编译要慢。此外,库本身(.a 文件)的大小可能大 2 到 2.5 倍。我们使用此功能来构建 GHC 的库。
— GHC 手册
无论导入什么内容,这都会忽略您使用的库中未使用的部分。
您可能还有兴趣使用共享 Haskell 库.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)