【问题标题】:Why is GHC distributed with gcc and g++?为什么 GHC 与 gcc 和 g++ 一起分发?
【发布时间】:2013-05-22 01:56:24
【问题描述】:

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

我可以想象分发这些编译器只是为了方便,因为 Windows 没有附带任何编译器。我也可以想象使用 FFI 是必要的,但我不能 100% 确定。例如,虽然 GHC 会使用它自己的 gcc/g++ 编译器来编译 .c 和 .cpp 文件,但 GHC 也可以provides options 选择您想要的任何编译器和链接器。事实上,你可以指定你自己的 gcc/g++ 并且它似乎工作。您甚至可以通过提前编译 .c/.cpp 文件将 GHC 进一步从循环中移除,并且只调用 GHC 来编译 Haskell 代码并使用 -pgml 将其全部链接(尽管整体效果与使用-pgmc-pgml)。

现在 似乎 可以工作了,但是你指定 -pgml-pgmc 是与 GHC 所想的兼容的 gcc 版本是否完全依赖于运气?换句话说,当我使用 FFI 时,我真的只应该编译和链接所有与 GHC 调用的东西吗?

【问题讨论】:

  • 对所有事情都使用 GHC 通常是最简单的方法。而且(我可能记错了)如果我没记错的话,如果您尝试使用 MSVC,事情就不会很好地工作(而且我模糊地记得 Cygwin 也有问题)。

标签: haskell ghc ffi


【解决方案1】:

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

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

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

【讨论】:

  • 因此,如果我对此有所了解,那么“C 后端”和“LLVM 后端”(以及“本机代码生成器”)都指的是在生成目标文件之前不久的一个阶段对于每个 Haskell 模块。邪恶的 mangler 只是 C 后端的一部分。排除 C 后端,可以预期 GHC 的目标文件(来自 .hs 文件)与 GCC 的目标文件(从 .c/.cpp 文件生成)的兼容性——对于附近的一些未指定范围的 GCC 版本。但是对于任何后端(包括 LLVM?),如果您使用非 GCC 编译器,就会遇到这些低级问题。
猜你喜欢
  • 2023-01-27
  • 2011-07-07
  • 2010-10-14
  • 2011-08-16
  • 2017-07-16
  • 1970-01-01
  • 2010-09-15
相关资源
最近更新 更多