9

在 C 中,可以将代码拆分为“头文件”和实现,编译实现,然后仅分发编译后的版本和头文件(不是完整的源代码)。

这在 Haskell 中可行吗?

4

2 回答 2

8

GHC 允许这样做,但当然您的代码将绑定到特定的二进制平台。

在这里检查:

http://www.haskell.org/ghc/docs/2.10/users_guide/user_174.html

或更多更新的解释:

http://www.haskell.org/ghc/docs/7.0.3/html/users_guide/separate-compilation.html

特别是,查找 .hi 文件。

于 2012-11-12T07:41:43.213 回答
1

这样做是很有可能的。当 GHC 编译一个 Haskell 模块(即一个*.hs文件)时,它会在一个目标文件中生成可执行代码*.o,同时也是一个*.hi“接口文件”。您只需要目标文件和接口文件即可使用编译后的代码。

然而,与 C 不同的是,Haskell 的运行时细节并没有正式标准化。因此,您不能将使用不同 Haskell 编译器编译的代码链接在一起;结果行不通。事实上,通常你甚至无法将使用不同版本的 GHC 编译的代码链接在一起。并不是说这样做有什么“不可能”,只是还没有人标准化这些东西,所以目前它不起作用。

最近,还可以将 Haskell 代码编译成“动态库”(Windows 上的 DLL,*.soUnix 上的文件)。同样,您仍然需要*.hi针对这些文件进行编译,但在运行时您只需要库文件本身。

请注意,GHC 倾向于进行大量跨模块优化,这在一定程度上降低了动态链接的实用性。(这有点像试图“编译”一个 C++ 模板库......)

如果您只是对人们看不到您的源代码或不必向最终用户提供 Haskell 编译器感兴趣,那么这些当然都不重要。

于 2012-11-13T21:42:19.717 回答