大家好,本文介绍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)

具体介绍可参考Libraries

从0开发3D引擎(七):学习Reason语言的更多相关文章

  1. 从0开发3D引擎(一):开篇

    介绍 大家好,本系列带你踏上Web 3D编程之旅- 本系列是实战类型,从0开始带领读者写出"良好架构.良好扩展性.最小功能集合(MVP)" 的3D引擎. 本系列的素材来自我们的产品 ...

  2. 从0开发3D引擎(八):准备“搭建引擎雏形”

    大家好,现在开始本系列的第三部分,按照以下几个步骤来搭建引擎雏形: 1.分析引擎的需求 2.实现最小的3D程序 3.从中提炼引擎原型 4.一步一步地对引擎进行改进,使其具备良好的架构 5.实现与架构相 ...

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

    目录 上一篇博文 介绍函数式反应式编程 函数式反应式编程学习资料 函数式反应式编程的优点与缺点 优点 缺点 异步处理的其它方法 为什么使用Most库 引擎中相关的函数式反应式编程知识点 参考资料 大家 ...

  4. 从0开发3D引擎:目录

    介绍 大家好,本系列带你踏上Web 3D编程之旅- 本系列是实战类型,从0开始带领读者写出"良好架构.良好扩展性.优秀的性能.最小功能集合(MVP)" 的3D引擎. 本系列的素材来 ...

  5. 从0开发3D引擎(补充):介绍领域驱动设计

    我们使用领域驱动设计(英文缩写为DDD)的方法来设计引擎,在引擎开发的过程中,领域模型会不断地演化. 本文介绍本系列使用的领域驱动设计思想的相关概念和知识点,给出了相关的资料. 上一篇博文 从0开发3 ...

  6. 用函数式编程,从0开发3D引擎和编辑器(一)

    介绍 大家好,欢迎你踏上3D编程之旅- 本系列的素材来自我们的产品:Wonder-WebGL 3D引擎和编辑器 的整个开发过程,探讨了在从0开始构建3D引擎和编辑器的过程中,每一个重要的功能点.设计方 ...

  7. 用函数式编程,从0开发3D引擎和编辑器(二):函数式编程准备

    大家好,本文介绍了本系列涉及到的函数式编程的主要知识点,为正式开发做好了准备. 函数式编程的优点 1.粒度小 相比面向对象编程以类为单位,函数式编程以函数为单位,粒度更小. 正所谓: 我只想要一个香蕉 ...

  8. 从0开发3D引擎(二):准备预备知识

    大家好,本文介绍了开发3D引擎需要的预备知识,给出了相关的资源. 上一篇博文 从0开发3D引擎(一):开篇 了解Web 3D Web 3D的历史 目前Web 3D是基于WebGL这个Web端3D AP ...

  9. 从0开发3D引擎(五):函数式编程及其在引擎中的应用

    目录 上一篇博文 函数式编程的优点与缺点 优点 缺点 为什么使用Reason语言 函数式编程学习资料 引擎中相关的函数式编程知识点 数据 不可变数据 可变数据 函数 纯函数 高阶函数 柯西化 参考资料 ...

随机推荐

  1. VSCode提示没有权限,无法保存文件问题

    重装了系统之后,重新打开了VSCode发现无法保存修改的文件,激活系统后发现还是无法保存文件,都是提示权限问题,原因在于文件夹权限继承并不是我所登录的这个用户,接着我试着按照网上的方法,在文件夹后,右 ...

  2. 学习linux命令,看这篇2w多字的linux命令详解

    用心分享,共同成长 没有什么比每天进步一点点更重要了 本文已收录到我的github:https://github.com/midou-tech/articles/tree/master/docs/li ...

  3. codeforces -1214 E

    题目https://codeforces.com/problemset/problem/1214/E 就是得知奇数之间不产生影响,先造出一条链,再用偶数往里插就行.链要di从大到小排个序呀!! #in ...

  4. ELK学习实验001:Elastic Stack简介

    1 背景介绍 在我们日常生活中,我们经常需要回顾以前发生的一些事情:或者,当出现了一些问题的时候,可以从某些地方去查找原因,寻找发生问题的痕迹.无可避免需要用到文字的.图像的等等不同形式的记录.用计算 ...

  5. Linux 文件系统 -- inode 笔记

    什么是 inode inode 的定义:Unix 文件系统中的一种数据结构,用来存储文件的元信息数据   文件在硬盘中的存储是以"块"(block)为单位的,常见的块大小是 4k ...

  6. 非常完整的线性DP及记忆化搜索讲义

    基础概念 我们之前的课程当中接触了最基础的动态规划. 动态规划最重要的就是找到一个状态和状态转移方程. 除此之外,动态规划问题分析中还有一些重要性质,如:重叠子问题.最优子结构.无后效性等. 最优子结 ...

  7. 洛谷P1462 通往奥格瑞玛的道路 题解 最短路+二分答案

    题目链接:https://www.luogu.com.cn/problem/P1462 题目大意: 有 \(n\) 个点 \(m\) 条边,每个点有一个点权,每个边有一个边权.求所有长度不超过 \(b ...

  8. notpad++使用cmd的快捷键设置

    notepad++运行批处理的设置: 运行 --> 输入运行程序名"$(FULL_CURRENT_PATH)" --> 保存(自定义的快捷键即可运行)

  9. Scala:用于Java的轻量级函数式编程

    Scala为Java开发提供了轻量级的代码选项,但是学习过程可能会很艰难.了解有关Scala的知识以及是否值得采用. 基于Java的语言通常涉及冗长的语法和特定于领域的语言,用于测试,解析和数值计算过 ...

  10. mysql-5.7.9-winx64遇坑记

    昨天在mysql5.0上导入sql文件时,一直卡在一个地方报错,也没仔细分析,认为应该是mysql版本太低不支持这个语法而已.遂决心下载一个最新版本的mysql,却浑然不知前面无数的坑已经埋伏好了在等 ...