前端专家聊JS语言家族新成员——R&B

内容来源:2017年6月24日,百姓网前端工程师贺师俊在“腾讯Web前端大会 TFC 2017”进行《Start R&B》演讲分享。IT 大咖说作为独家视频合作方,经主办方和讲者审阅授权发布。

阅读字数:1355 | 4分钟阅读

摘要

相信大家对以CoffeeScript、TypeScript为代表的编译到JavaScript的语言已经不陌生。本次分享将介绍 JS 平台语言家族的重要新成员R&B——Reason(Facebook推出的OCamel语言的新语法和工具链)和BuckleScript(Bloomburg开源的OCamel到JS的高性能编译器)组合——并以代码实例来说明R&B的特点和优势。

R&B

我们今天要讲的R&B是Reason&BuckleScript。

What is reason?

Reason简单理解就是用一个比较接近JS的语法去解OCaml语言。

What is OCaml?

OCaml是ML语言家族的一员。F#是微软做的一个语言,F#和OCaml基本上是一样的,OCaml对Scala语言也有很多影响。Elm是前端的一个语言,有人发明了这个语言用来写前端。虽然用的人不多,但它还是颇具影响力的。Haxe是一个全栈的语言,也可以编译到JS。这些语言其实都受到了OCaml的影响。

Software written in OCaml

MirageOS是一个编程的框架,用一个语言去做操作系统的所有功能。

Flow是Facebook推出的可以给JavaScript标注类型的工具。

Infer和Flow非常相似,也是Facebook做的。它可以用于推断其它静态分析的工具。

Hack是加强版的PHP,增加了静态类型等等。Facebook主要代码都是用PHP写的,但PHP有很多缺点,所以Facebook自己研发了Hack。Hack语言的实现也是用OCaml写的。

Coq语言可以用作证明,我觉得这可能是将来编程的一个方向。

WebAssembly是在JS平台上类似于字节码的一个东西,现在浏览器都已经开始支持了,它可以允许其它语言直接编译到WebAssembly上,对JS的整个生态有着巨大的影响。

综上所述,我们发现OCaml这个语言比较有趣,有很多其它语言都是用OCaml写的。

前面提到很多语言都是Facebook做的,Reason也是。它的定义就是SYNTAX&TOOLCHAIN FOR OCAML。

What is BuckleScript?

BuckleScript就是把OCaml编译到JS的一个编译器。

What is R&B?

R&B实际上就是以近JS语法写OCaml程序并编译到JS。

Why another language?

Static Type

它的优点就是有静态类型。因为JS其实是一个动态类型语言,动态类型语言相当灵活,但“动态类型一时爽,代码重构火葬场”。

FP

另一个点就是函数式编程,函数式编程都是用React。后来在React的整个生态系统里面大家都会使用不可变的数据结构来获得更高的性能。

Ramda

当很多人开始在JS里面使用函数式编程的理念之后,也出现了一些很重要的库,比如Ramda,Sanctuary。

Problem

如果在JS中真的想要追求静态类型以及函数式编程,不一定能提高代码的可维护性。最主要的问题是JS本身缺乏静态类型、函数式编程语言级别的支持。

真·函数式语言

如果想在JS的生态里面使用函数式语言,最好使用真•函数式语言而不是用库。而真•函数式语言还有Elm、PureScript,都是在JavaScript里很常见的真•函数式语言。

Why OCaml?

OCaml是一个历史悠久的语言,它从发明到现在已经有三十年的历史,已经久经考验。它的规模、难度和复杂性都非常高了。

OCaml非常接近产业界,在产业界的应用有很多。所以这样的特点决定了如果你要选择一个函数式语言的话,OCaml是很好的选择。

OCaml默认是纯的,但也可以在里面做副作用。Strict这一点是严格求值的,以及它是一个静态类型的。尤其重要的一点是它是type infer,可以推断类型。

Why Reason?

Reason的语法更接近传统的编程语言,它的工具链也非常好用。

Why BuckleScript?

在BuckleScript之前也有其它的编译器可以把OCaml编译到JavaScript,而BuckleScript的出现有几个因素。

第一个就是BuckleScript的性能非常强大,在所有编译到JS的编译器中,BuckleScript有可能是最快的。这就是它的“快速编译”。

第二就是它的Runime很小,毕竟是其它语言,通常来说编译之后会引入这个语言完整的库,但是BuckleScript有比较好的优化,用到多少用多少。所以Runime带进来的库是很小的。

FFI是语言的外部接口,就是JS和OCaml怎样相互调用,这一点BuckleScript做得也是比较好的。

还有一点就是它生成的代码可读性非常高,意味着能更容易去debug它。

今天的分享就到这里,谢谢大家!

  • 发表于:
  • 原文链接:http://kuaibao.qq.com/s/20180125A0W58C00?refer=cp_1026

同媒体快讯

扫码关注云+社区