2

在 Haskell MPFR 绑定 HMPFR 的页面上,他们解释说,为了使用该库,必须重新编译 ghc 并进行修改——使用不同的整数库或重命名与 gmp 相关的一堆符号:

https://code.google.com/p/hmpfr/

https://code.google.com/p/hmpfr/wiki/GHCWithRenamedGMP

由于在 hmpfr 页面上没有规范的地方可以提问,我希望这里的人能够回答。这个问题的现状如何?上述修改使用 GHC 7.6.1 进行测试。在 GHC 7.8 中是否仍需要它们,在 7.10 中是否还需要它们?是否会修改 GHC 的正式版以修复此不兼容问题?

4

1 回答 1

2

根据GHC 7.10.1 的发行说明,依赖 GMP 的库不再需要特殊的 hack。

integer-gmp 包已经从头开始完全重写。这次重写的主要变化是链接到 GMP 的 GHC 编译程序不再“挂钩”GMP 分配例程,而是在原始 Haskell 堆上创建一个 Integer。相反,integer-gmp 现在在 Haskell 代码中分配所有内存,并像其他 C 代码一样通过正常的 FFI 导入与 GMP 对话。

这样做的实际副作用是绑定到 GMP(例如 MPFR 或 FLINT)的 C 库不再需要通过 FFI 在 GHC 编译的程序中使用仔细(或不可能)的 hack;GMP 与任何其他 C 库一样被处理,没有特殊的适应。

换句话说,IIUC,过去是Integer通过调用适当的 GMP 函数来创建 GHC 的,这些函数专门指示通过 GHC 分配内存。这是一个问题,因为任何其他创建 GMP 整数的库都会无意中让 GC 收集其整数。随着新的变化,GHC 自己为 Haskell 中的大整数分配内存,因此不再有任何与 GMP 的特殊交互影响 GMP 的其他用户。

于 2015-10-15T21:45:22.607 回答