登录 用户中心() [退出] 后台管理 注册
   
您的位置: 首页 >> 开发 vlog >> 主题: Duktape-C语言推荐的js引擎,据说 MuJS 中有很多错误     [回主站]     [分站链接]
标题
Duktape-C语言推荐的js引擎,据说 MuJS 中有很多错误
clq
浏览(8) + 2025-06-13 14:09:11 发表 编辑

关键字:

[2025-06-13 22:57:56 最后更新]
Duktape-C语言推荐的js引擎,据说 MuJS 中有很多错误

https://xlsx.nodejs.cn/docs/demos/engines/mujs/


MuJS 引擎存在许多错误,影响 XLSX、XLML 以及其他 XML 和纯文本文件格式的解析。如果软件不需要支持旧版系统或架构,强烈建议使用现代引擎,例如 Duktape。

MuJS 的接口很像 lua

--------------------------------------------------------
https://duktape.org/
https://duktape.org/api

感觉它的 github 有点乱,不如上面的两个网址.
https://github.com/svaarala/duktape

--------------------------------------------------------

quickjs 似乎并不方便编译,还有其他小巧的 C 语言的 js 引擎吗

除了 QuickJS,确实还有一些小巧的 C/C++ 实现的 JavaScript 引擎,以下是几个备选方案:
1. Duktape

特点:

纯 C 实现,无外部依赖,嵌入式设计(仅需 200-600KB 内存)。

支持 ES5+ 部分特性,可配置裁剪。

自带调试协议和简单的垃圾回收。

适用场景:
资源受限的嵌入式设备、游戏脚本、扩展系统。

缺点:
不支持现代 ES6+ 语法(如 let/const、箭头函数等)。

编译:
单头文件(duktape.h + duktape.c),直接包含到项目中即可。

2. JerryScript

特点:

由三星开发,针对 IoT 设备优化(最小内存占用约 200KB)。

支持 ES5.1 和部分 ES6 特性(如 Proxy)。

适用场景:
超低功耗设备(如微控制器)。

缺点:
性能较低,社区活跃度一般。

编译:
CMake 构建,但比 QuickJS 更简单,通常无复杂依赖。

3. MuJS

特点:

轻量级(约 150KB),专注于简单脚本嵌入。

基于 Lua 的轻量设计,语法支持 ES5。

适用场景:
需要与 Lua 共存的场景(如游戏脚本)。

缺点:
功能有限,非活跃开发。

编译:
直接 make 即可生成静态库。

4. Hermes(Facebook)

特点:

针对 React Native 优化,支持现代 JS(ES6+)。

AOT 编译提升性能。

适用场景:
React Native 应用或需要高性能的场景。

缺点:
体积较大(约几 MB),非通用嵌入式设计。

编译:
需要较复杂的工具链(CMake + Ninja)。

5. XS(Moddable)

特点:

超小型(可裁剪到 50KB),支持 ES2018+。

专为嵌入式设备设计(如 ESP32)。

适用场景:
极低资源环境下的脚本需求。

缺点:
文档较少,生态局限。

编译:
依赖 Moddable SDK,需配置工具链。

选择建议:

嵌入式/IoT:优先 Duktape 或 JerryScript。

现代语法需求:尝试 Hermes 或 XS(若接受复杂性)。

极致简单:MuJS 或单文件版 Duktape。

如果需要更具体的推荐,可以补充你的使用场景(如目标平台、内存限制、语法需求等)。





clq
2025-06-13 20:33:03 发表 编辑


https://duktape.org/
https://duktape.org/api

https://xlsx.nodejs.cn/docs/demos/engines/duktape/

这个 SheetJS 的文档惊人的完整。

--------------------------------------------------------
使用 Duktape 进行数据处理

Duktape 是一个用 C 编写的嵌入式 JS 引擎。它已被移植到许多奇异的体系结构和操作系统。

SheetJS 是一个用于从电子表格读取和写入数据的 JavaScript 库。

"完整示例" 部分包括一个完整的命令行工具,用于从电子表格读取数据并导出到 Excel XLSB 工作簿。"绑定" 涵盖其他生态系统的绑定。
集成详情
初始化 Duktape

Duktape 不提供 global 变量。它可以在一行中创建:

/* initialize */
duk_context *ctx = duk_create_heap_default();

/* duktape does not expose a standard "global" by default */
duk_eval_string_noresult(ctx, "var global = (function(){ return this; }).call(null);");

加载 SheetJS 脚本

SheetJS 独立脚本 可以在 Duktape 上下文中进行解析和评估。

可以通过从文件系统读取脚本并在 Duktape 上下文中进行评估来加载垫片和主库:

