写点什么

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:046337
用户头像
臧秀涛 略懂技术的运营同学。

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

关注

评论

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

HarmonyoS快速入门:Hello world

逝缘~

7月月更

云原生(五) | Docker篇之深入Dockerfile

Lansonli

云原生 7月月更

LeetCode-108. 将有序数组转换为二叉搜索树(java)

bug菌

Leet Code 7月月更

架构实战营|模块7

KDA

#架构实战营

推荐 6 个实用的 Vue 组件库

devpoint

JavaScript Vue 前端开发 7月月更

基于CSS mask-image 实现炫酷图片过渡效果之星球大战

南城FE

前端 动画效果 7月月更 过渡

jQuery 的节点操作

Jason199

jquery js 7月月更

开发第一个Flink应用

程序员欣宸

Java flink 7月月更

各厂商的数据湖解决方案

五分钟学大数据

数据湖 7月月更

博弈论(depu)与投资(40/100)

hackstoic

投资

java零基础入门-File类(实战篇)

喵手

Java 7月月更

如何使用SVG制作沿任意路径排布的文字效果

南极一块修炼千年的大冰块

7月月更

getchar()

謓泽

7月月更

李宏毅《机器学习》|1. Introduction of this course(机器学习介绍)

AXYZdong

机器学习 7月月更

以太坊升级在即,Arbitrum 引领 L2 Summer 新航向

TinTinLand

qt 实现遍历文件夹

小肉球

qt 7月月更

nacos服务注册之SpringCloud 集成nacos

急需上岸的小谢

7月月更

王者荣耀商城异地多活架构设计

爱晒太阳的大白

OpenCV编程:OpenCV3.X训练自己的分类器

DS小龙哥

7月月更

数字化转型的两种误区

奔向架构师

数据仓库 数据资产 7月月更

MFC|框架下自绘CEdit控件

中国好公民st

c++ 7月月更

TCP拥塞控制详解 | 7. 超越TCP

俞凡

算法 网络 TCP拥塞控制

查找——平衡二叉树

乔乔

7月月更

Tortoisegit工具的安装和使用

空城机

git Tortoisegit 7月月更

使用Java获取给定日期所在周的第一天

李印

Java 小工具

数据库每日一题---第25天:银行账户概要 II

知心宝贝

数据库 云计算 前端 后端 7月月更

【LeetCode】滑动窗口的平均值Java题解

Albert

LeetCode 7月月更

SAP Fiori 的附件处理(Attachment handling)

汪子熙

SAP Fiori SAP UI5 ui5 7月月更

【愚公系列】2022年7月 Go教学课程 012-强制类型转换

愚公搬代码

7月月更

C# SerialPort配置和属性了解

IC00

C# 7月月更

知其然,而知其所以然,JS 对象创建与继承

掘金安东尼

JavaScript 前端 设计模式 7月月更

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