SpiderMonkey js引擎的静态编译与使用

2017年10月02日 02:51:22 yaolixing01 阅读数:536
 

原文出处: http://yaolixing.oltag.com/gns-8ABFFE2D-EB1E-44FA-9118-217ED7959536.html

几百KB的跨平台js引擎,是不是你心之所想呢?油猴spiderMonkey 1.6静态编译生成的js.exe,可以执行一些脚本,以方便工作之用。
你也可以修改其中代码,添加你想要的黑科技。阅读和修改引擎代码,也能帮助你学习js解释器方面的知识。
SpiderMonkey Static Build:   http://yaolixing.oltag.com/gn-2E5A3287-88A2-4532-96C7-5BB3C4F6B509.html
源码(8M): http://oltag.com:8080/yaolixing/18/00/12/06/00/SpiderMonkey1.6.rar 
js.exe( 378kb):  http://oltag.com:8080/yaolixing/18/00/12/06/00/js.rar
https://wiki.freeswitch.org/wiki/File
同样生成其它平台也不是难事。工程中js32.lib用于jsshell,照猫画虎同样也可以嵌入到其他c/c++项目中。

示例:
print("erffsdf");
var file = new XML("<n1><n2></n2></n1>");
print(file);

var file =new File("xx.txt");
file.open("write,create", "text");
file.writeln("The quick brown fox jumped over the lazy dogs");
file.mkdir('./abc/');
file.close();
执行结果:

    • SpiderMonkey是Mozilla项目的一部分,是一个用C语言实现的JavaScript脚本引擎,另外还有一个叫做Rhino的Java版本。SpiderMonkeyisMozilla'sJavaScriptenginewritteninCandC++.ItisusedinvariousMozillaproducts,includingFirefox,andisavailableundertheMPL2.它是采用C和C++编写的,可以把这个引擎嵌入到自己的应用程序里。要使
    • SpiderMonkey是Mozilla项目的一部分,是一个用C语言实现的JavaScript脚本引擎,另外还有一个叫做Rhino的Java版本。

      SpiderMonkey is Mozilla's JavaScript engine written in C and C++. It is used in various Mozilla products, including Firefox, and is available under the MPL2.

      它是采用C和C++编写的,可以把这个引擎嵌入到自己的应用程序里。

      要使用这个引擎,先要下载源代码mozjs-38.2.1.rc0.tar.bz2,编译工具vc2015, MozillaBuildSetup-2.2.0.exe,以及nspr-4.12.tar.gz源码。

      MozillaBuildSetup不要下载最新的版本,否则使用不了VC2015来编译。

      在MozillaBuildSetup安装的目录下,找到start-shell-msvc2015.bat文件,然后运行,再根据命令进行编译。

      其它就可以参考:

      http://blog.csdn.net/herorazor/article/details/45560731

      1.你也能动手修改C编译器 http://edu.csdn.net/course/detail/5582
      2.纸牌游戏开发http://edu.csdn.net/course/detail/5538 3. 五子棋游戏开发
      http://edu.csdn.net/course/detail/5487
      4. RPG游戏从入门到精通
      http://edu.csdn.net/course/detail/5246
      5. WiX安装工具的使用
      http://edu.csdn.net/course/detail/5207
      6. 俄罗斯方块游戏开发
      http://edu.csdn.net/course/detail/5110
      7. boost库入门基础
      http://edu.csdn.net/course/detail/5029
      8.Arduino入门基础
      http://edu.csdn.net/course/detail/4931
      9.Unity5.x游戏基础入门
      http://edu.csdn.net/course/detail/4810
      10. TensorFlow API攻略
      http://edu.csdn.net/course/detail/4495
      11. TensorFlow入门基本教程
      http://edu.csdn.net/course/detail/4369
      12. C++标准模板库从入门到精通 
      http://edu.csdn.net/course/detail/3324
      13.跟老菜鸟学C++
      http://edu.csdn.net/course/detail/2901
      14. 跟老菜鸟学python
      http://edu.csdn.net/course/detail/2592
      15. 在VC2015里学会使用tinyxml库
      http://edu.csdn.net/course/detail/2590
      16. 在Windows下SVN的版本管理与实战 
      http://edu.csdn.net/course/detail/2579
      17.Visual Studio 2015开发C++程序的基本使用 
      http://edu.csdn.net/course/detail/2570
      18.在VC2015里使用protobuf协议
      http://edu.csdn.net/course/detail/2582
      19.在VC2015里学会使用MySQL数据库
      http://edu.csdn.net/course/detail/2672

