31

关于制作游戏服务器,Erlang 似乎总是作为一种“为这种事情而构建”的语言出现,它具有可扩展性和并发特性。我在 Haskell 和 Erlang 方面都没有经验,但从表面上看,它们似乎是一样的。查看 Haskell 的文档,它似乎支持多处理器可扩展性和并发性,据说 Haskell 是一种更可靠的语言,并且拥有明显更好的社区。那么,我的问题是,Haskell 是否被认为与 Erlang 所认为的服务器构建解决方案一样好?

4

8 回答 8

55

这取决于你想用你的服务器做什么。正如电信应用程序所期望的那样,Erlang 擅长以非常高的并发性执行简单的任务。如果您的服务器每秒或一次需要大量连接,Erlang 是您的朋友。Erlang 还为在多个服务器上分配负载提供了更好的支持。

Haskell 擅长复杂的符号计算,截至 2009 年 4 月,它还可以处理大量线程(参见下面的更新)。此外,Haskell 有更多工具可以正确处理复杂的代码:例如QuickCheckSmallCheck和静态类型系统。因此,如果您的服务器正在做复杂而有趣的事情,而您只需一台服务器就可以过关,那么使用 Haskell 可能会更好。


2009 年 4 月 13 日更新:可靠消息来源 Don Stewart 报告说“Glasgow Haskell 编译器中的最后一个线程缩放错误在几个月前就被压扁了”,并且一些用户报告说使用一百万个 Haskell 线程没有问题。截至 2009 年 1 月,实施者发表了一篇新的、未发表的论文,其中可能描述了如何实现这一目标。


2012 年 2 月 21 日更新:John Hughes 的公司QuviQ现在为 Erlang 制作 QuickCheck。他们发现了许多非常有趣的错误。您可以免费下载“QuickCheck Mini”;它与 Haskell QuickCheck 相当。还有一个更强大的商业版本。

于 2008-12-27T05:51:36.470 回答
10

这些论文的基准表明 Haskell 可以与 Apache 竞争:

在 Concurrent Haskell 中开发高性能 Web 服务器
— Simon Marlow

为可扩展的网络服务结合事件和线程:Monadic、应用程序级并发原语的实现和评估
— Peng Li Stephan A. Zdancewic(参见图 19)

于 2008-12-27T07:50:35.593 回答
9

我在 Haskell 和 Erlang 方面都没有经验,但从表面上看,它们似乎是一样的。

Haskell 和 Erlang 之间有一些非常明显的区别。Erlang 是专门为并发系统设计的。语言和虚拟机都被设计成支持很多很多的进程,Erlang 使用一个actor风格的系统来管理它们之间的通信。Haskell 也很容易支持并发,因为它的函数性质,但是在 Haskell 中进行并发编程仍然有点困难,并且语言没有专门设置来促进这一点。

与 Haskell 一样,Erlang 不会在进程之间共享状态,因此很容易编写多进程软件。但是 Haskell 和 Erlang 的编程风格有点不同,因为 Erlang 强调使用小进程来执行并发处理。

我喜欢 Haskell——它是我最喜欢的语言之一——但如果我要编写服务器软件,我可能会使用 Erlang。但是如果你更了解 Haskell 或者发现库支持更好的话,当然可以用 Haskell 编写服务器。

于 2008-12-27T15:10:11.133 回答
8

现在有一个新选项:使用 Haskell/Erlang FFI 在 Haskell 中编写逻辑并使用 Erlang 进行通信

于 2009-01-02T16:10:44.647 回答
7

上次我查看时,在 Erlang 中构建可扩展服务器的库和框架看起来比在 Haskell 中的要成熟一些。我建议查看Programming Erlang: Software for a Concurrent World以了解这些信息。

于 2008-12-27T05:56:05.993 回答
7

由于惰性,在 Haskell 应用程序中引入内存泄漏要容易得多。长时间运行的服务器正是那种你真的不希望有任何内存泄漏的程序。

虽然我同意 Haskell 是一种更可靠且更易于编程的语言,但 Erlang 更容易,并且有许多专门用于此类用途的库。

我认为没有与 Mnesia 等价的 Haskell,编写它会很困难。您可以编写 、 等的 Haskell 版本gen_servergen_event但它们在十多年内都没有经过优化和调整。

于 2008-12-27T13:56:00.223 回答
4

Haskell 是否与 Erlang 一样好取决于人们对一门语言的需求。我认为两者都可以作为游戏服务器做得很好,但这主要取决于您想要或期望从编程语言中获得什么。最容易注意到的区别之一是 Haskell 是一种具有类型推断的静态类型语言,而 Erlang 是一种动态类型语言。总的来说,我想说 Haskell 对那些不习惯函数式编程的人来说需要更多的“复杂性”。

于 2008-12-27T05:11:07.880 回答
2

我相信你能找到这样想的人,但我认为你对 Erlang 支持这种使用的能力是错误​​的;它广泛用于电话应用程序,实际上非常强大。Erlang 针对高度可靠、高并发的服务器进行了非常优化。

于 2008-12-27T04:27:37.357 回答