从0开发3D引擎(七):学习Reason语言

你们好,本文介绍Reason语言以及学习Reason的方法。html

上一篇博文

从0开发3D引擎(六):函数式反应式编程及其在引擎中的应用前端

介绍Reason

Reason又叫Reasonml,是在Ocaml语言的基础上修改而来,由Facebook ReactJs的开发组开发和维护。
Reason是函数式编程语言,由Bucklescript编译器将其编译为javascript语言。
Reason是专门提供给前端开发者使用的,相对于Ocaml,语法上与javascript更为接近。java

Reason的优点

一、从“发展前景”来讲:
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?

一、学习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)进行咨询

介绍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

相关文章
相关标签/搜索