轉(zhuǎn)載自:http://ourjs.com/detail/548a73b58a34fa3204000005
Duktape是一個(gè)可嵌入的Javascript引擎,主要關(guān)注便攜性和精簡(jiǎn)及緊湊性。
Duktape很容易集成到C/C++項(xiàng)目: 添加duktape.c和duktape.h到您的build中,并使用Duktape API從C代碼中,調(diào)用ECMAScript代碼的功能,反之亦然。
主要特性:
200kB的代碼
46KB RAM啟動(dòng)(X86,默認(rèn)選項(xiàng))
22KB RAM啟動(dòng)(X86,lowmem選項(xiàng))
42kLoC源(不包括注釋等)
可以運(yùn)行在具有256kB的閃存和96KB RAM的系統(tǒng)平臺(tái)
- ECMAScript的E5/ E5.1標(biāo)準(zhǔn),一些功能從E6草案借來的
- 結(jié)合"引用計(jì)數(shù)"和"標(biāo)記清除"的垃圾收集與回收機(jī)制
- 自定義功能,如協(xié)程,內(nèi)置日志框架,并內(nèi)置CommonJS的基礎(chǔ)模塊加載框架(注: 類似node.js中的require/export)
- 使用ECMAScript ES6 Proxy對(duì)象實(shí)現(xiàn)的Property virtualization
目前狀態(tài): 穩(wěn)定
技術(shù)支持:
用戶社區(qū)Q&A: stackoverflow
duktape 標(biāo)簽
一般討論: IRC #duktape on chat.freenode.net
如何使用
1. 添加到編繹系統(tǒng)
添加 Duktape C 源文件和頭文件到你的build。任何build系統(tǒng)均可支持. 發(fā)行包里有一個(gè)Makefile的范例作為參考. 下面是一個(gè)簡(jiǎn)單的例子:
$ gcc -std=c99 -o test test.c duktape.c -lm
$ ./test
Hello world!
2 初始化上下文(context)
初始化并在你的程序中使用Duktape
/* test.c */
#include "duktape.h"
int main(int argc, char *argv[]) {
duk_context *ctx = duk_create_heap_default();
duk_eval_string(ctx, "print('Hello world!');");
duk_destroy_heap(ctx);
return 0;
}
3 添加C語言函數(shù)綁定(function bindings)
在Ecmascript(JavaScript)代碼中調(diào)用C語言的函數(shù),首先要聲明你的C函數(shù):
int adder(duk_context *ctx) {
int i;
int n = duk_get_top(ctx); /* #args */
double res = 0.0;
for (i = 0; i < n; i++) {
res += duk_to_number(ctx, i);
}
duk_push_number(ctx, res);
return 1; /* one return value */
}
注冊(cè)你的函數(shù), 例如,放到global對(duì)象中:
duk_push_global_object(ctx);
duk_push_c_function(ctx, adder, DUK_VARARGS);
duk_put_prop_string(ctx, -2 /*idx:global*/, "adder");
duk_pop(ctx); /* pop global */
然后你就可以在Ecmascript中調(diào)用這個(gè)函數(shù):
duk_eval_string(ctx, "print('2+3=' + adder(2, 3));");
duk_pop(ctx); /* pop eval result */