spidermonkey 源码下载:http://ftp.mozilla.org/pub/mozilla.org/js/

测试系统 Ubuntu 12.04, js 1.7.0, js 解压在/opt/js 路径下

tar -zxvf js-1.7.0.tar.gz -C /opt

SpiderMonkey 编译步骤:

1 登录源码目录

cd /opt/js/src

2 编译

make -f Makefile.req

编译好之后,编译文件会在/opt/js/src/Linux_All_DBG.OBJ

其中js 是一个js 的交互式客户端

libjs.so libjs.a 是动态库与静态库

我们还需要手工移动一下一个头文件,估计是他们源码里写错了

 mv /opt/js/src/Linux_All_DBG.OBJ/jsautocfg.h /opt/js/src/

下面我们写一个spidermonkey 的Hello World 程序

#include "jsapi.h"

#include "stdlib.h"

#include "string.h"
static void usage();
int main(int argc,const char* argv[])
{

if(argc!=2){
  usage();
  exit(-1);
}
JSRuntime *runtime = NULL;

JSContext *context = NULL;

JSObject *global = NULL;

const char *script = argv[1];

printf("script is \n%s\n", script);

jsval rval;

if (
  (!(runtime = JS_NewRuntime(1024L * 1024L)))
  || (!(context = JS_NewContext(runtime, 8192)))
  || (!(global = JS_NewObject(context, NULL, NULL, NULL)))
)
return EXIT_FAILURE;

if (!JS_InitStandardClasses(context, global))
   return EXIT_FAILURE;

if (!JS_EvaluateScript(context, global, script, strlen(script), "script", 1, &rval))
   return EXIT_FAILURE;

printf("the script's result is \n%d\n",JSVAL_TO_INT(rval));

JS_DestroyContext(context);
JS_DestroyRuntime(runtime);
JS_ShutDown();
return EXIT_SUCCESS;
}
void usage()
{
   printf("example1 script_content\n");
   printf("for example:./example1 \"var a=1;b=2;a+b\"\n");
}

程序是摘自网上,搜索SpiderMonkey 学习,大部分都是将这个程序。

gcc 编译命令

gcc -DXP_UNIX -I/opt/js/src -o excample test.c  -L/opt/js/src/Linux_All_DBG.OBJ -ljs -lm

编译出来一个excample 的程序

要运行,还需添加系统的环境变量

export LD_LIBRARY_PATH=/opt/js/src/Linux_All_DBG.OBJ

测试一下

./excample "var a=1;var b=2;a+b"

输出

script is
var a=1;var b=2;a+b
the script's result is
3

SpiderMonkey的使用

 

基于 C 语言的 JavaScript 引擎探索

http://www.ibm.com/developerworks/cn/linux/l-cn-spidermonkey/

https://developer.mozilla.org/en-US/docs/SpiderMonkey/JSAPI_User_Guide

http://zh.wikipedia.org/wiki/SpiderMonkey

下载地址:

http://ftp.mozilla.org/pub/mozilla.org/js/

SpiderMonkey-让你的C++程序支持JavaScript脚本

http://blog.csdn.net/singlerace/article/details/1370215

使用 SpiderMonkey 脚本化您的应用

JavaScript 语言具有动态性,支持函数式编程,动态弱类型等等优点。作为一个脚本语言,可以很方便的脚本化需要高度可定制的应用程序。本文介绍基于 C 语言的 JavaScript 引擎 SpiderMonkey,详细讨论如何通过该引擎,使得 C 语言和 JavaScript 语言进行交互。

基础知识

SpiderMonkey 简介

和其他的 JavaScript 引擎一样,SpiderMonkey 不直接提供像 DOM 这样的对象,而是提供解析,执行 JavaSccript 代码,垃圾回收等机制。SpidlerMonkey 是一个在 Mozilla 之下的开源项目,要使用 SpiderMonkey,需要下载其源码,然后编译为静态 / 动态库使用。

要在自己的应用程序中使用 SpiderMonkey,首先需要了解以下三个核心概念:

运行时环境运行时环境是所有 JavaScript 变量,对象,脚本以及代码的上下文所存在的空间。每一个上下文对象,以及所有的对象均存在于此。一般应用仅需要一个运行时即可。

