Duktape是一个可嵌入的Javascript引擎,重要关注便携性和精简及紧凑性。
Duktape很轻易集成到C/C++项目: 增加duktape.c和duktape.h到您的build中,并运用Duktape API从C代码中,挪用ECMAScript代码的功用,反之亦然。
重要特征:
嵌入式,便携,玲珑:
200kB的代码
46KB RAM启动(X86,默许选项)
22KB RAM启动(X86,lowmem选项)
42kLoC源(不包括解释等)
能够运行在具有256kB的闪存和96KB RAM的体系平台ECMAScript的E5/ E5.1规范,一些功用从E6草案借来的
- 内置正则表达式引擎
- 内置的Unicode支撑
- 最小的平台依赖性
- 连系”援用计数”和”标记消灭”的渣滓网络与接纳机制
- 自定义功用,如协程,内置日记框架,并内置CommonJS的基本模块加载框架(注: 相似node.- js中的require/export)
- 运用ECMAScript ES6 Proxy对象完成的Property virtualization
- 自在许可证(MIT)
现在状况: 稳固
技术支撑:
用户社区Q&A: stackoverflow duktape 标签
破绽和新功用请求: GitHub Issues
平常议论: IRC #duktape on chat.freenode.net
怎样运用
1. 增加到编绎体系
增加 Duktape C 源文件和头文件到你的build。任何build体系都可支撑. 发行包里有一个Makefile的类型作为参考. 下面是一个简朴的例子:
$ 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言语函数绑定(function bindings)
在Ecmascript(JavaScript)代码中挪用C言语的函数,首先要声明你的C函数:
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 */
}
注册你的函数, 比方,放到global对象中:
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中挪用这个函数:
duk_eval_string(ctx, "print('2+3=' + adder(2, 3));");
duk_pop(ctx); /* pop eval result */