Haskell 为什么GHC与gcc和g++;?

Haskell 为什么GHC与gcc和g++;?,haskell,ghc,ffi,Haskell,Ghc,Ffi,在Windows上,GHC与gcc和g++一起分发,例如在GHC-7.6.3\mingw\bin下。此外,还可以在Windows二进制下载下注意到,Windows的构建“还包括对C++文件的编译支持”。 我可以想象,分发这些编译器只是为了方便,因为Windows没有附带任何编译器。我也可以想象使用外国金融机构是必要的,但我不是100%确定。例如,尽管GHC将使用自己的gcc/g++编译器编译.c和.cpp文件,但GHC也可以选择您想要的编译器和链接器。事实上,您可以指定自己的gcc/g++并且它

在Windows上,GHC与gcc和g++一起分发,例如在
GHC-7.6.3\mingw\bin
下。此外,还可以在Windows二进制下载下注意到,Windows的构建“还包括对C++文件的编译支持”。 我可以想象,分发这些编译器只是为了方便,因为Windows没有附带任何编译器。我也可以想象使用外国金融机构是必要的,但我不是100%确定。例如,尽管GHC将使用自己的gcc/g++编译器编译.c和.cpp文件,但GHC也可以选择您想要的编译器和链接器。事实上,您可以指定自己的gcc/g++并且它似乎可以工作。您甚至可以通过提前编译.c/.cpp文件将GHC从循环中进一步切断,只需调用GHC编译Haskell代码并使用
-pgml
(尽管总体效果与使用
-pgmc
-pgml
相同)


现在这似乎是可行的,但您指定
-pgml
-pgmc
为gcc的一个版本,与GHC的想法兼容,这是否纯粹是靠运气?换句话说,当我使用FFI时,我真的应该只编译和链接GHC调用的所有内容吗?

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

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


请注意,最近的GHC不支持C后端而支持LLVM后端,这在日常Haskell开发中有一定的实际意义。

将GHC用于所有事情通常是最简单的方法。(我可能错了)如果我没记错的话,如果你试着使用MSVC,事情就不会太顺利了(我有一个模糊的记忆,Cygwin也有问题)。所以如果我把我的头脑放在这个问题上,“C后端”和“LLVM后端”(以及“本机代码生成器”)在为每个Haskell模块生成对象文件之前不久,它们都引用了一个阶段。邪恶的mangler只是C后端的一部分。除去C后端,可以预期GHC的对象文件(来自.hs文件)与GCC的对象文件(来自.C/.cpp文件)的兼容性——对于附近的一些未指定范围的GCC版本。但对于任何后端(包括LLVM?),如果使用非GCC编译器,都会出现这些低级问题。