豆皮粉儿们,大家好呀。愉快的五一节就这么过去了,假期有没有好好游玩一番呢。今天由清风慕竹给大家带来一篇《如何用go实现一个js解释器》。
作者:清风慕竹
背景
前段时间在开发版本发布系统过程中,为了追求系统的灵活性,我们允许用户通过写js的方式生成json配置,业务上有定制的需求可以通过js代码来实现,这样在不调整底层系统的情况下可以尽可能的支持业务中的个性化需求。由于发布系统是用golang开发的,所以这里需要一个go版本的js解释器(不需要考虑gc、jit、inline-cache等复杂内容,只是一个简单的解释器的实现,可以解析并执行js即可),能够在golang应用中安全的运行js
代码。
实现思路
关于js解释器的实现其实已经有很多版本了,比如tinyjs(c++版本的实现)、tinyjs.py(py版本的实现)、还有若干用js自举实现的版本,比如eval5 。这些解释器实现思路大致如下:
其中转换步骤是可选的,这一步主要工作是将语法树上的节点转换成目标语言可执行的节点,对于eval5这种js-in-js的实现,这一步就不需要实现了。但是对js-in-x(x可能是go、c++、py)这种情况则需要增加转换的步骤。关于词法分析、语法解析这两块实现资料比较多,这里不再赘述,熟悉js的同学可以参考acorn、babel-parser、espree等实现,这里重点讲下转换和遍历执行的过