关于制作游戏服务器,似乎Erlang总是作为一种“为这种东西而构建”的语言,具有可扩展性和并发性。我没有Haskell和Erlang的经验,但从表面上看它们看起来是一样的。看看Haskell的文档,似乎它支持多处理器的可扩展性和并发性,而Haskell被认为是一种更加可靠的语言,并且具有明显更好的社区。那么,我的问题是Haskell被认为是像Erlang一样的服务器构建解决方案吗?
答案 0 :(得分:54)
这取决于您要对服务器执行的操作。正如电信应用所期望的那样, Erlang擅长执行具有高并发性的简单任务。如果您的服务器每秒钟需要大量的连接,或者一次,Erlang就是您的朋友。 Erlang还为在多个服务器上分配负载提供了更好的支持。
Haskell擅长复杂的符号计算,截至2009年4月也可以处理很多线程(请参阅下面的更新)。此外,Haskell还有更多用于获取复杂代码的工具:QuickCheck,SmallCheck和静态类型系统等。因此,如果您的服务器正在执行复杂,有趣的事情,并且您可以使用一台服务器,那么您最好使用Haskell。
更新2009年4月13日:Don Stewart,一个可靠的消息来源,报告说“几个月前格拉斯哥Haskell编译器中最后一个线程扩展错误被压扁了”,并且一些用户报告使用一百万个Haskell线程没有问题。截至2009年1月,有一个new, unpublished paper from the implementors可以描述如何实现这一目标。
2012年2月21日更新:John Hughes的公司QuviQ现在为Erlang制作QuickCheck。他们发现了许多非常有趣的错误。您可以免费下载“QuickCheck Mini”;它与Haskell QuickCheck相当。还有一个更强大的商业版本。
答案 1 :(得分:10)
这些论文的基准测试表明Haskell可以与Apache竞争:
Developing a high-performance web server in Concurrent Haskell
- 西蒙马洛
Combining Events And Threads For Scalable Network Services:
Implementation And Evaluation Of Monadic,
Application-level Concurrency Primitives
- Peng Li Stephan A. Zdancewic(见图19)
答案 2 :(得分:9)
我没有Haskell和Erlang的经验,但从表面上看它们看起来是一样的。
Haskell和Erlang之间存在一些非常明显的差异。 Erlang专为并发系统而设计。语言和虚拟机都旨在支持许多流程,而Erlang使用actor风格的系统来管理所有流程之间的通信。 Haskell也很容易支持并发,由于它的功能性,但是在Haskell中进行并发编程仍然有点困难,并且没有专门设置语言来促进这一点。
与Haskell一样,Erlang不会在进程之间共享状态,因此编写多进程软件很容易。但是Haskell和Erlang之间的编程风格有点不同,因为Erlang强调使用小进程来执行并发处理。
我喜欢Haskell - 这是我最喜欢的语言之一 - 但如果我要编写服务器软件,我可能会使用Erlang。但是如果您更了解Haskell或者发现库支持更优越,那么在Haskell中编写服务器当然是可能的。
答案 3 :(得分:8)
答案 4 :(得分:7)
上次我看,在Erlang中构建可伸缩服务器的库和框架看起来比Haskell更成熟。我建议查看Programming Erlang: Software for a Concurrent World以获取有关这些信息的信息。
答案 5 :(得分:7)
由于懒惰,在Haskell应用程序中引入内存泄漏要容易得多。长期运行的服务器正是那种真正不希望有任何内存泄漏的程序。
虽然我同意Haskell是一种更加可靠的语言并且更适合编程,但Erlang更容易,并且有许多专门用于这类用途的库。
我认为Haskell并不等同于Mnesia,编写它会很困难。你可以编写gen_server
,gen_event
等的Haskell版本,但它们将不会被优化和调整超过十年。
答案 6 :(得分:4)
Haskell是否与Erlang一样好的问题取决于人们对语言的要求。我认为两者都可以作为游戏服务器做得很好,但它主要取决于你想要或期望的编程语言。需要注意的最简单的差异之一是Haskell是一种带有类型推断的静态类型语言,而Erlang是一种动态类型语言。总的来说,我会说Haskell对那些不习惯函数式编程的人来说需要更多“复杂性”。
答案 7 :(得分:2)
我相信你能找到那些这么认为的人,但我认为你错误地认为Erlang支持这种用法的能力;它广泛用于电话应用,实际上非常强大。 Erlang针对高度可靠的高并发服务器进行了优化。