從0開發3D引擎(七):學習Reason語言


大家好,本文介紹Reason語言以及學習Reason的方法。

上一篇博文

從0開發3D引擎(六):函數式反應式編程及其在引擎中的應用

下一篇博文

從0開發3D引擎(補充):介紹領域驅動設計

介紹Reason

Reason又叫Reasonml,是在Ocaml語言的基礎上修改而來,由Facebook ReactJs的開發組開發和維護。
Reason是函數式編程語言,由Bucklescript編譯器將其編譯為javascript語言。
Reason是專門提供給前端開發者使用的,相對於Ocaml,語法上與javascript更為接近。

Reason的優勢

1、從“發展前景”來說:
1)大公司Facebook出品,質量、穩定性、后續維護升級有保證
2)Reason是基於OCaml的,因此隨着Ocaml的版本更新,Reason和Bucklescript也會支持Ocaml的新特性
3)函數式編程越來越火,它也在3D引擎中越來越多地使用(如Frostbite公司提出的Frame Graph架構和Data Oriented思想都需要結合函數式編程)

2、從“性能”來說:
1)Reason支持mutable的操作和數據結構
可在性能熱點處使用它們,提高性能
2)對瀏覽器的JIT編譯友好,提升了運行時性能
因為Reason是強類型語言,所以保證了函數或數據結構的類型不變。這符合monomorphic,從而使瀏覽器的js引擎(如v8)在優化熱點代碼后,不會因為熱點代碼的類型改變而進行優化回滾。
3)BuckleScript對函數式編程做了很多優化(如對compose,curry等操作和immutable的數據結構做了優化,以及將尾遞歸函數優化為迭代操作),使我們可以放心地使用各種函數式編程的特性,丟掉低級別語法的優化負擔
4)BuckleScript的編譯速度非常快,使我們能一邊寫Reason代碼,一邊很快得到編譯后的js代碼

3、從“開發成本”來說:
1)支持跨平台,寫一次Reason代碼,可編譯為多種語言(當然,目前主要是編譯為js)
除了BuckleScript是編譯為js的后端,現在還有編譯為Native的后端
根據BuckleScript作者的消息(當WebAssembly遇到BuckleScript),未來可能支持編譯為.wasm.
2)強類型
Reason有比Typescript還要強的類型,從而在編譯時能檢查更多的錯誤。

參考作者的介紹:

更好的類型安全: typescript是一個JS的超集,它存在很多歷史包袱。而微軟引入typescript更多的是作為一個工具來使用的比如IDE的代碼補全,相對安全的代碼重構。而這個類型的准確從第一天開始就不是它的設計初衷,以至於Facebook自己設計了一個相對更准確地類型系統Flow. 而OCaml的類型系統是已經被形式化的證明過正確的。也就是說從理論上BuckleScript 能夠保證一旦編譯通過是不會有運行時候類型錯誤的,而typescript遠遠做不到這點

3)類型推導,很多類型不需要手寫,而是由Bucklescript幫我們推導
參考作者的介紹:

更多的類型推斷,更好的語言特性:用過typescript的人都知道,typescript的類型推斷很弱,基本上所有參數都需要顯示的標注類型。不光是這點,像對函數式編程的支持,高階類型系統GADT的支持幾乎是沒有。而OCaml本身是一個比Elm,PureScript還要強大的多的語言,它自身有一個非常高階的module system,是為數不多的對dependent type提供支持的語言,polymorphic variant。而且pattern match的編譯器也是優化過的。

4、從“生態”來說:
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?

1、學習Reason官方文檔,把Language Basics、JavaScript章節的內容看一遍;使用在線代碼編輯器寫Reason代碼,學習Reason語法

2、學習Reason的Examples項目,把代碼都看懂

3、參考從0開發3D引擎(三):搭建開發環境,搭建Reason的開發環境,開發自己的Reason項目
畢竟自己動手寫才能真正掌握。

4、進一步學習Reason
可以學習Bucklescript的文檔
可以學習官方資料->Articles & Videos
可以跟隨本系列的文章,學習如何用Reason寫3D引擎;
可以學習我們用Reason寫的開源3D引擎-Wonder.js和用Reason+Reason-React+Redux寫的開源編輯器-Wonder-Editor,學習如何使用Reason開發實際的項目。

5、有問題可以在官方論壇中尋找答案,或者加我們的QQ群(106047770)進行咨詢

介紹Reason的部分知識點

  • bsconfig.json

bsconfig.json是項目的配置文件,可參考Configuration,完整的配置描述在這里

值得注意的是:
編譯后的js文件只能在“lib/”這個文件夾中(因為配置文件不支持修改);
可以在“package-specs”字段中配置編譯后的js文件模塊規范(可以為CommonJS、ES6 modules、AMD)。在生產環境下,可以結合Webpack,將ES6 modules的js文件打包為一個文件。

  • FFI

Reason通過FFI與javascript交互。

相關介紹可參考External
更多語法可參考BuckleScript externals

Reason社區已經寫了很多FFI了,可在redex中找到。

  • Library

Reason通過FFI,可以引入js的庫;
而且Reason和Bucklescript也提供了API封裝,來操作Reason的數據結構(如List)和js的數據結構(如Array)

具體介紹可參考Libraries


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM