Haskell 生態系統狀態 —— 2015 年 8 月
在這個帖子中,我將盡我所知地講解 Haskell 生態系統的目前狀態及其在不同的編程領域及編程任務中的適應性。這個帖子的目的在于對 Haskell 優秀的地方廣而告之以討論其優點,同時強調 Haskell 我認為還有可以提升空間的地方以討論其不足。
這個帖子分成兩部分:第一部分涵蓋了 Haskell 在特殊的編程應用領域(也就是,服務器、游戲或者數據科學)的適用性;第二部分涵蓋了 Haskell 在普通的通用目的編程領域需求方面(比方說測試、集成開發環境(IDEs)或者并發)的適用性。
主題貫穿了最為優秀的方面到最為不足的方面。每個編程的領域又被總結為以下幾個級別的某一個單一的級別:
-
經典中最優秀的:在任何語言中都有最好的體驗
-
成熟的:適合大多數編程人員
-
不成熟的:只被早期的用戶所接受
-
差的:相當沒用處
排名越正我將更加愿意用在自然環境下成功的事例加以支持。排名越負我將更加提供 一些 怎樣提高自身的建設性意見。
負責聲明#1 : 顯然,我并不知道 Haskell 生態系統的所有的事情,因此,不管什么時候,為了能夠征求那些有更加豐富經驗的人的意見,我不能確保我作出的是一個在可變通范圍內的猜想還是清晰地陳述我所不確定的東西。我將 Haskell 生態系統很好地進行標號,就這一點這個帖子仍然拓展了我的知識。如果你認為我的任何一個排名是錯的,我會很高興的接受正確的排名順序(排名應該向上靠還是向下靠)
負責聲明#2:在書籍非常缺乏的部分我們會有一些“教育資源”,因為我并不熟悉電子書相關的資源。如果你有一些電子書添加的建議,請讓我們知道。
負責聲明#3:如果你還沒有從我的博客名字以及下面提及的幾個庫的作者的名字中發現我很明顯是 Haskell 的狂熱粉絲,因此我是相當偏心的。我已經作出了很大的努力在客觀評價這個語言,但是如果你發現我的偏心蒙蔽了我,請向我的排名提出質疑!我還在擴展鏈接部分明確的將推銷 Haskell 的言辭視作“廣告宣傳”。:)
目錄
-
應用領域
-
編譯器
-
服務器端網絡編程
-
腳本/命令行應用
-
數值編程
-
客戶端網絡編程
-
分布式編程
-
單機圖形界面編程
-
機器學習
-
數據科學
-
游戲編程
-
系統/嵌入式編程
-
移動app
-
-
普通編程需求
-
重構
-
類型系統
-
特定領域語言(DSLs)
-
測試
-
并發
-
數據結構和算法
-
基準管理
-
統一碼
-
語法清晰/代碼整潔
-
流編程
-
序列化/并行化
-
支持文件格式
-
包管理
-
日志
-
數據庫及數據存儲
-
集成開發環境的支持
-
應用領域
編譯器
級別:經典中最好的
Haskell 是一種發開屬于你自己的令人驚喜的語言。如果你準備用另外一種語言寫個編譯器,那么你應該真誠地考慮是不是換回來比較好。
Haskell 起源于學術界,很多起源于學術界的語言在編譯器相關的開發任務中都表現地很優秀,理由也很明顯。因此,這一語言擁有豐富的專注于編譯器相關開發任務的系統庫,比方語法分析,代碼整潔,統一化,約束變量,語法樹操作和優化。
那些未曾寫過編譯器的人都知道這實現起來有多難,因為需要操作非常弱類型數據(字符串和整型的樹和圖)。所以,從類型檢查到優化再到代碼生成,編譯器所做的每一件事都很大程度上會產生錯誤。鉭Haskell在這一點上表現的十分精彩,它有非常強的類型系統,這些類型系統有很多擴展能在編譯時間內大量的錯誤。
我還認為對編譯器開發人員來說,這里有很多優秀的教育資源,不管是文章還是書籍。我本人并不是總結所有教育資源的最為合適的人,但我卻是那個讀過高質量的資源的人。
最后,這里有很多會對其它語言的語法分析器和代碼美化器,你可以使用這些工具來寫出這些語言的編譯器或者用這些語言來寫編譯器。
突出的庫:
-
parsec attoparsec trifecta alex + happy -語法分析庫
-
bound -操作約束變量
-
hoopl - 優化
-
wl-pprint ansi-wl-pprint -代碼美化
-
llvm-general LLVM API
-
語言-{ javascript | python | c-quote | lua | java | objc } - 會對其它語言的語法分析器和代碼美化器
使用Haskell來寫的一些編譯器:
-
Elm
-
Purescript
-
Idris
-
Agda
-
Pugs(Perl 6的第一版實現)
-
ghc(自托管)
-
frege(和Haskell很像也是自托管)
教育資源:
服務器端編程
評級:成熟
Haskell 第二強項就是后端編程,包括 web 應用程序和 web 服務。Haskell 語言的主要特性如下表:
-
服務穩定
-
高效
-
簡單易用的并發編程
-
對 web 標準的良好支持
強類型系統和簡練的運行時大大的提高了服務器的穩定性和易用性。這就是 Haskell 和其它后端語言的最大區別,因為它很大程度的減少了執行花銷。與其它類型的語言,尤其是靜態類型語言相比,維護基于 Haskell 語言編寫的服務需要的程序員更少。
</div> </div>然而,服務器穩定最大的缺點是空間泄漏。我知道最為常見的解決方法是使用 ekg(一個進程監視器)在毀壞其結果之前檢查服務器內存的穩定性。第二種解決方法是學會運用經驗來檢查和防止內存泄漏,這種方法并不像人們想的那樣難。
Haskell 的表現是很優秀的可與當前的 java 相媲美。對于新手和老手來說這兩種語言表現的都差不多,雖然理由不盡相同。
Haskell 在使用性方面優異之處在于它運行時支持下列特性:
-
輕量級線程加強(這 一點 Haskell 與 JVM 不同)
-
軟件內存交互(這一點 Haskell 與 Go 不同)
-
垃圾回收(這一點 Haskell 與 Rust 不同)
很多語言支持上述特性的兩種,但是據我所知,Haskell 是唯一一種上述三點特性全支持的語言。
如果你從沒有用過 Haskell 軟件交互內存,你真的真的應該嘗試一下,因為它排除了大量并發邏輯缺陷。STM 是一個遠遠被低估了的 Haskell 運行時的特性。
顯著的類:
-
scotty- 和 Ruby 的 Sinatra 相似的對新手友好的服務器框架
-
servant/ servant-* - 這是一種可能讓你癡狂的服務框架
-
authenticate / authenticate-* - 共享認證庫
-
stm -軟件交互內存
一些被Haskell加強了的網站和服務:
-
非死book 的垃圾郵件過濾器:Sigma
宣傳:
-
Fighting spam with Haskell - Haskell in production, at scale, at 非死book
-
instantwatcher.com 作者對以 Haskell 代替 Ruby 進行重寫的評論
教育資源:
腳本/命令行應用
等級:成熟
作為腳本語言 Haskell 最大的優勢在于它是一種被廣泛采取的支持全局類型推斷的語言。很多語言都支持局部類型推斷(比如 Rust,Go,Java,C#),這意味著函數的形參和接口一定要被聲明而其它的東西都能被推斷出來。在 Haskell 中你可以省略所有的東西:所有的類型和接口全部都可以由編譯器推斷出來(會有些警告但這是次要的)。
全局類型推斷使得 Haskell 感覺是一種腳本語言但同時能夠提供靜態安全性的保證。腳本類型安全性對企業開發環境尤其重要,在這種環境下,運行時被提高了特權的粘合性腳本語言在這些軟件架構中是最為弱的一點。
來自: http://www.oschina.net/translate/state-of-the-haskell-ecosystem-august-2015