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

Jos*_*ine 8 haskell

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

import Mymodule
import qualified Mymodule as M
import Mymodule (MyDatatype)
Run Code Online (Sandbox Code Playgroud)

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

在我的具体情况下,我在Mymodule中有一个巨大的Map,我没有在Main模块中使用它.有选择地导入我真正需要的东西,并没有改变编译二进制文件的增长.

ehi*_*ird 17

就GHC而言,导入列表仅用于提高可读性和避免名称冲突; 它们根本不影响与之相关的内容.

此外,即使您只从库中导入了一些函数,它们仍然可能在内部依赖于库的大部分,因此您不一定希望通过仅使用某些可用接口来减小大小.

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

-split-objs

告诉链接器将通常生成的单个目标文件拆分为多个目标文件,每个顶级Haskell函数一个或模块中的类型.这只对库有意义,它意味着链接到库的可执行文件较小,因为它们只链接到它们需要的目标文件.但是,单独组装所有部分是昂贵的,因此这比正常编译要慢.此外,库本身的大小(.a文件)可以是2到2.5倍.我们使用此功能来构建GHC的库.

- GHC手册

这将省略您使用的库的未使用部分,无论您导入什么.

您可能还对使用共享Haskell库感兴趣.