将JS嵌入C++ ————Spidermonkey引擎的使用「建议收藏」

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

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

     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++数据。

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/181263.html原文链接:https://javaforall.net

(0)
上一篇 2022年10月16日 下午7:00
下一篇 2022年10月16日 下午7:16


相关推荐

  • HTML 打开新页面 关闭,javascript打开新窗口同时关闭旧窗口

    HTML 打开新页面 关闭,javascript打开新窗口同时关闭旧窗口javascript 打开新窗口同时关闭旧窗口更新时间 2009 年 01 月 16 日 21 03 33 作者 因业务需要 在网上查找这个问题的解决办法 但是昏天黑地地搞了半天 找到的方法虽然可以实现功能 但是总是会跳出讨厌的 关闭窗口 的提示框 郁闷 其实这个问题和浏览器的版本息息相关 作为菜鸟的我 直到现在也没有找到完美的解决办法 没办法 因为业务必须要实现 所以只好用另一种方法去做了 通过重定向 U

    2026年2月24日
    1
  • 上下文无关文法的组成

    上下文无关文法的组成上下文无关文法上下文无关文法 G 是一个四元组 G VN VT S 其中 VN 非终结符的非空有限集合 VT 终结符的非空有限集合 VN VT S 开始符号 且 S VN 形式为 P 的产生式的有限集合 且 P VN VN VT 文法组成上下文无关文法由一组终结字符 一组非终结字符 一个开始字符 一

    2026年3月18日
    2
  • 我的世界java版需要多少钱_我的世界Java版20w49a快照版[通俗易懂]

    我的世界java版需要多少钱_我的世界Java版20w49a快照版[通俗易懂]我的世界Java版20w49a快照版游戏是我的世界最新版本游戏,更新了许多新颖独特的元素,超大的地图世界可以自由探索,全新的故事情节完美融入其中,各种各样的玩法让你无限制的去毛线,全新的世界带给你不一样的欢乐。喜欢我的世界的玩家不要错过哦!我的世界Java版20w49a快照版游戏简介1、玩家可以探索去寻找一些稀有的水晶,这些水晶的种类有很多,收集这些资源即可让你建造出更多有意思的内容;2、全新的家…

    2022年7月7日
    23
  • Docker安装Nexus3私服以及使用

    Docker安装Nexus3私服以及使用一、Nexus简介二、安装步骤(使用docker)1、搜索Nexus3镜像dockersearchnexus​2、拉取Nexus3镜像dockerpullsonatype/nexus3​3、创建Nexus3容器dockerrun-itd-p8081:8081–privileged=true–namenexus3\-v/data/nexus-data:/var/nexus-data–restar…

    2022年7月13日
    13
  • 数据分析,主成分分析例题

    数据分析,主成分分析例题已知协方差矩阵求X的各主成分以及主成分的贡献率主成分分析原理:找出几个综合变量来代替原来众多的变量,使这些综合变量能尽可能地代表原来变量的信息量,且彼此之间互不相关统计方法:主成分分析(主分量分析)主成分分析步骤1.根据已知协方差矩阵,求出相应的特征值(特征根)令|kE-A|=0(其中k是特征值),求出的k就是所需要的特征值2.求出对应特征值的特征向量解方程|kE-A|X=0,求X的所有情况(参考高等代数的第三章解线性方程组)求出基本解系,设定自由未知量的值(X是向量)3.对所求出来

    2025年7月12日
    7
  • sealed密封类的使用

    sealed密封类的使用sealed 密封类 为了避免滥用继承形式 publicsealed 密封类不能作为基类被别的元素继承 但其可以继承别的类或接口密封类中不能声明受保护成员或虚成员 因为受保护成员只能在派生类中访问 而虚成员只能在派生类中重写方法密封类的不可继承性 是因为不能声明为抽象类 即 sealed 前不能用 abstract 修饰 使用密封类的情况 1 如果是静态

    2026年2月5日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号