AFAIK GHC 是当今最常见的编译器,但我也看到其他一些编译器也可用。 GHC 真的是适合所有用途的最佳选择吗?或者我可以使用其他东西来代替吗?例如,我读到某些编译器(忘记名字)在优化方面做得更好,但没有实现所有扩展。
GHC 是迄今为止使用最广泛的 Haskell 编译器,并且提供了最多的功能。 不过,还有其他选择,有时比 GHC 有一些好处。 这些是一些更流行的替代方案:
Hugs - Hugs 是一个快速高效的解释器(我认为它不包含编译器)。 它还以产生比 GHC 更容易理解的错误消息而闻名。
JHC - 整个程序编译器。 JHC 可以生成非常高效的代码,但它的功能还不完整(这可能就是您所想到的)。 请注意,它并不总是比 GHC 快,只是有时如此。 我没有太多使用 JHC,因为它没有实现我大量使用的多参数类型类。 我听说源代码非常清晰易读,使其成为一个很好的编译器。 JHC 也更方便交叉编译,通常会生成更小的二进制文件。
UHC - Utrecht Haskell 编译器对于 Haskell98 来说功能接近完整(我认为唯一缺少的是 n+k 模式)。 它实现了许多 GHC 最流行的扩展以及一些原始扩展。 根据文档,代码还不一定得到很好的优化。 这也是一个很好的编译器。
简而言之,如果您想要高效的代码和尖端的功能,GHC 是您的最佳选择。 如果您不需要 MPTC 或其他一些功能,JHC 值得尝试。 UHC 的扩展在某些情况下可能很引人注目,但我还不会指望它来实现快速代码。
因此,对于任何严肃的事情(例如非学术、非实验、非易失性或使用许多软件包),务实的选择是使用 GHC。
我觉得也值得一提nhc98。从主页上的简介:
nhc98 体积小,易于安装, 符合标准的编译器 Haskell 98,惰性函数 编程语言。这是非常 便携式,旨在生产小型 少量运行的可执行文件 的记忆。它产生中快 代码,编译本身就很简单 快速地。它还配备了广泛的 自动工具支持 汇编、外语 接口、堆和时间分析, 跟踪和调试。
截至 2011 年,对于日常编程来说,除了 GHC 之外确实没有其他选择。 HP 团队强烈鼓励所有 Haskell 程序员使用 GHC。
如果你是一名研究人员,你可能会使用 UHC,如果你使用的是一个非常奇怪的系统,你可能只有 Hugs 或 nhc98 可用。如果你是像我一样的复古迷,你仍然安装了 gofer、hbc 和 hbi:
$ hbi
Welcome to interactive Haskell98 version 0.9999.5c Pentium 2004 Jun 29!
Loading prelude... 1 values, 4 libraries, 200 types found.
Type "help;" to get help.
> help;
HBI -- Interactive Haskell B 1.3
hbi 很酷,因为 a) 它实现了 Haskell B,b) 它支持命令行的完整语言:
> data L a = I | X a (L a) deriving Show;
data L b = I | X b (L b) deriving (Show)
> X 4 (X 3 I);
X 4 (X 3 I)
即使 15 年后,编译器也能生成非常好的代码。
ghc 是一个可靠的编译器。说它是所有目的的最佳选择是非常有力的。寻找这样的工具是徒劳的。
使用它,如果您确实需要其他东西,那么到那时您可能会知道它是什么。