目錄javascript
你們好,本文介紹Reason語言以及學習Reason的方法。html
從0開發3D引擎(六):函數式反應式編程及其在引擎中的應用前端
Reason又叫Reasonml,是在Ocaml語言的基礎上修改而來,由Facebook ReactJs的開發組開發和維護。
Reason是函數式編程語言,由Bucklescript編譯器將其編譯爲javascript語言。
Reason是專門提供給前端開發者使用的,相對於Ocaml,語法上與javascript更爲接近。java
一、從「發展前景」來講:
1)大公司Facebook出品,質量、穩定性、後續維護升級有保證
2)Reason是基於OCaml的,所以隨着Ocaml的版本更新,Reason和Bucklescript也會支持Ocaml的新特性
3)函數式編程愈來愈火,它也在3D引擎中愈來愈多地使用(如Frostbite公司提出的Frame Graph架構和Data Oriented思想都須要結合函數式編程)git
二、從「性能」來講:
1)Reason支持mutable的操做和數據結構
可在性能熱點處使用它們,提升性能
2)對瀏覽器的JIT編譯友好,提高了運行時性能
由於Reason是強類型語言,因此保證了函數或數據結構的類型不變。這符合monomorphic,從而使瀏覽器的js引擎(如v8)在優化熱點代碼後,不會由於熱點代碼的類型改變而進行優化回滾。
3)BuckleScript對函數式編程作了不少優化(如對compose,curry等操做和immutable的數據結構作了優化,以及將尾遞歸函數優化爲迭代操做),使咱們能夠放心地使用各類函數式編程的特性,丟掉低級別語法的優化負擔
4)BuckleScript的編譯速度很是快,使咱們能一邊寫Reason代碼,一邊很快獲得編譯後的js代碼github
三、從「開發成本」來講:
1)支持跨平臺,寫一次Reason代碼,可編譯爲多種語言(固然,目前主要是編譯爲js)
除了BuckleScript是編譯爲js的後端,如今還有編譯爲Native的後端;
根據BuckleScript做者的消息(當WebAssembly遇到BuckleScript),將來可能支持編譯爲.wasm.
2)強類型
Reason有比Typescript還要強的類型,從而在編譯時能檢查更多的錯誤。typescript
參考做者的介紹:編程
更好的類型安全: typescript是一個JS的超集,它存在不少歷史包袱。而微軟引入typescript更多的是做爲一個工具來使用的好比IDE的代碼補全,相對安全的代碼重構。而這個類型的準確從第一天開始就不是它的設計初衷,以致於Facebook本身設計了一個相對更準確地類型系統Flow. 而OCaml的類型系統是已經被形式化的證實過正確的。也就是說從理論上BuckleScript 可以保證一旦編譯經過是不會有運行時候類型錯誤的,而typescript遠遠作不到這點json
3)類型推導,不少類型不須要手寫,而是由Bucklescript幫咱們推導
參考做者的介紹:後端
更多的類型推斷,更好的語言特性:用過typescript的人都知道,typescript的類型推斷很弱,基本上全部參數都須要顯示的標註類型。不光是這點,像對函數式編程的支持,高階類型系統GADT的支持幾乎是沒有。而OCaml自己是一個比Elm,PureScript還要強大的多的語言,它自身有一個很是高階的module system,是爲數很少的對dependent type提供支持的語言,polymorphic variant。並且pattern match的編譯器也是優化過的。
四、從「生態」來講:
1)支持javascript的生態
Reason經過FFI(相似於Typescript的.d.ts)與javascript交互,支持引入js庫;
Reason支持按照多種模塊規範(能夠爲CommonJS、ES6 modules、AMD)來編譯js。
2)支持Ocaml的生態
Reason支持不少Ocaml的庫,而且能夠將Ocaml項目轉換爲Reason項目
參考資料
架構最快最好的To JS編譯器
如何評價 reasonml ? -> Wonder的回答
一、學習Reason官方文檔,把Language Basics、JavaScript章節的內容看一遍;使用在線代碼編輯器寫Reason代碼,學習Reason語法
二、學習Reason的Examples項目,把代碼都看懂
三、參考從0開發3D引擎(三):搭建開發環境,搭建Reason的開發環境,開發本身的Reason項目
畢竟本身動手寫才能真正掌握。
四、進一步學習Reason
能夠學習Bucklescript的文檔;
能夠學習官方資料->Articles & Videos;
能夠跟隨本系列的文章,學習如何用Reason寫3D引擎;
能夠學習咱們用Reason寫的開源3D引擎-Wonder.js和用Reason+Reason-React+Redux寫的開源編輯器-Wonder-Editor,學習如何使用Reason開發實際的項目。
五、有問題能夠在官方論壇中尋找答案,或者加咱們的QQ羣(106047770)進行諮詢
bsconfig.json是項目的配置文件,可參考Configuration,完整的配置描述在這裏。
值得注意的是:
編譯後的js文件只能在「lib/」這個文件夾中(由於配置文件不支持修改);
能夠在「package-specs」字段中配置編譯後的js文件模塊規範(能夠爲CommonJS、ES6 modules、AMD)。在生產環境下,能夠結合Webpack,將ES6 modules的js文件打包爲一個文件。
Reason經過FFI與javascript交互。
相關介紹可參考External
更多語法可參考BuckleScript externals
Reason社區已經寫了不少FFI了,可在redex中找到。
Reason經過FFI,能夠引入js的庫;
並且Reason和Bucklescript也提供了API封裝,來操做Reason的數據結構(如List)和js的數據結構(如Array)
具體介紹可參考Libraries