上下文上 下文即脚本执行的环境,在 SpiderMonkey 中,上下文可以编译执行脚本,可以存取对象的属性,调用 JavaScript 的函数,转换类型,创建 / 维护对象等。几乎所有的 SpiderMonkey 函数都需要上下文作为其第一个参数 (JSContext *)。

上下文与线程密不可分,一般来讲,单线程应用可以使用一个上下文来完成所有的操作,每一个上下文每次只能完成一个操作,所有在多线程应用中,同一时刻只能有一个线程来使用上下文对象。一般而言,多线程应用中,每个线程对应一个上下文。

全局对象全局对象包含 JavaScript 代码所用到的所有类,函数,变量。在 DOM 操作中,我们使用的:

 alter("something");

事实上使用的是全局变量 window 的一个属性 alter( 这个属性正好是一个函数 ),事实上上边的语句在执行时会别解释为:

 window.alter("something");

Error while compiling an embedded SpiderMonkey program

http://stackoverflow.com/questions/10205202/error-while-compiling-an-embedded-spidermonkey-program

helloworld.cpp:In function ‘int main(int,constchar**)’:
helloworld.cpp:74:20: warning: deprecated conversion from string constant to ‘char*’[-Wwrite-strings]
helloworld.cpp:83:17: warning: NULL used in arithmetic [-Wpointer-arith]/tmp/ccUU9may.o:In function `main':
helloworld.cpp:(.text+0x6e): undefined reference to `JS_Init'
helloworld.cpp:(.text+0x94): undefined reference to `JS_NewContext'
helloworld.cpp:(.text+0xba): undefined reference to `JS_SetOptions'
helloworld.cpp:(.text+0xcb): undefined reference to `JS_SetVersion'
helloworld.cpp:(.text+0xdc): undefined reference to `JS_SetErrorReporter'

https://bugzilla.mozilla.org/show_bug.cgi?id=547715
c++ -o jsapi-tests  -fno-rtti -fno-exceptions -Wall -Wpointer-arith -Woverloaded-virtual -Wsynth -Wno-ctor-dtor-privacy -Wno-non-virtual-dtor -Wcast-align -Wno-invalid-offsetof -Wno-variadic-macros -Wno-long-long -g -fno-strict-aliasing -pthread -pipe  -DNDEBUG -DTRIMMED -Os -freorder-blocks -fno-reorder-functions   tests.o selfTest.o testPropCache.o testXDR.o testIntString.o testIsAboutToBeFinalized.o testSameValue.o testDebugger.o testDefineGetterSetterNonEnumerable.o testExtendedEq.o    -Wl,--as-needed -lpthread   -Wl,-rpath-link,/bin -Wl,-rpath-link,/lib  -L../../../dist/bin -L../../../dist/lib -L/usr/lib -lplds4 -lplc4 -lnspr4 -lpthread -ldl ../libjs_static.a -ldl -lm
../libjs_static.a(jsapi.o): In function `JS_ClearContextThread':
/tmp/xulrunner/js/src/jsapi.cpp:5901: undefined reference to `PR_Lock'
/tmp/xulrunner/js/src/jsapi.cpp:5904: undefined reference to `PR_Unlock'
../libjs_static.a(jsapi.o): In function `JS_SetContextThread':
/tmp/xulrunner/js/src/jsapi.cpp:5876: undefined reference to `PR_Unlock'
../libjs_static.a(jsapi.o): In function `JS_DropPrincipals':
/tmp/xulrunner/js/src/jsapi.cpp:4184: undefined reference to `PR_AtomicDecrement'
../libjs_static.a(jsapi.o): In function `JS_ToggleOptions':
/tmp/xulrunner/js/src/jsapi.cpp:1184: undefined reference to `PR_Lock'
/tmp/xulrunner/js/src/jsapi.cpp:1189: undefined reference to `PR_Unlock'
(snip)

This is because the static library comes after the nspr link flags.
SpiderMonkey是Mozilla项目的一部分,是一个用C语言实现的JavaScript脚本引擎,另外还有一个叫做Rhino的Java版 本。
 
 

