Duktape:在C/C++项目中嵌入JavaScript

软件可能正在吞噬世界,而JavaScript又可能正在吞噬软件世界。凭借可以嵌入到任何C/C++项目中的、完整兼容ECMAScript 5的引擎,Duktape使得JavaScript超越了浏览器或服务器的界限。

Duktape较小的代码库、简单的构建系统,使其非常适合嵌入在其他系统中使用。从技术角度看,它本质上和Lua项目很像,但是它运行的JavaScript却有着更大的生态系统和更多的开发者。——Tim Caswell

尽管Lua并不比JavaScript年长多少,但是JavaScript在浏览器中、在服务器上(通过node.js),无处不在,从而获得了更大的认可。对于想嵌入一门脚本语言的项目,Duktape支持使用一种非常流行的语言及其生态系统。Duktape项目的创建者Sami Vaarala指出,“最初动机就是想为JavaScript创建一个类似Lua的实现。”

使用Duktape非常简单,只需要把duktape.c和duktape.h添加到项目中。JavaScript和C之间的绑定是双向的,所以可以相互调用。“Hello World!”示例如下:

#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;
}

Tim Caswell摘取了Duktape的核心,用Dukluv加以扩展,创建了一个较小的“针对小型设备的类node.js环境”。Caswell提到,他的项目加入了libuv到Duktape的绑定:

使得Duktape可以访问操作系统,从而成为一个支持非阻塞I/O、定时器(timer)、子进程,并支持加载libuv所提供的有用的工具函数的完整通用编程环境。

需要嵌入脚本语言的需求并不新鲜。电子游戏已经这么干了好多年了,比如魔兽世界就使用了Lua,用于定制界面。Stack Overflow上有一个很受欢迎的回答指出,Lua之所以常用,原因在于:

Lua很小,可移植,而且是用ANSI C实现的,易于修改;容易嵌入到其他项目中,好扩展,而且对于游戏开发者最重要的是,运行时占用的内存非常少。

像SpiderMonkey和V8等浏览器引擎也可以嵌入在其他项目中,但是它们很庞大,不适合小型应用。Caswell说,对于简单的任务或低功率的机器,它们“太过重量级”了。Espruino项目也为微控制器提供了JavaScript,但是它和ECMAScript的兼容性只在95%左右,而Duktape是完全兼容的。

Duktape基于MIT许可协议开源,源代码托管在GitHub上。使用过的开发者都对其丰富的文档赞口不绝。

上一篇:「词嵌入」和「注意力」的新发现获得CoNLL 2018最佳论文奖


下一篇:[C++] 将 mp3 等音乐资源以资源形式嵌入 exe 文件中