/* simple wrapper to read the entire script file */
static duk_int_t eval_file(duk_context *ctx, const char *filename) {
size_t len;
/* read script from filesystem */
FILE *f = fopen(filename, "rb");
if(!f) { duk_push_undefined(ctx); perror("fopen"); return 1; }
long fsize; { fseek(f, 0, SEEK_END); fsize = ftell(f); fseek(f, 0, SEEK_SET); }
char *buf = (char *)malloc(fsize * sizeof(char));
len = fread((void *) buf, 1, fsize, f);
fclose(f);
if(!buf) { duk_push_undefined(ctx); perror("fread"); return 1; }

/* load script into the context */
duk_push_lstring(ctx, (const char *)buf, (duk_size_t)len);
/* eval script */
duk_int_t retval = duk_peval(ctx);
/* cleanup */
duk_pop(ctx);
return retval;
}

// ...
duk_int_t res = 0;

if((res = eval_file(ctx, "shim.min.js")) != 0) { /* error handler */ }
if((res = eval_file(ctx, "xlsx.full.min.js")) != 0) { /* error handler */ }

要确认库已加载,可以检查 XLSX.version:

/* get version string */
duk_eval_string(ctx, "XLSX.version");
printf("SheetJS library version %s\n", duk_get_string(ctx, -1));
duk_pop(ctx);

读取文件

Duktape 本身支持 Buffer,但应在处理前进行切片。假设 buf 是一个 C 字节数组,长度为 len,此片段解析数据:

/* load C char array and save to a Buffer */
duk_push_external_buffer(ctx);
duk_config_buffer(ctx, -1, buf, len);
duk_put_global_string(ctx, "buf");

/* parse with SheetJS */
duk_eval_string_noresult(ctx, "workbook = XLSX.read(buf.slice(0, buf.length), {type:'buffer'});");

workbook 将是 JS 环境中的一个变量,可以使用各种 SheetJS API 函数进行检查。
写入文件

duk_get_buffer_data 可以将 Buffer 对象数据拉入 C 代码中:

/* write with SheetJS using type: "array" */
duk_eval_string(ctx, "XLSX.write(workbook, {type:'array', bookType:'xlsx'})");

/* pull result back to C */
duk_size_t sz;
char *buf = (char *)duk_get_buffer_data(ctx, -1, sz);

/* discard result in duktape */
duk_pop(ctx);

生成的 buf 可以用 fwrite 写入文件。
完整示例
测试部署

该演示在以下部署中进行了测试:
架构 版本 日期
darwin-x64 2.7.0 2024-12-31
darwin-arm 2.7.0 2025-02-13
win11-x64 2.7.0 2024-12-20
win11-arm 2.7.0 2025-02-23
linux-x64 2.7.0 2024-12-31
linux-arm 2.7.0 2025-02-15

该程序解析文件并打印第一个工作表中的 CSV 数据。它还生成 XLSB 文件并写入文件系统。

流程图显示在示例步骤之后

Windows 构建需要带有 "使用 C++ 进行桌面开发" 的 Visual Studio。命令必须在 "原生工具命令提示符" 会话中运行。

创建项目文件夹:

mkdir sheetjs-duk
cd sheetjs-duk

下载并解压 Duktape:

Linux/MacOS
Windows

curl -LO https://duktape.org/duktape-2.7.0.tar.xz
tar -xJf duktape-2.7.0.tar.xz
mv duktape-2.7.0/src/*.{c,h} .

下载 SheetJS Standalone 脚本、shim 脚本和测试文件。将所有三个文件移动到项目目录:

shim.min.js
xlsx.full.min.js
pres.numbers

Linux/MacOS
Windows

curl -LO https://cdn.sheetjs.com/xlsx-0.20.3/package/dist/shim.min.js
curl -LO https://cdn.sheetjs.com/xlsx-0.20.3/package/dist/xlsx.full.min.js
curl -LO https://xlsx.nodejs.cn/pres.numbers

下载 sheetjs.duk.c:

curl -LO https://xlsx.nodejs.cn/duk/sheetjs.duk.c

编译独立的 sheetjs.duk 二进制文件

Linux/MacOS
Windows

gcc -std=c99 -Wall -osheetjs.duk sheetjs.duk.c duktape.c -lm

GCC 可能会生成警告:

duk_js_compiler.c:5628:13: warning: variable 'num_stmts' set but not used [-Wunused-but-set-variable]
duk_int_t num_stmts;
^

可以忽略此警告。

运行演示:

Linux/MacOS
Windows

./sheetjs.duk pres.numbers

如果程序成功,CSV 内容将打印到控制台并创建文件 sheetjsw.xlsb。该文件可以用 Excel 打开。




clq
2025-06-13 22:48:27 发表 编辑


mujs 似乎没有这么差吧。

https://github.com/ccxvii/mujs

https://mujs.com/examples.html

从示例上看,接口很是完整。


总数:2 页次:1/1 首页 尾页  
总数:2 页次:1/1 首页 尾页  


所在合集/目录



发表评论:
文本/html模式切换 插入图片 文本/html模式切换


附件:



NEWBT官方QQ群1: 276678893
可求档连环画,漫画;询问文本处理大师等软件使用技巧;求档softhub软件下载及使用技巧.
但不可"开车",严禁国家敏感话题,不可求档涉及版权的文档软件.
验证问题说明申请入群原因即可.

Copyright © 2005-2020 clq, All Rights Reserved
版权所有
桂ICP备15002303号-1