问题 为什么GHC与gcc和g ++一起分发?


在Windows上,GHC与gcc和g ++一起分发,例如下 ghc-7.6.3\mingw\bin。来自 下载页面,在Windows二进制下载中也注意到,Windows的构建“还包括对编译C ++文件的支持。”

我可以想象,分发这些编译器只是为了方便,因为Windows没有附带任何编译器。我也可以想象它是 必要 使用FFI,但我不是100%肯定。例如,虽然GHC将使用它自己的gcc / g ++编译器编译.c和.cpp文件,但GHC也是 提供选择 选择你想要的编译器和链接器。事实上,你可以指定自己的gcc / g ++,它似乎有效。您甚至可以通过预先编译.c / .cpp文件来进一步减少GHC的循环,并且仅调用GHC来编译Haskell代码并使用它将它们全部链接起来 -pgml (虽然整体效果与使用相同 -pgmc 和 -pgml)。

现在 似乎 工作,但它依赖于你指定的纯粹运气 -pgml 和 -pgmc 是一个与GHC的想法兼容的gcc版本?换句话说,当我使用FFI时,我真的只应该用GHC调用来编译和链接所有内容吗?


10543
2018-05-22 01:56


起源

使用GHC通常是最简单的方法。而且(我可能会弄错)如果我没记错的话,如果你尝试使用MSVC,那么事情就不会好起来了(而且我对Cygwin也存在问题的模糊记忆)。 - Daniel Fischer


答案:


GHC通常与许多/几个版本的GCC兼容(使用邪恶的mangler时会出现不兼容性)。

如果您尝试使用其他C编译器,您将遇到一些低级别问题(标志,asm格式)。

请注意,最近的GHC会弃用C后端而支持LLVM后端,这对于日常的Haskell开发来说有点没有用。


11
2018-05-22 14:22



因此,如果我围绕这个问题,“C后端”和“LLVM后端”(以及“本机代码生成器”)都会在为每个Haskell模块生成目标文件之前不久引用一个阶段。邪恶的管家只是C后端的一部分。排除C后端,可以预期GHC的目标文件(来自.hs文件)与GCC的目标文件(从.c / .cpp文件生成)的兼容性---对于某些未指定范围的附近GCC版本。但对于任何后端(包括LLVM?),如果使用非GCC编译器,则会遇到这些低级问题。 - Ein