SpiderMonkey js引擎的静态编译与使用, SpiderMonkey的使用的更多相关文章

  1. SpiderMonkey js引擎的静态编译与使用

    原文出处: http://yaolixing.oltag.com/gns-8ABFFE2D-EB1E-44FA-9118-217ED7959536.html 几百KB的跨平台js引擎,是不是您心之所想 ...

  2. 🤔 移动端 JS 引擎哪家强?美国硅谷找......

    如果你喜欢我写的文章,可以把我的公众号设为星标 ,这样每次有更新就可以及时推送给你啦 在一般的移动端开发场景中,每次更新应用功能都是通过 Native 语言开发并通过应用市场版本分发来实现的.但是市场 ...

  3. 热重载 预编译 编译器 JS引擎 作用域

    热重载就是页面每次改动,不需要手动去刷新,可自动刷新.保持vuex的状态. JS之预编译 JavaScript的预编译 编译器 JS引擎 作用域三者之间的关系 建议你先去看看你不知道的JavaScri ...

  4. C语言JS引擎

    基础知识 SpiderMonkey 简介 和其他的 JavaScript 引擎一样,SpiderMonkey 不直接提供像 DOM 这样的对象,而是提供解析,执行 JavaSccript 代码,垃圾回 ...

  5. 深入浏览器工作原理和JS引擎(V8引擎为例)

    浏览器工作原理和JS引擎 1.浏览器工作原理 在浏览器中输入查找内容,浏览器是怎样将页面加载出来的?以及JavaScript代码在浏览器中是如何被执行的? 大概流程可观察以下图: 首先,用户在浏览器搜 ...

  6. 说下Fedora下把SpiderMonkey放入Eclipse内编译的过程

    首先要知道SpiderMonkey是个什么玩意 详细的可以看看这里(当然,如果你有google翻译的话看起来也一样费劲,你可以在语言那里选择中文.看完了再转回英文-因为中文有很多文档都没有的,比如:B ...

  7. Js引擎解析执行 阅读笔记

    Js引擎解析执行 阅读笔记 一篇阅读笔记 http://km.oa.com/group/2178/articles/show/145691?kmref=search&from_page=1&a ...

  8. atitit..主流 浏览器 js 引擎 内核 市场份额 attialx总结vOa9

    atitit..主流 浏览器 js 引擎  内核 市场份额 attialx总结vOa9 1. 浏览器内核 1 2. 浏览器的主要组件包括: 2 2.1. 主要组件体系结构 2 2.2. WebCore ...

  9. 主流浏览器js 引擎内核市场份额attialx总结vOa9

    原文: http://blog.csdn.net/attilax/article/details/40016... 时间: 2014-10-12 atitit.. 主流浏览器 js 引擎 内核 市场份 ...

随机推荐

  1. sklearn GMM模型介绍

    参考  SKlearn 库 EM 算法混合高斯模型参数说明及代码实现   和   sklearn.mixture.GaussianMixture 以前的推导内容:    GMM 与 EM 算法 记录下 ...

  2. zabbix agent配置文件记录

    一.无论主动还是被动模式都要配置server和linstenPort 二.若要设置主动模式那么要添加ServerActive,若不添加则默认为被动模式

  3. 022 StringTokenizer替换掉String的操作

    一:说明 1.说明 String的操作特别消耗内存,所以可以考虑优化. 二:程序 1.程序修改 这部分程序属于Mapper端的程序,稍微优化一下. 2.程序 //Mapper public stati ...

  4. EditText 数字范围 检查string 是不是数字

    public static boolean isNumeric00(String str){ try{ Integer.parseInt(str); return true; }catch(Numbe ...

  5. UVALive 7146 (贪心+少许数据结构基础)2014acm/icpc区域赛上海站

    这是2014年上海区域赛的一道水题.请原谅我现在才发出来,因为我是在太懒了.当然,主要原因是我刚刚做出来. 其实去年我就已经看到这道题了,因为我参加的就是那一场.但是当时我们爆零,伤心的我就再也没有看 ...

  6. bzoj 4004 向量拟阵

    题解RT. eps = 1e-10 WrongAnswer eps = 1e-5 Accepted /************************************************* ...

  7. [Java]Spring框架

    在这里学习Spring框架: >>spring&struts框架学习 >>spring >>Java回顾之Spring基础 >>IBM Java ...

  8. Xtreme9.0 - Taco Stand 数学

    Taco Stand 题目连接: https://www.hackerrank.com/contests/ieeextreme-challenges/challenges/taco-stand Des ...

  9. j.u.c系列(06)---之锁条件:Condition

    写在前面 在没有Lock之前,我们使用synchronized来控制同步,配合Object的wait().notify()系列方法可以实现等待/通知模式.在Java SE5后,Java提供了Lock接 ...

  10. Context Switching on the Cortex-M3

    http://coactionos.com/embedded%20design%20tips/2013/10/09/Tips-Context-Switching-on-the-Cortex-M3/ T ...