Yukang's Page

BuckleScript and Reason

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

发表评论

《深度工作-如何有效使用每一点脑力》读后

深度工作这本书主要讲解了一些时间和精力管理方面的东西,人到了一定年龄就会觉得时间不够用,日子过得太快,每天觉得都没干什么就过去了。工作几年后这种感觉时不时袭来。反而是如果某段时间一直有一个阶段性的目标,就会觉得很踏实,进度和效率也可以。那种完全沉浸在思考中的状态真的也并不是累,相反所得到 .....
阅读全文

Kong的0.11.0版本

Kong发布了新的版本0.11.0,从这里开始区分了社区版本和商业版。这次改动比较大的是丢弃了serf,这样整个Kong节点之间的缓存同步方式变化了。开发者给出的理由如下: 依赖serf,serf并不属于Nginx/OpenResty 这种依赖相互间通信来同步的机制对于deploym .....
阅读全文

Lua时间处理

我需要用Lua处理一个与时间相关的问题,比如我们在配置文件里面配置一个日期(北京时间),然后在Openresty里面判断当前时间是否在这个日期之前或者之后来做对应的逻辑。 Lua的时间处理还有点麻烦,主要是自带的相关库函数比较少。 os.time() &l .....
阅读全文

使用 exercism 来练手学语言

有时候我们想学一门编程语言,但是光看看书和代码用例总是找不到感觉,这时候我们应该尝试写点不短不长的程序片段,可能是一个函数,或者是实现一个简单的算法。最近我发现这个叫做exercism.io的网站不错,自己也在闲余时间在上面看看。 这里支持30多种编程语言,每种语言大概有80个左右的小问 .....
阅读全文

从 Jekyll换成Hexo

昨天看到自己的 Blog 在移动端显示丑死了,所以想着优化一下,找一个 mobile first 的风格试试。顺便把 blog 从 jekyll 换成了 Hexo。最后找到这个 hexo 的主题非常顺眼,便拿来用了,感谢yanm1ng为大家提供如此优秀的主题。回想起自己之前用过搜狐博客, .....
阅读全文

Kong源码分析: 事件

Kong的缓存更新很多依赖于事件,而事件看起来是相对来说比较复杂、也是最有趣的一部分。 worker模型假设我们对Kong做了一个更改的请求,这个请求通常是通过admin_api这个路由处理的。也就是说最终执行数据库操作的动作是在一个Nginx worker进程里。因为操作了数据库所以我 .....
阅读全文

Kong源码分析: 缓存

Nginx里的缓存使用在Kong里面我们缓存的内容大部分是配置,不管是API本身的配置还是插件相关的配置,缓存之后就存储在内存中。 Kong里的缓存基础代码在tools/database_cache.lua文件里面。这里又分两种类型的缓存,一种是shared dict, 一种是使用lua .....
阅读全文

Kong源码分析: 插件

插件的强大之处在我自己使用 Kong 的过程中,最方便的还是在于 Kong 的强大的插件机制。 Nginx 本身提供了提供模块开发机制,但是相对来说更底层一些,并且需要使用 C/C++ 来开发,对于很多开发人员来说 Nginx 仍为一个黑盒。OpenResty 集成了很多好用插件,并提供 .....
阅读全文

Kong源码分析: 启动

Kong的初始化过程安装好Kong之后我们是用命令sudo ./bin/kong start -c kong.conf -vv来启动。其中kong.conf为配置文件,-vv选项打印出一些重要信息展示出来,方便发现问题。 可以看到./bin/kong是一个脚本,是用的#!/usr/loc .....
阅读全文
Prev Next