在上周的nginx.conf 2015用户大会上,我们发布了全新的JavaScript引擎nginscript的预览版。历史上,JavaScript语言已经应用在许多方面,首先是作为客户端脚本,然后又被用于服务器后台开发。至于nginscript,我们要介绍的是第一种"代理端"的使用情况,用于满足我们在会上提出的一系列独特的要求。消息公布后,许多人对我们决定要实现一个新的JavaScript引擎,而不是使用V8,SpiderMonkey,或其他的已有引擎而感到好奇,所以这篇文章用于解释我们为什么这么做。

我们正在做什么?
我们正在编写自己的JavaScript引擎,称为nginscript。nginscript目前支持解析器ECMAScript 5的一个子集(我们将在未来进行扩展),采用基于寄存器的虚拟机(VM),运行时将把代码编译成字节码,同时支持 nginx和nginx plus。在目前的预览阶段,nginx可以编译JavaScript代码并用在两个场景:产生nginx的配置,或者在nginx执行阶段生成内容。未来的版本将支持更多的使用场景。

为什么要创建自己的JavaScript运行时?
Nginx有一些特别的需求导致我们要去创造属于我们自己的引擎。为了扩展请求应的处理流程,我们需要nginx在处理一个请求时可以运行nginscript片段。我们不寻求创造一个后端JavaScript应用程序执行环境–因为Node.js已经做的很好。目前的JavaScript引擎被设计为运行在一个Web浏览器中,他们依靠垃圾收集器的管理内存。如果耗尽内存,JavaScript VM会异常退出;这种行为对于浏览器是可以容忍的。但是对于持有数千个连接的服务器却不行,总的来说,专门为浏览器设计的引擎不适合服务器,包括v8,SpiderMonkey它们没有供简单的方法来控制执行(即预防奔溃和恢复虚拟机的机制),同时支持JIT的能力有限。我们希望能有一种引擎将nginscript的脚本简单并快速的执行。同时,由此产生的状态被保存在虚拟机外部。因为脚本简单,所以全面支持JavaScript语言没有必要。同时,nginx已经拥有非常精细的事件驱动架构,我们不想nginx的性能受到垃圾收器的影响。

相反,我们正在创建一个非常简单的引擎以满足我们的要求:
架构 – 使用单线程,字节码的执行部分将会非常快速。为每个请求分配虚拟机。因为没有复杂的状态需要初始化,这种简单的虚拟机可以快速启动,同时使用简单的缓存池管理内存。这种内存管理方案,无需跟踪和释放单个对象或使用垃圾回收器,可以大大提高性能。
辅助功能
–Nginx实现了许多内置操作。例如,复杂的数学运算,哈希函数,当nginscript与nginx结合时,这些操作也会是本地的。你可以使用nginscript以编程的方式来驱动nginx的本地方法。
和nginx配合
– nginx的事件驱动模型可以用于调度nginscript VMS的执行。当一个nginscript正在执行阻塞操作(如读取网络数据),nginx可以暂停该VM的执行,当该VM的事件完成后再恢复。这意味着你可以在编写一个简单的脚本, nginx会调度脚本不造成阻塞。最后,用我们自己的引擎,我们可以保证API统一,同时确保我们的VM和nginx支持的平台范围一致。

 

关于性能
现在谈论性能还过早,目前我们正在专注于功能的实现。nginscript编译为内部的字节码并且运行在一个基于寄存器的虚拟机;这种机制使得它和其他解释性语言(PHP,Ruby,等等)性能相当。所以为了提高性能,我们想在一些地方增加JIT编译,但这可能会限制支持的平台范围。nginscript只是被设计用来执行一些简单的内部脚本,我们不想让它来执行计算密集型操作,因为nginx内部基于C语言的模块已经解决这个问题。

未来
nginscript目前处于其发展的早期阶段,我们称当前版本是"预览"版。我们将重点放在核心语言的实现(如增加闭包),并实施许多内置的JavaScript对象(日期,数学,等等)。
我们还将重点放在如何整合资源,比如nginx的配置如何集成脚本,在哪些方面nginscript可以访问和控制nginx内部?如何在脚本之间共享数据,以及跨集群?用户如何调试nginscript脚本?
对于长时间运行的脚本(如WebSocket),我们甚至可以添加一个垃圾收集器,但那是在未来很久以后。
对于nginscript未来如何发展目前还没有定论。我们希望得到您的反馈。请在我们的邮件列表中分享您的想法和见解,我们将共同开发这个功能。谢谢你。

