写点什么

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

  • 2014-12-10
  • 本文字数:1013 字

    阅读完需:约 3 分钟

软件可能正在吞噬世界,而 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

2014-12-10 12:046235
用户头像
臧秀涛 略懂技术的运营同学。

发布了 300 篇内容, 共 135.2 次阅读, 收获喜欢 35 次。

关注

评论

发布
暂无评论
发现更多内容

华为云从入门到实战 | 云容器服务

TiAmo

华为 华为云 云开发 10月月更

linux下驱动开发_红外线解码驱动

DS小龙哥

10月月更

vivo平台化实践探索之旅-平台产品系列01

vivo互联网技术

平台化 系统平台化

你了解Redis RDB快照吗

芥末拌个饭吧

redis 后端 10月月更

NFT链游系统开发丨Alien Worlds异形世界链游系统开发成熟技术(Demo)

I8O28578624

从react源码看hooks的原理

flyzz177

React

react源码中的生命周期和事件系统

flyzz177

React

算法基础(六)| 双指针算法及模板应用

timerring

算法 双指针 10月月更

pandas如何读写源数据

芥末拌个饭吧

pandas python 3.5+ 10月月更

Vue的computed和watch的区别是什么?

bb_xiaxia1998

Vue

软件测试 | 测试开发 | 一文搞定 Appium 环境配置

测吧(北京)科技有限公司

测试

React面试八股文(第一期)

beifeng1996

React

Java三大特性(三)—多态

共饮一杯无

Java 多态 10月月更

PriorityQueue 源码解析(四)

知识浅谈

Queue 10月月更

页面中元素的吸顶

默默的成长

前端 Vue 3 10月月更

【LeetCode】 LRU 缓存机制Java题解

Albert

算法 LeetCode 10月月更

页面中元素的锚点定位

默默的成长

前端 Vue 3 10月月更

React的useLayoutEffect和useEffect执行时机有什么不同

beifeng1996

React

React源码分析(二)渲染机制

goClient1992

React

嵌入式Linux下移植MT7601无线WIFI(网卡)驱动

DS小龙哥

10月月更

深入浅出防抖与节流函数

CoderBin

JavaScript 面试 前端 防抖节流 10月月更

使用less/css 动态的切换主题色实现换肤功能

默默的成长

前端 Vue 3 10月月更

React源码分析(三):useState,useReducer

goClient1992

React

new Vue的时候到底做了什么

bb_xiaxia1998

Vue

你真的了解redis持久化机制AOF吗?

芥末拌个饭吧

redis 后端 10月月更

SparkSQL on K8s 在网易传媒的落地实践

网易数帆

大数据 spark Kubernetes Kyuubi 企业号十月 PK 榜

2022昇腾AI创新大赛16地区域决赛圆满落幕 32支队伍角逐全国冠军

Geek_2d6073

React循环DOM时为什么需要添加key

beifeng1996

React

最大为 N 的数字组合

掘金安东尼

算法 10月月更

软件测试 | 测试开发 | Cypress 强大全新的 Web UI 测试框架应用尝鲜

测吧(北京)科技有限公司

测试

滴滴前端二面vue相关面试题

bb_xiaxia1998

Vue

Duktape:在C/C++项目中嵌入JavaScript_JavaScript_David Iffland_InfoQ精选文章