BT

如何利用碎片时间提升技术认知与能力? 点击获取答案

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

| 作者 David Iffland 关注 4 他的粉丝 ,译者 臧秀涛 关注 4 他的粉丝 发布于 2014年12月11日. 估计阅读时间: 3 分钟 | QCon上海2018 关注大数据平台技术选型、搭建、系统迁移和优化的经验。

软件可能正在吞噬世界,而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上。使用过的开发者都对其丰富的文档赞口不绝。

查看英文原文:JavaScript on a Toaster: Embedded JavaScript with Duktape

 

评价本文

专业度
风格

您好,朋友!

您需要 注册一个InfoQ账号 或者 才能进行评论。在您完成注册后还需要进行一些设置。

获得来自InfoQ的更多体验。

告诉我们您的想法

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我
社区评论

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

讨论

登陆InfoQ,与你最关心的话题互动。


找回密码....

Follow

关注你最喜爱的话题和作者

快速浏览网站内你所感兴趣话题的精选内容。

Like

内容自由定制

选择想要阅读的主题和喜爱的作者定制自己的新闻源。

Notifications

获取更新

设置通知机制以获取内容更新对您而言是否重要

BT