[英]Haskell for a server?
關於制作游戲服務器,似乎Erlang總是作為一種“為這種東西而構建”的語言,具有可擴展性和並發性。 我沒有Haskell和Erlang的經驗,但從表面上看它們看起來是一樣的。 看看Haskell的文檔,似乎它支持多處理器的可擴展性和並發性,而Haskell被認為是一種更加可靠的語言,並且具有明顯更好的社區。 那么,我的問題是,Haskell被認為是像Erlang一樣的服務器構建解決方案嗎?
這取決於您想要對服務器執行的操作。 正如電信應用程序所期望的那樣, Erlang擅長以非常高的並發性執行簡單任務 。 如果您的服務器每秒鍾需要大量的連接,或者一次,Erlang就是您的朋友。 Erlang還為在多個服務器上分配負載提供了更好的支持。
Haskell擅長復雜的符號計算 ,截至2009年4月也可以處理很多線程(請參閱下面的更新)。 此外,Haskell有用於獲取復雜的代碼權更多的工具 :之類的東西快速檢查 , SmallCheck ,靜態類型系統。 因此,如果您的服務器正在執行復雜,有趣的事情,並且您可以只使用一台服務器,那么您最好使用Haskell。
2009年4月13日更新 :Don Stewart,一個可靠的消息來源,報告稱“幾個月前格拉斯哥Haskell編譯器中的最后一個線程擴展錯誤被壓扁了”,並且一些用戶報告使用了一百萬個Haskell線程沒有遇到麻煩。 截至2009年1月,有一篇來自實施者的新的未發表的論文可能描述了如何實現這一目標。
2012年2月21日更新 :John Hughes的公司QuviQ現在為Erlang制作QuickCheck 。 他們發現了許多非常有趣的錯誤。 您可以免費下載“QuickCheck Mini”; 它與Haskell QuickCheck相當。 還有一個更強大的商業版本。
這些論文的基准測試表明Haskell可以與Apache競爭:
在Concurrent Haskell中開發高性能Web服務器
- 西蒙馬洛
結合可擴展網絡服務的事件和線程:Monadic,應用程序級並發原語的實現和評估
- Peng Li Stephan A. Zdancewic(見圖19)
我沒有Haskell和Erlang的經驗,但從表面上看它們看起來是一樣的。
Haskell和Erlang之間存在一些非常明顯的差異。 Erlang專為並發系統而設計。 語言和虛擬機都旨在支持許多流程,而Erlang使用actor風格的系統來管理所有流程之間的通信。 由於Haskell的功能性,Haskell也很容易支持並發, 但在Haskell中進行並發編程仍然有點困難,而且語言沒有專門設置來促進這一點。
與Haskell一樣,Erlang不會在進程之間共享狀態,因此編寫多進程軟件很容易。 但是Haskell和Erlang之間的編程風格有點不同,因為Erlang強調使用小進程來執行並發處理。
我喜歡Haskell - 這是我最喜歡的語言之一 - 但如果我要編寫服務器軟件,我可能會使用Erlang。 但是,如果您更了解Haskell或者發現庫支持更優越,那么在Haskell中編寫服務器當然是可能的。
現在有一個新選項: 使用Haskell / Erlang FFI在Haskell中編寫邏輯並使用Erlang進行通信 。
上次我看,在Erlang中構建可伸縮服務器的庫和框架看起來比Haskell更成熟。 我建議查看編程Erlang:並發世界的軟件以獲取有關這些的信息。
由於懶惰,在Haskell應用程序中引入內存泄漏要容易得多。 長時間運行的服務器正是那種你真的不希望有任何內存泄漏的程序。
雖然我同意Haskell是一種更加可靠的語言並且編程更好,但是Erlang更容易,並且有許多專門用於這類用途的庫。
我不認為有一個Haskell相當於Mnesia,編寫它會很困難。 您可以編寫gen_server
, gen_event
等的Haskell版本,但它們將不會被優化和調整超過十年。
Haskell是否和Erlang一樣好的問題取決於人們對語言的期望。 我認為兩者都可以作為游戲服務器做得很好,但它主要取決於你想要或期望的編程語言。 需要注意的最簡單的差異之一是Haskell是一種帶有類型推斷的靜態類型語言,而Erlang是一種動態類型語言。 總的來說,我會說Haskell對於那些不習慣函數式編程的人來說需要更多的“復雜性”。
我相信你能找到那些這么認為的人,但我認為你錯了Erlang支持這種用法的能力; 它廣泛用於電話應用,實際上非常強大。 Erlang針對高可靠性,高並發性服務器進行了優化。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.