nginScript笔记

最近 nginx 团队宣布自己写了一个JS runtime,叫 nginScript,参见官方的介绍:https://www.nginx.com/blog/nginscript-why-our-own-javascript-implementation/

nginScript 是什么

nginScript 是一个JS runtime,也就是俗称的JS引擎,和V8做的是类似的事。目前他实现了一个 ES5的子集,它的代码会被编译成字节码,并且直接在nginx中执行。他用的是一个register-based virtual machine,关于这个VM并没有任何说明。

当前的版本是一个preview版本,nginx可以通过两种方式执行JS代码:

  1. 可以在nginx的配置中计算一些值
  2. 在nginx生成content的时候执行

为什么要再造一个 nginScript

Our goal is for nginScript snippets to be run when NGINX processes a request, in order to extend and inform the processing of requests and responses。

也就是说,nginScript的目的是在一个nginx请求中可以执行一些处理数据之类的操作,而不是想nodejs一样提供一个完备的持久运行的环境。

而为什么不直接用V8呢? 因为 V8 设计之初就是给浏览器中的,它的内存管理机制非常不可控,很容易因为内存溢出之类的问题导致进程终止。虽然对浏览器几乎没有影响,但是在需要长时间稳定运行的服务器来说这就是非常致命的。

nginScript主要希望能满足一下几个需求:

  1. 架构。 单线程,字节码的设计是为了保证能迅速初始化和销毁。每一个request都有自己一个独立的VM,所以可以以request为单位进行垃圾回收,一个request结束之后可以全部回收内存,并且这样可以使每个request都是独立的环境,不会因为一个request的问题导致全部request阻塞。

  2. 工具类。 nginScript提供很多常用的工具类,比如hash date等。并且都是调用native代码,所以速度很快。你可以认为nginScript就是一堆native方法的JS接口。

  3. 优先执行权。 nginScript会自动暂停那些阻塞操作的线程,比如一个线程发送一个同步的网络请求,nginScript会自动暂停这个线程,并且在请求成功的时候再通知他。这样可以用同步代码写出异步的效果,让代码更易读。

关于性能

nginScript现在是先编译成字节码,再在VM中执行字节码(很像JAVA)。他们也希望能增加JIT(即时编译)功能(不懂JIT的参见这里 https://en.wikipedia.org/wiki/Just-in-time_compilation )。现在的测试结果是,nginScript和其他的解释语言的性能相近,比如 PHP和Ruby。但是没有即时编译语言快。

并且nginScript的目的是在nginx中执行一些简单的内部操作和本地操作规则,而不是做一些需要大量CPU计算的事情,因为这些是C语言做的事。关键的性能是要优化的,但是不能简单的和JIT语言比性能。

未来

现在只是一个预览版,现在的主要精力是实现一些JS的核心功能,比如闭包,和一些常用的内建对象,比如 Date

后续的重点会放在 集成上:
- 如何用nginScript写nginx配置
- nginScript如何访问和控制nginx
- nginx 如何把相关数据传给 nginScript

我的一点理解

nginScript 虽然是一个runtime,但是其实它并不打算取代V8做后台的业务逻辑,它现在的中心主要是:

  1. 和nginx的无缝集成,互相访问和控制
  2. 优化性能,只专注于在nginx中执行简单的规则,比如调用一个C的时间模块,并不打算写复杂的业务逻辑。

相对于V8和Nodejs可以提供完善的ES实现和丰富的库,nginScript只是实现了JS中很小的一块内容。所以至少相当长的时间内,nginScript不会和V8有直接的竞争关系。

你可能感兴趣的:(js,nginx,javascript引擎,nginScript)