在 C 中,可以将代码拆分为“头文件”和实现,编译实现,然后仅分发编译后的版本和头文件(不是完整的源代码)。
这在 Haskell 中可行吗?
在 C 中,可以将代码拆分为“头文件”和实现,编译实现,然后仅分发编译后的版本和头文件(不是完整的源代码)。
这在 Haskell 中可行吗?
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 文件。
这样做是很有可能的。当 GHC 编译一个 Haskell 模块(即一个*.hs
文件)时,它会在一个目标文件中生成可执行代码*.o
,同时也是一个*.hi
“接口文件”。您只需要目标文件和接口文件即可使用编译后的代码。
然而,与 C 不同的是,Haskell 的运行时细节并没有正式标准化。因此,您不能将使用不同 Haskell 编译器编译的代码链接在一起;结果行不通。事实上,通常你甚至无法将使用不同版本的 GHC 编译的代码链接在一起。并不是说这样做有什么“不可能”,只是还没有人标准化这些东西,所以目前它不起作用。
最近,还可以将 Haskell 代码编译成“动态库”(Windows 上的 DLL,*.so
Unix 上的文件)。同样,您仍然需要*.hi
针对这些文件进行编译,但在运行时您只需要库文件本身。
请注意,GHC 倾向于进行大量跨模块优化,这在一定程度上降低了动态链接的实用性。(这有点像试图“编译”一个 C++ 模板库......)
如果您只是对人们看不到您的源代码或不必向最终用户提供 Haskell 编译器感兴趣,那么这些当然都不重要。