基于 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的使用的更多相关文章

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

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

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

    译序 有些网友对为什么D2JSP能执行JavaScript脚本程序感到奇怪,因此我翻译了这篇文章,原文在这里.这篇教程手把手教你怎样利用SpiderMonkey创建一个能执行JavaScript脚本的 ...

  3. Mozilla正在SpiderMonkey中测试JavaScript并行计算

    Mozilla正致力于实现JavaScript“并行(parallelism)计算”,以便充分利用硬件性能.Dave Herman是Mozilla Research的首席研究员和策略总监.近日,他在一 ...

  4. 翻译一篇SpiderMonkey GC的文章

    前言 这篇文章包含了对SpiderMonkey中Rooted<T>, Handle<T>的解释. 翻译自 https://developer.mozilla.org/en-US ...

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

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

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

    SpiderMonkey js引擎的静态编译与使用 2017年10月02日 02:51:22 yaolixing01 阅读数:536   原文出处: http://yaolixing.oltag.co ...

  7. SpiderMonkey 入门学习(一)

    spidermonkey 源码下载:http://ftp.mozilla.org/pub/mozilla.org/js/ 测试系统 Ubuntu 12.04, js 1.7.0, js 解压在/opt ...

  8. SpiderMonkey教程

    https://technotales.wordpress.com/2009/06/07/spidermonkey-introduction/ https://developer.mozilla.or ...

  9. linux 下 SpiderMonkey 1.7.0 编译和安装

    wget http://ftp.mozilla.org/pub/mozilla.org/js/js-1.7.0.tar.gz tar xf js-1.7.0.tar.gz cd js/src make ...

随机推荐

  1. js缓存加密

    1.访问A链接就以A链接的特定部分为密码盐,生成一个js跳转配置文件名 aojoweiojoiwjeiof2.PHP在生成js跳转文件名的时候,也是根据数据库中的跳转起始链接特定部分作为盐,生成的文件 ...

  2. JAVAEE——宜立方商城07:Linux上搭建Solr服务、数据库导入索引库、搜索功能的实现

    1. 学习计划 1.Solr服务搭建 2.Solrj使用测试 3.把数据库中的数据导入索引库 4.搜索功能的实现 2. Solr服务搭建 2.1. Solr的环境 Solr是java开发. 需要安装j ...

  3. awk 提取列

    awk '{OFS="";print(substr($0,1,6),substr($0,74,18),substr($0,15,3),substr($0,18,8))}' inpu ...

  4. 顺序线性表之大整数求和C++实现

    顺序线性表之大整数求和 大整数求和伪代码 1.初始化进位标志 flag=0: 2.求大整数 A 和 B 的长度: int aLength = a.GetLength(); int bLength = ...

  5. PHP 笔记——自定义函数

    1. 定义函数 function function_name ([$arg_1],[$arg_2], ... [$arg_n]){ fun_body; [return arg_n;] } 在PHP中, ...

  6. windows提权exp列表

    漏洞列表 #Security Bulletin #KB #Description #Operating System CVE-2017-0213 [Windows COM Elevation of P ...

  7. 详解Android基本布局

    一.线性布局 LinearLayout又称为线性布局,是一种非常常用的布局.这个布局会将它包含的控件在线性方向上依次排列.我们可以通过指定它的orientation属性来决定它是垂直方向排列还是水平方 ...

  8. bzoj 3209 数位DP+欧拉定理

    枚举1的个数,统计有那么多1的数的个数 /************************************************************** Problem: 3209 Us ...

  9. Dijkstra_Liu博客100篇祭

    创建博客,有两年三个月了.今天,写了100篇随笔了,又正值我的15岁生日,还是值得纪念一下. 两年过去了,我从学习:队列.栈.模拟.背包慢慢地变成了:Tarjan.线段树.树剖. 我也从一个初一的天真 ...

  10. Ajax 的概念及过程?Ajax 的交互模型?同步和异步的区别?如何解决跨域问题?

    Ajax 是什么: 1)  通过异步模式,提升了用户体验 2)  优化了浏览器和服务器之间的传输,减少不必要的数据往返,减少了带宽占用 3)  Ajax 在客户端运行,承担了一部分本来由服务器承担的工 ...