原文: http://www.infoq.com/news/2014/09/purescript-haskell-javascriptjavascript
PureScript 是一門編譯到 JavaScript 的強類型靜態類型語言.
它的功能受到 Haskell 的激發, 而且使用 Haskell 編寫, 其目標是:
"編譯到 JavaScript 同時保持清潔跟可讀" 並且根據 PureScript 做者 Phil Freeman 所說,
PureScript 具有跟其餘編譯到 JavaScript 的語言相互操做的能力.java
PureScript 繼承了 Haskell 當中一些突出的功能, 其中有:node
根據 Phil 所說, 互操做性是 PureScript 的另外一個優點.
PureScript 提供了引用已有的 JavaScript 代碼機制,
經過提供其數據和函數的類型, 而後做爲正常的 PureScript 代碼使用.
這樣 PureScript 就有可能在應用的局部使用, 項目自己能夠是 JavaScript 或者其方言.git
InfoQ 跟 Phil Freeman 作了訪談來深刻了解這門語言:github
能夠解釋一下爲何你要創造 PureScript 嗎? 主要的動機和目標是什麼?spring
我是一年前開始 PureScript 項目的, 那時我在進行一箇中等的 JavaScript 應用,
那個項目後來用 TypeScript 重寫了. 用 TypeScript 不少時候生成力是很高的
只是應用中一小部分我以爲用強類型系統會帶來更多的好處.
那時已經有不少編程語言提供了頗有表達能力的類型系統,
但是, 沒有一個同時能結合我想要的其餘功能一塊兒使用.
更準確地說, 我想要一門 Haskell 語法的語言, 能生成乾淨可讀的 JavaScript,
只是不須要 Haskell 那樣一個運行環境.
我知到若是我開始本身寫編譯器的話後面我就是要在 Haskell 設計這門語言,
可是我決定了, 只想要 Haskell 當中簡單的部分來實現 PureScript,
由於我想要吸引更多的編譯器開發者.
考慮這一點, 這個項目已經成功了, 由於編譯器如今有了很棒的開發者社區.npm
PureScript 的主要功能是什麼?編程
一套簡單的 FFI, 表達能力強的類型系統, 有規律的生成代碼.
簡單說就是 PureScript 提供了"更好的環境的寫有規則的 JavaScript"後端
能不能總結下 PureScript 帶來的比原生 JavaScript 好的地方?數據結構
一個巨大的好處是所以可以自信地重構巨大的代碼庫而不破壞已有的功能.
當你決定使用純函數式編程以後 - 純函數, 不可變數據類型, 明確的反作用, 這些
你就能夠在編譯器的協助下強力地重構你的代碼.
另外一個好處是類型系統的表達能力, 能開發者能更多屬性的斷言,
這在目前單純 JavaScript 的工具來講是難以作到的.
好比說構造 DSL 讓它的數據類型在結構上就保證正確,
好比: 二叉樹被保證是平衡的, HTML 節點保證有正確的屬性, 等等
同時這能夠是一套漸變的方案, 不須要依賴特定的 IDE.
最終 PureScript 這樣的語言實現了強大的抽象能力, 其餘語言沒法達到,
包括參數化的多態(?parametric polymorphism), 高階函數, 類型類等等工具.
PureScript 集成了 Haskell 當中一些功能, 好比類型推斷, 類型類等等
這兩門語言差異最大是在哪裏?
簡單說 PureScript 選用了 Haskell 的語法, 但在語意方面源自 JavaScript.
好比 PureScript 是非惰性求值的, 這個就不像 Haskell.
還有 PureScript 只是在單根函數的層面進行了尾遞歸優化,
就有必要注意 Haskell 經常使用風格在這裏會棧溢出(好比 monadic recursion).
類型系統中也有一些重要的去寫.
PureScript 受 Haskell 影響有一些不錯的功能(好比多參數類型類, rank-N types),
但也有不少 Haskell 功能咱們是沒有的(type families, polykinds, datakinds 等等).
也有些新奇功能是 PureScript 有但 Haskell 沒的(extensible records 和 extensible effects)
你怎麼對比 PureScript 和其餘 Haskell 編譯 JavaScript 方言, 好比 UHC, ghcjs?
不少 Haskell 類的 Altjs 語言, 好比 Fay, Haste, GHCJS,
它們但願的是編譯 Haskell 的子集到 JavaScript, 保留 Haskell 的語義.
這個想法很棒, 由於有大量的 Haskell 代碼那樣就能在 JavaScript 代碼中重用.
PureScript 不是 Haskell 的子集, 而是採用了 JavaScript 的語義.
不過好處是 PureScript 的 FFI 很好用, 咱們很容易集成已有的 JavaScript 模塊.
好比說那些 npm 當中已經提供了的模塊. 這帶來了不同的開發模式.
PureScript 內在當中更接近 Roy 或者 JMacro 這樣的語言.
實際上 Roy 很大地影響了 PureScript 的設計.
Elm 是另外一個有趣的 Haskell 方言.
Elm 主要是實現了純函數編程, 以及 FRP, 用來實現交互式的 Web 應用.
能簡短分享一下 PureScript 將來的想法嗎? roadmap 上有什麼?
咱們目前專一於發佈下一版的編譯器管工具,
但願能包含二進制發佈文件, 針對三個主要的平臺.
咱們也花了很多時間開發一個自舉的 PureScript 編譯器.
若是能用npm install purescript
安裝編譯器就很讚了.
下一個版本以後, 咱們就能考慮一下不少有意思的功能, 好比:
type wildcards, 模版元編程, idiom brackets 還有 sourceMaps.
還有一些興趣在於不一樣的編譯器後端, 加上最近的 Lua 後端,
也有一些討論是關於可能會有的 Python 後端的.
固然, 咱們也不缺各類有趣的類庫跟工具去寫. 開發者社區很熱情,
任何有興趣貢獻的人均可以看咱們 Freenode 上的 #purescript 頻道.
PureScript 是個開源項目, 預編譯的二進制文件也支持 Linux.
兩份適合開始學習這門語言的資源是Phil Freeman 寫的Leanpub 的電子書,
還有網頁版的 Try PureScript, 不用安裝就能夠嘗試這門語言.