gpt4 book ai didi

Haskell:模块导入带来不必要的二进制增长

转载 作者:行者123 更新时间:2023-12-02 08:42:44 25 4
gpt4 key购买 nike

当我通过以下方式之一将(大)模块导入主模块时:

import Mymodule
import qualified Mymodule as M
import Mymodule (MyDatatype)

与我不导入该模块时相比,编译后的二进制文件增长了同样巨大的数量。无论我是否在该模块中使用任何内容,或者不在主模块中使用任何内容,都会发生这种情况。编译器(我在 Debian 测试中使用 GHC)不应该只在二进制文件中添加运行它所需的内容吗?

在我的具体情况下,我的模块中有一个巨大的 map ,我不在主模块中使用它。有选择地导入我真正需要的内容,并没有改变编译后的二进制文件的增长。

最佳答案

就 GHC 而言,导入列表只是为了可读性和避免名称冲突;它们根本不会影响链接的内容。

此外,即使您只从库中导入了一些函数,它们可能仍然依赖于库内部的大部分函数,​​因此您不一定期望看到仅使用某些可用接口(interface)会导致大小减小一般来说。

默认情况下,GHC 链接整个库,而不仅仅是您使用的部分;您可以通过使用 GHC 的 -split-objs 选项构建库来避免这种情况(或者将 split-objs: True 放入 cabal-install 配置文件中(~/.cabal/config 在 Unix 上)),但它会减慢编译速度,而且 GHC 开发人员似乎不推荐:

-split-objs

Tell the linker to split the single object file that would normally be generated into multiple object files, one per top-level Haskell function or type in the module. This only makes sense for libraries, where it means that executables linked against the library are smaller as they only link against the object files that they need. However, assembling all the sections separately is expensive, so this is slower than compiling normally. Additionally, the size of the library itself (the .a file) can be a factor of 2 to 2.5 larger. We use this feature for building GHC’s libraries.

The GHC manual

无论您导入什么内容,这都会忽略您使用的库中未使用的部分。

您可能还有兴趣使用 shared Haskell libraries .

关于Haskell:模块导入带来不必要的二进制增长,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9198112/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com