gpt4 book ai didi

haskell - 显式导入是否能够减少编译文件的大小?

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

我会询问有用性。这是关于对编译的可执行文件/库大小的影响。与代码的可维护性或可读性无关。

导入特定模块

从包中导入唯一使用的模块而不是导入主模块(主模块本身导入子模块)是否有用。

例如,使用 Foreign 模块(仅包含导入列表):

import Foreign.Storable

而不是:

import Foreign

显式导入函数/类型

仅导入使用的函数/类型而不是导入整个模块有用吗?

例如:

import Foreign.ForeignPtr (ForeignPtr, mallocForeignPtr, withForeignPtr)

而不是:

import Foreign.ForeignPtr

最佳答案

如果模块被编译为目标文件,则不会,甚至在理论上也不会。无法导入的函数仍然可以在内部使用,您可以在GHCI中加载模块并测试未导出的内部函数。

如果您静态链接或使用通用函数的特定实例,那么理论上编译器应该能够分析该特定程序无法访问库的哪些部分,并作为整个程序优化,将它们删除从可执行文件中。 (例如,如果您的程序使用的唯一列表是 Int 列表,则编译器可能仅编译泛型函数的部分专用 [Int] 版本,并且仅编译)但是,无论您如何声明导入和导出,它都应该能够执行与整个程序优化相同的静态分析。

编译动态库时,理论上可以排除静态分析证明通过导出接口(interface)的任何可能调用永远无法直接或间接访问的代码路径或数据。如果是这样,编译器可以使用导出列表来证明库中的某些标识符完全无用,并将其从编译的库中删除。

如果您问某些特定编译器(例如 GHC 8)的功能,我不知道。您必须对其进行测试并查看。

专门列出导出和导入的主要好处是,多年后,当第二个模块声明您已经在使用的标识符时,您永远不会遇到麻烦。我以前也遇到过这种情况,现在我小心多了。

关于haskell - 显式导入是否能够减少编译文件的大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48034774/

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