JavaScript 引擎 SpiderMonkey

來源:互聯網
上載者:User

SpiderMonkey, 是 Mozilla 項目的一部分, 是一個執行JavaScript指令碼的引擎. 它用 C 實現。還有一個叫做 Rhino的Java版本。此外.Net 下也有 SpiderMonkeyDotNet,不過目前還不太成熟。

 

我記得我以前所在的公司裡有一個server tools 開發組,他們做的事情其實就是調用一個 javascript 引擎,將一些對象封裝,然後讓測試人員可以寫 server test 指令碼來進行服務端功能的測試。

 

其實微軟也有一個 Javascript 引擎 ActiveX 組件 Microsoft Script Control 1.0,使用起來更加簡單方便,有興趣的可以自己到網上搜尋相關的資料。

 

具體的介紹就不再多說了,網上有不少資料:

官方網站:

http://www.mozilla.org/js/spidermonkey/

看這兩篇基本上夠了:

功能強大的JavaScript引擎--SpiderMonkey
[自由、創新、研究、探索……]
http://www.cnblogs.com/shanyou/archive/2006/10/11/526777.html

使用 SpiderMonkey 使 C++應用支援 JavaScript 指令碼引擎
[頹廢到底]

http://hi.baidu.com/kuien_jiang/blog/item/7e2cfcddea6be9df8c102956.html

官方的使用者指南,網上的文章大部分也是根據這個來的:

https://developer.mozilla.org/en/JavaScript_C_Engine_Embedder%27s_Guide

 

其實我覺得這個最清楚明了,有空的話我準備把他翻譯一下:

JSAPI Phrasebook

https://developer.mozilla.org/En/SpiderMonkey/JSAPI_Phrasebook

我這次做的一個簡單的應用,我是想用 javascript prototype 中的 toJSON 功能將字串轉換為 JSON 格式,雖然C++中也有一些 JSON的解決方案,不過用起來都不爽,剛開始 JS_CompileFile 怎麼也通不過,後來搞清楚原來是 prototype中使用了很多網頁上的對象,document, window之類,這些在普通應用程式中當然沒有了,後來我把 prototype改了一下,之留下來那些跟toJSON 有關的東西就OK 了,附上代碼:

  1. void
     ConvertBufferToJson(
    char
     *buf)
  2. {
  3.     uint32 max_gc_size = (8L * 1024L * 1024L); 
  4.     
    size_t
     stack_chunk_size = (8192); 
  5.     JSRuntime *rt;
  6.     JSContext *cx;
  7.     JSObject *globalObj;
  8.     JSClass global_class = {
  9.             
    "global"
    ,0,
  10.             JS_PropertyStub, JS_PropertyStub,JS_PropertyStub, JS_PropertyStub,
  11.             JS_EnumerateStub, JS_ResolveStub,JS_ConvertStub, JS_FinalizeStub };
  12.     
    /* 初始化JS RunTime,返回結果給rt */
  13.     rt = JS_NewRuntime(max_gc_size); 
  14.     
    if
     (!rt) 
    return
    ;
  15.     
  16.     
    /* 建立一個上下文,並將其與JS RunTime關聯起來 */
  17.     cx = JS_NewContext(rt, stack_chunk_size); 
  18.     
    if
     (!cx) 
    return
    ;
  19.     
    /* 建立全域對象 */
  20.     
    if
     (!(globalObj = JS_NewObject (cx, &global_class, NULL, NULL))) 
    return
    ;
  21.     
    /* 執行個體化內建對象和全域對象*/
  22.     JS_InitStandardClasses (cx, globalObj);
  23.     
  24.     
    /*執行一段指令碼*/
  25.     JSScript* jScript = JS_CompileFile(cx, globalObj, 
    "prototype.js"
    );
  26.     
    //JSObject* scriptobj = JS_NewScriptObject(cx, jScript);
  27.     
    //JS_AddNamedRoot(cx, &scriptobj, "sy_script");
  28.     jsval rval = JSVAL_FALSE;
  29.     JSBool ok = JS_ExecuteScript(cx, globalObj, jScript, &rval);
  30.     rval = JSVAL_FALSE;
  31.     jsval argvs[1];
  32.     argvs[0] = STRING_TO_JSVAL(JS_NewStringCopyZ(cx, buf));
  33.     ok = JS_CallFunctionName(cx, JS_GetGlobalObject(cx), 
    "GetJsonValue"
    , 1, argvs, &rval);
  34.     JSString *retstr = JS_ValueToString(cx, rval);
  35.     strcpy(buf, JS_GetStringBytes(retstr));
  36.     
    /*釋放上下文*/
  37.     JS_DestroyContext(cx);
  38.     
    /*釋放RunTime*/
  39.     JS_DestroyRuntime(rt);
  40. }

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.