Spidermonkey是火狐的js引擎。我曾经仔细比较过C++嵌入Spidermonkey和v8,最终因为对多线程并行比较执着,于是最终选择了Spidermonkey。网上流传的关于Spidermonkey引擎的用法大多还停留在1.8.5版本。随着更新迭代,高版本的js引擎更快更符合js标准也更好用,但相关资料比较少,官网文档更是惨不忍睹几乎和没有文档一样。

最近我接触到了devtoolset这个东西,所以产生了更新js引擎的想法。高版本的spidermonkey开始以来c++11了,目前centos6的默认g++只到4.4.7版本,这个g++能编译的最高版本的Spidermonkey是17。最近我尝试了编译gcc和devtoolset发现spidermonkey38也可以用(45~60我全都尝试过了,编译完动态链接后用不了,我没有仔细研究解决办法,只是把更新的目标选为38版本)。在琢磨38版本的过程中,为了方便喜欢火狐和js的人更好地了解这个引擎。我产生了一点点分享的想法,但也只有这一点点吧。

先分享一下代码,我不知道该怎么系统地解释清楚,有想要深入了解的朋友邮件我吧。lyramilk@qq.com。

主角17版本,这版本我在几亿pv的服务上面己经用了两三年了。但这版本Spidermonkey对于for-of的实现有点问题,17版本的for-of不是通过标准的Symbol.iterator符号实现的,而是通过名为iterator的函数,返回的结构也不太一样,终止条件是抛出StopIteration异常。

https://github.com/lyramilk/libmilk/blob/master/libmilk/src/linux/script_js17.cpp

38版本,我还没写完,所以也没上传。所以这个url暂时还是个假的。

https://github.com/lyramilk/libmilk/blob/master/libmilk/src/linux/script_js38.cpp

我自己的框架为了消除多种脚本引擎的区别,封装了一些内容。scriptengine.h是对脚本引擎封装类的一些统一管理。script_js.h就是具体到spidermonkey的封装了。我为了统一多种不同脚本引擎,封装了一个叫var的类。在参数传递和返回的时候,全都把脚本参数统一转换成了var,这牺牲了很多性能,但服务的性能瓶颈绝不可能在这里体现,所以也就欣然接受了。

这些代码里包含了js元素与c++数据结构互转,js异常在c++中处理,js对象携带c++信息,c++向js抛异常,c++对象支持js通过for-of访问,c++缓存js字节码以及通过字节码执行js等等。

还包括了两个需要解释的内容:

1,C++向js注入对象这个操作本身也比较消耗性能。我是在一个Context中注册了global对象,然后把c++方法注册给它。然后在实际执行脚本的时候,重新创建一个新的Context,然后把新Context的global对象的prototype设置为前面那个携带C++方法的global对象,这个原型跨越了Context,但它竟然没有问题(17和38版本都可以这样用)。这就使得Spidermonkey在独立的上下文中加载执行一个脚本的性能消耗非常低。

2,Spidermonkey Value的Private要求设置进去的指针的数值必须是偶数,如果把函数指针设置成Private有的时候是会出现问题的。

在38版本中,因为有Symbol的加入,很多实现起来都舒服多了。比如C++携带js数据时,就可以用Symbol属性,而不是像我17版本那样用了一个比较奇怪的普通属性来携带C++数据。