【译文】NginScript – 为什么我们要实现自己的JS引擎?的更多相关文章

  1. 理解Node.js(译文)

    前言 总括 :这篇文章十分生动形象的的介绍了Node,满足了读者想去了解Node的需求.作者是Node的第一批贡献者之一,德国前端大神.译者觉得作者的比喻很适合初学者理解Node,特此翻译. 译者 : ...

  2. Web前端开发推荐阅读书籍

    前言 前端工程师在中国兴起也就5年左右,以前公司里没有专门前端工程师的这个职位,很多前端方面的任务都是由全栈工程师来完成,有的基础一点的后台或者设计的帮助分担一些.但是随着互联网的快速发展,特别是所谓 ...

  3. 20个免费的 JavaScript 游戏引擎分享给开发者

    这篇文章收集了20个免费的 JavaScript 游戏引擎分享给开发者.这些游戏引擎能够帮助游戏开发人员更快速高效的开发出各种好玩的游戏. 使用 HTML5.CSS3 和 Javascript 可以帮 ...

  4. 淘宝前端工程师:国内WEB前端开发十日谈

    一直想写这篇"十日谈",聊聊我对Web前端开发的体会,顺便解答下周围不少人的困惑和迷惘.我不打算聊太多技术,我想,通过技术的历练,得到的反思应当更重要. 我一直认为自己是" ...

  5. Javascript开发之工具归纳

    写在前面 由于JS开发对我来说是全新的技术栈,开发过程中遇到了各种各样的框架.工具,同时也感叹一下相对于.Net的框架(工具框架以及测试框架等)JS框架真的是太丰富了.社区的力量果然强大---也是由此 ...

  6. 最新的JavaScript核心语言标准——ES6,彻底改变你编写JS代码的方式!【转载+整理】

    原文地址 本文内容 ECMAScript 发生了什么变化? 新标准 版本号6 兑现承诺 迭代器和for-of循环 生成器 Generators 模板字符串 不定参数和默认参数 解构 Destructu ...

  7. Web前端开发十日谈

    =========================================================================== 原文章: http://kb.cnblogs.c ...

  8. 十日谈 (share)

    @拔赤 一直想写这篇“十日谈”,聊聊我对Web前端开发的体会,顺便解答下周围不少人的困惑和迷惘.我不打算聊太多技术,我想,通过技术的历练,得到的反思应当更重要. 我一直认为自己是“初级”前端开发工程师 ...

  9. 【推荐】JavaScript的那些书

    又好久没写东西了,写上一篇的时候还以为接下来的工作会轻松一些,结果未从我所愿呐,又是一阵忙碌.而这段时间穿插着做了很多12年淘宝校园招聘的前端面试,很多同学都有问到,学校里没有前端的课程,那如何学习J ...

随机推荐

  1. 中断——中断描述符表的定义和初始化(二) (基于3.16-rc4)

    上篇博文对中断描述符表(IDT)中异常和非屏蔽中断部分的初始化做了说明,这篇文章将分析外部中断部分的初始化. 在上篇博文中,可以看到,内核在setup_once汇编片段中,对中断和异常部分做了初步的初 ...

  2. 【转载】linux strace

    简介 strace常用来跟踪进程执行时的系统调用和所接收的信号. 在Linux世界,进程不能直接访问硬件设备,当进程需要访问硬件设备(比如读取磁盘文件,接收网络数据等等)时,必须由用户态模式切换至内核 ...

  3. 【转载】sed命令详解

    [转载自]http://www.cnblogs.com/edwardlost/archive/2010/09/17/1829145.html   sed -i  把后面的操作后的文本输出回原文本   ...

  4. Linux shell 常用

    使用Linux shell是我每天的基本工作,但我经常会忘记一些有用的shell命令和l技巧.当然,命令我能记住,但我不敢说能记得如何用它执行某个特定任务.于是,我开始在一个文本文件里记录这些用法,并 ...

  5. [C语言 - 11] 语言编译执行

    使用gcc编译器 1.预编译 gcc -E Hello.c -o Hello.i 2.汇编 gcc -S Hello.i -o Hello.s   3.编译 gcc -c Hello.s -o Hel ...

  6. 4.22 注入js需要加 addjavascriptinterface

    由于项目需要,再次使用到了android的webview,webview要加载的页面是html5的页面: 需要有点击webview中的控件的交互,所以需要在android应用中注入一个js对象: 通过 ...

  7. Everything

    Everything,windows下做好用的搜索工具,速度特别快!下载地址:http://www.voidtools.com/ 快速下载地址:http://files.cnblogs.com/fil ...

  8. Winform- IrisSkin.dll轻松实现窗体换肤功能

    IrisSkin2.dll是一款很不错的免费皮肤控件,利用它可以轻松的实现winForm窗体换肤 然而IrisSkin2.dll只能在.NET Faremwork 4.0以及之前的版本使用,所以要在V ...

  9. 微软.NET各子技术领域的应用前景

    从2002年微软发布.NET 1.0,其间历经了8年的发展,再到.NET 4.0,其已经成为一个庞大而复杂的软件开发与运行平台,架构日益复杂,应用领域也在不断地扩展,包容了“一堆”的子技术领域. 在. ...

  10. Struts的类型转换

    struts中jsp提交的数据,struts会自动转换为action中的属性类型: 对于基本的数据类型以及日期类型会自动转换: 就像前面那一篇博客的代码封装一样,会把字符串类型传过来的数据转化为相应的 ...