写点什么

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

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

关注

评论

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

架构师必须知道的架构知识

架构 架构师 Architecture Architect

redis里的数据结构

流沙

redis

计算机的时钟(一):NTP协议

ElvinYang

《精益思想》读后感分享

zhongzhq

高效工作 精益 精益思想 精益生产方式

redis系列之——Redis为什么这么快?

诸葛小猿

Java redis 程序员

游戏夜读 | 如何分析游戏体验?

game1night

那些让程序员目瞪口呆的Bug

Java小咖秀

程序员 bug

无价值人生记录.0:浪费1000%时间去做一个用来节省1%时间的“轮子玩具”(上:因缘)

八苦-瞿昙

C# 程序员 随笔 随笔杂谈 aop

给 Spring Boot 项目减减肥!18.18M 到 0.18M 是如何做到的?

给你买橘子

Java 程序员 Spring Cloud 编码 SpringBoot 2

分布式系统的一些基础理论

俊俊哥

分布式事务 CAP Base

刘华:上云还是不上云,这是一个问题

刘华Kenneth

架构 敏捷

猿灯塔:spring Boot Starter开发及源码刨析(三)

猿灯塔

Java 猿灯塔

基于Kubernetes实现的大数据采集与存储实践总结

岿然独存5

Docker Kubernetes S3 EFK Fluentd

图说前端-内存管理(1/3)

梦见君笑

大前端 内存

Java 线程的生老病死

武培轩

Java 线程 多线程 并发 线程状态

不会有人还不知道全文检索工具Lucene怎么用吧?文字长文教程

给你买橘子

Java 搜索引擎 lucene 程序员 开发工具

使用 Dockerfile 创建镜像 | Docker 系列

AlwaysBeta

Docker 容器 镜像 Dockerfile

玩转Redis高可用 - 哨兵(Sentinel)模式

Man

高可用 redis高可用 中间件

如何基于 BitMap 进行海量数据分析

GrowingIO技术专栏

互联网 数据分析 科技互联网 数据化

计算机操作系统基础(十七)---进程同步之Unix域套接字

书旅

php laravel 线程 操作系统 进程

啃碎并发(九):内存模型之基础概述

猿灯塔

Java 猿灯塔

图说前端-使用Atomics避免SharedArrayBuffers中的race conditions(3/3)

梦见君笑

大前端 内存管理

java 后端博客系统文章系统——No3

猿灯塔

架构师训练营第六周作业

张明森

图解:深度优先搜索与广度优先搜索

淡蓝色

Java 数据结构 算法

如何搭建一个HBase集群

Rayjun

HBase

图说前端-ArrayBuffers 和 SharedArrayBuffers(2/3)

梦见君笑

大前端 内存管理

如果你想写自己的Benchmark框架

程序那些事

JVM 性能调优 GC benchmark

DOM 树的构建

法正

html 大前端 DOM

ARTS 打卡 第2周

Scotty

RESTful 架构及实践

Geek_z9ygea

Java 大前端 RESTf

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