CatCoding

BuckleScript and Reason

2017-09-17

BuckleScript

虽然我不是前端工程师,不过因为喜欢 OCaml,所以偶尔关注 BuckleScript 有一段时间了,今天又花时间看了看文档和代码。BuckleScript 是张宏波主导开发的开源项目,『有希望成为第一个完全由国人设计主导实现并被世界各地广泛使用的编译器』,不过是否能广泛被使用还得看后续推广。

简单来说 BuckleScript 是一个代码转换器,把你写的 OCaml 代码生成为纯 JS 代码。这样做的好处和必要性在于:

  1. JS 太牛了,这个跨平台语言正在吞噬着所有软件领域
  2. JS 太难维护了,大规模的 JS 代码更是噩梦。不管是从开发者角度和是从代码安全的角度,JS 需要类型!微软的 TypescriptFB 的 Flow ,甚至是Elm都是为了给 JS 带来类型。
  3. OCaml 类型系统稳定可靠,关键是编译器速度快,并且可以编译在多个平台上。

就我个人而言非常喜欢 OCaml,之前也有一些自己的小项目用过 OCaml。BuckleScript 从技术角度来说是非常好的,我看了一些生成的代码可读性比很多代码生成器要好。并且除了直接翻译代码,这个编译器也做了很多代码优化的工作,生成 size 更小,performance 更好的 JS 代码。遗憾的是目前还不支持 Core 这个库,我之前用 Core 比较多,ಥ_ಥ。

关于代码生成,想起我们原来做过的 Gorazor,从技术角度来说还是有些挑战的,不过从使用角度我个人持保留态度。代码生成毕竟会引入新的语法,我发现很多前端程序员其实并不怎么熟悉函数式编程那套,OCaml 的语法是否能在前端程序员中推广开来是个问题。BuckleScript 的文档有待改进,可以给更多大一点的完整的例子。

关于 BuckleScript 和 js_of_ocaml 的区别,从文档上来看 js_of_ocaml 可以把 bytecode 转换为 JS 代码,而 BuckleScript 是在从编译器里面的 rawlambda 生成代码,所以理论上来说 js_of_ocaml 对 OCaml 的兼容性更好,而 BuckleScript 能生成更可读的 JS 代码,目标在于兼容 npm 平台。

ReasonML

ReasonML的来由是之前我说的 OCaml 独特的语法,在很多人看来并不是很友好,所以 FB 的这群人做了一个更符合大众品位的方言。然后可以通过 BuckleScript 再翻译为 JS 代码。好绕啊!不过据说 FB 已经在生成环境使用这些了。ReasonML 的开发者移植了一个之前用 js_of_ocaml 写的mario 的例子,看了一遍觉得 reason 的语法其实改动并不大,可能对 JS 的程序员来说更友好吧。reason 和 OCaml 的关系类似于 Elixir 和 Erlang 之前的关系,为了讨好一类程序员,又为了利用一个已经非常成熟可靠的现有平台。

在 HN 上有一个比较老的讨论帖,有时间也可以再看看。

Why bucklescript matters for Javascript platform

公号同步更新,欢迎关注👻