Duktape 介绍

译文作者:Atypiape
原文来自:Duktape
写作日期:2016-08-12

Duktape 是一个轻量级的嵌入式 JavaScript 引擎,专注于可移植性和低占用率。

Duktape 可以被轻松地集成进一个 C/C++ 项目中:只需要将 duktape.c、duktape.h 和 duk_config.h 三个文件加入你的构建项目中,并使用 Duktape API 来实现 C 代码与 ECMAScript 函数的双向调用。

主要特性

  • 可嵌入、可移植、低占用:能够运行在 256kB 闪存(Flash)和 64kB 系统内存(RAM)的平台上;
  • 兼容 ECMAScript E5/E5.1 标准,并借鉴了 ECMAScript E6 的部分特性;
  • 支持 Khronos/ES6 的 TypedArray 对象和 Node.js 的 Buffer 对象;
  • 内置调试器;
  • 内置正则表达式引擎;
  • 内置 Unicode 支持;
  • 最小限度的平台依赖;
  • 整合了引用计数机制和 mark-and-sweep 垃圾回收机制;
  • 自定义特性,如协同程序(coroutines)、内置日志框架、内置基于 CommonJS 的模块加载框架;
  • 属性(property)虚拟化中使用了 ECMAScript E6 Proxy 对象的一个子集;
  • 以字节码转储(dump)/加载的方式,来对已编译函数进行缓存;
  • 采用 MIT 自由许可协议。

代码和内存占用

_x86 默认x86 低端内存x86 全低端内存
代码170kB150kB200kB
启动内存68kB35kB4kB

请参考 GCC 选项中的最小化代码占用。全低端内存选项使用了“指针压缩”和基于 ROM 的字符串/对象。基于 ROM 的字符串/对象也可以用于其他非低端内存选项。

当前状态

  • 稳定

技术支持

使用 Duktape 的项目

参见:使用 Duktape 的项目

如果你在自己的项目中使用了 Duktape,可以发送一封邮件或者开一个 GitHub issue 来将项目加到列表中。

类似的引擎

有多个与 Duktape 定位类似的 JavaScript 引擎,至少有如下几个:

也可以参考 ECMAScript 引擎列表

转载于:https://www.cnblogs.com/atypiape/p/duktape-introduction.html

Duktape 是一个非常轻量级的 JavaScript 引擎,它可以将 JavaScript 代码嵌入到 C/C++ 应用程序中,从而为其提供脚本支持。在 Duktape 中,我们可以使用“绑定”(binding)来将 C/C++ 函数暴露给 JavaScriptDuktape 支持直接绑定 C 函数,也支持间接绑定。 间接绑定是指将 C 函数封装在一个对象中,然后将该对象绑定到 JavaScript 中。这个对象可以是一个结构体、类或者其他的 C/C++ 对象。在 JavaScript 中,我们可以通过这个对象来访问其中的 C 函数。这种方式可以更好地管理 C 函数之间的依赖关系,同时也可以更好地保护 C 函数的安全性。 下面是一个简单的例子,演示了如何使用 Duktape 进行间接绑定: ```c /* 定义一个 C 函数 */ int foo(int x, int y) { return x + y; } /* 定义一个包含 C 函数的结构体 */ typedef struct { int (*foo)(int, int); } my_module_t; /* 在 JavaScript 中暴露 my_module_t 对象 */ duk_push_c_function(ctx, my_module_ctor, 0); duk_push_object(ctx); duk_put_function_list(ctx, -1, my_module_methods); duk_put_prop_string(ctx, -2, "prototype"); duk_put_global_string(ctx, "MyModule"); /* 在 C/C++ 代码中实现 my_module_ctor 函数 */ static duk_ret_t my_module_ctor(duk_context *ctx) { my_module_t *module = (my_module_t*)duk_push_fixed_buffer(ctx, sizeof(my_module_t)); module->foo = foo; duk_push_this(ctx); duk_put_prop_string(ctx, -2, "\xff""\xff""module_ptr"); return 0; } /* 在 JavaScript使用 my_module_t 对象 */ var my_module = new MyModule(); var result = my_module.foo(1, 2); console.log(result); // 输出 3 ``` 在这个例子中,我们首先定义了一个 C 函数 `foo`,然后定义了一个包含 `foo` 函数的结构体 `my_module_t`。接着,我们使用 `duk_push_c_function` 函数将 `my_module_ctor` 函数暴露给 JavaScript。在 `my_module_ctor` 函数中,我们创建了一个 `my_module_t` 对象,并将其中的 `foo` 函数设置为刚刚定义的 `foo` 函数。然后,我们将这个对象保存到 JavaScript 中的 `this` 对象中,并返回 0。 在 JavaScript 中,我们使用 `new MyModule()` 创建一个 `my_module_t` 对象,并通过 `my_module.foo(1, 2)` 调用其中的 `foo` 函数,最终输出结果 3。 需要注意的是,间接绑定的方式不仅可以用于暴露 C/C++ 函数,还可以用于暴露其他的 C/C++ 对象,比如结构体、类等。并且,间接绑定的方式可以更好地管理 C/C++ 对象之间的依赖关系,从而提高代码的可维护性和安全性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值