天天看點

Duktape:一個新的小巧的超精簡可嵌入式JavaScript引擎

Duktape是一個可嵌入的Javascript引擎,主要關注便攜性和精簡及緊湊性。

Duktape很容易內建到C/C++項目: 添加duktape.c和duktape.h到您的build中,并使用Duktape API從C代碼中,調用ECMAScript代碼的功能,反之亦然。

主要特性:

  • 嵌入式,便攜,小巧:

    200kB的代碼

    46KB RAM啟動(X86,預設選項)

    22KB RAM啟動(X86,lowmem選項)

    42kLoC源(不包括注釋等)

    可以運作在具有256kB的閃存和96KB RAM的系統平台

  • ECMAScript的E5/ E5.1标準,一些功能從E6草案借來的
  • 内置正規表達式引擎
  • 内置的Unicode支援
  • 最小的平台依賴性
  • 結合"引用計數"和"标記清除"的垃圾收集與回收機制
  • 自定義功能,如協程,内置日志架構,并内置CommonJS的基礎子產品加載架構(注: 類似node.- js中的require/export)
  • 使用ECMAScript ES6 Proxy對象實作的Property virtualization
  • 自由許可證(MIT)

目前狀态: 穩定

技術支援:

使用者社群Q&A:

stackoverflow duktape 标簽

漏洞和新功能要求:

GitHub Issues

一般讨論: IRC #duktape on chat.freenode.net

如何使用

1. 添加到編繹系統

添加 Duktape C 源檔案和頭檔案到你的build。任何build系統均可支援. 發行包裡有一個Makefile的範例作為參考. 下面是一個簡單的例子:

$ gcc -std=c99 -o test test.c duktape.c -lm

$ ./test

Hello world!

2 初始化上下文(context)

初始化并在你的程式中使用Duktape

/* test.c */

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

}

3 添加C語言函數綁定(function bindings)

在Ecmascript(JavaScript)代碼中調用C語言的函數,首先要聲明你的C函數:

int adder(duk_context *ctx) {

  int i;

  int n = duk_get_top(ctx);  /* #args */

  double res = 0.0;

  for (i = 0; i < n; i++) {

    res += duk_to_number(ctx, i);

  }

  duk_push_number(ctx, res);

  return 1;  /* one return value */

注冊你的函數, 例如,放到global對象中:

duk_push_global_object(ctx);

duk_push_c_function(ctx, adder, DUK_VARARGS);

duk_put_prop_string(ctx, -2 /*idx:global*/, "adder");

duk_pop(ctx);  /* pop global */

然後你就可以在Ecmascript中調用這個函數:

duk_eval_string(ctx, "print('2+3=' + adder(2, 3));");

duk_pop(ctx);  /* pop eval result */

繼續閱讀