1. 程式人生 > >從0開發3D引擎(七):學習Reason語言

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

目錄

  • 上一篇博文
  • 介紹Reason
  • Reason的優勢
  • 如何學習Reason?
  • 介紹Reason的部分知識點

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

上一篇博文

從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)

具體介紹可參考Libra