将JS嵌入C++ ————Spidermonkey引擎的使用相关推荐

  1. 在windows程序中嵌入Lua脚本引擎--编写自己的Lua库

    在<在windows程序中嵌入Lua脚本引擎--建立一个简易的"云命令"执行的系统>一文中,我提到了使用Lua的ffi库,可以让我们像写C代码一样写lua程序.这是个非 ...

  2. 在windows程序中嵌入Lua脚本引擎--建立一个简易的“云命令”执行的系统

    在<在windows程序中嵌入Lua脚本引擎--使用VS IDE编译Luajit脚本引擎>开始处,我提到某公司被指责使用"云命令"暗杀一些软件.本文将讲述如何去模拟一个 ...

  3. 在windows程序中嵌入Lua脚本引擎--使用VS IDE编译Luajit脚本引擎

    前些天听到一个需求:某业务方需要我们帮忙清理用户电脑上的一些废弃文件.同事完成这个逻辑的方案便是在我们程序中加入了一个很"独立"的业务逻辑:检索和删除某个程序产生的废弃文件.试想, ...

  4. Jade —— 源于 Node.js 的 HTML 模板引擎

    2013-12-11 发布 Jade -- 源于 Node.js 的 HTML 模板引擎 开源项目介绍 web 模板引擎 node.js jade 207.8k 次阅读  ·  读完需要 69 分钟 ...

  5. 如何把 Node.js 嵌入自己的项目中

    Node.js 不仅可以单独运行,还可以以库的方式被使用,本文介绍下如何把 Node.js 嵌入到自己项目中. 首先第一步下载 Node.js 源码,然后根据 Node.js 的文档进行编译安装.这样 ...

  6. 创业第22天,竞价助手嵌入jfreechart报表引擎

    创业第22天,竞价助手嵌入jfreechart报表引擎, 竞价助手具备了商业报表展现能力.

  7. 仿vue.js实现简单模板引擎(2kB)

    仿vue.js实现简单模板引擎(2kB) 点击预览 index.html <!DOCTYPE html> <html lang="zh-CN"> <h ...

  8. 用js写一个模板引擎

    模板引擎在前后端都能用到,但是通过作为前端,我们只需要一些简单的模板引擎. 先上代码: <code class="hljs xml has-numbering" style= ...

  9. js 嵌入php_PHP快速入门第一讲:什么是PHP

    快速入门第一步:了解语言. 要学习先了解.下面我来介绍一下PHP语言.首先我们来看最官方的解释[www.php.net]:PHP("PHP: Hypertext Preprocessor&q ...

最新文章

  1. 域控制器升级的先决条件验证失败新建_快应用开发工具升级v1.4.0
  2. bat脚本+vs2019编译openssl(x86 | x64) - (static | shared) - (debug | release)
  3. 绝地求生国际服服务器维护到几点,绝地求生更新维护到今天几点?更新内容详细介绍...
  4. SICP学习笔记(1.1.4~1.1.5)
  5. JS简单正则得到字符串中特定的值
  6. 又一游戏大盗(完美世界、跑跑等)SysInfo1.dll
  7. leetcode 834. 树中距离之和(dp)
  8. CSS3开发总结(圆角、盒阴影、边界图片)
  9. 20 行 Python 代码说清量子霸权!
  10. 洗礼灵魂,修炼python(8)--高效的字典
  11. 备战蓝桥杯—有边数限制的最短路 (bellman_ford+)——[AcWing]有边数限制的最短路
  12. Spring中都用到了哪些设计模式
  13. python九九乘法表矩形_用Python实现九九乘法表
  14. 【语音去噪】基于matlab小波软阈值语音降噪【含Matlab源码 531期】
  15. C++ 在.h文件中包含头文件和在.cpp文件中包含头文件有什么区别?
  16. 收入时间序列——之预测总结篇
  17. oracle加索引 oracle,Oracle索引创建及管理
  18. 采用Cordic算法求解atan反正切角度
  19. python是什么和c++是什么区别_编程c++和python的区别
  20. StratoVirt 中的 PCI 设备热插拔实现

热门文章

  1. Flash和E2PROM的区别
  2. 消防给水及消火栓系统技术规范_消防给水与消火栓系统知识点,你学会了没?...
  3. linux shell脚本学习指南,shell脚本学习指南[二](Arnold Robbins Nelson H.F. Beebe著)
  4. asp编程有用的例子
  5. ozon平台刊登上架很复杂?有哪些免费ERP系统支持呢
  6. Abaqus: 有限元模型基本操作
  7. 车队车载调频广播电台移动发射系统的设计与应用
  8. RoadFlow工作流使用快速入门
  9. 均值滤波、中值滤波的matlab实现
  10. SNMP 企业节点(Private Enterprise OID)大全及申请