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

jopen 9年前發布 | 58K 次閱讀 Duktape 模板引擎

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

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



主要特性:


  • 嵌入式,便攜,小巧:
  • </ul>

        200kB的代碼

        46KB RAM啟動(X86,默認選項)

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

        42kLoC源(不包括注釋等)

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


    • ECMAScript的E5/ E5.1標準,一些功能從E6草案借來的
    • </ul>

      • 內置正則表達式引擎
      • </ul>

        • 內置的Unicode支持
        • </ul>

          • 最小的平臺依賴性
          • </ul>

            • 結合"引用計數"和"標記清除"的垃圾收集與回收機制
            • </ul>

              • 自定義功能,如協程,內置日志框架,并內置CommonJS的基礎模塊加載框架(注: 類似node.js中的require/export)
              • </ul>

                • 使用ECMAScript ES6 Proxy對象實現的Property virtualization
                • </ul>

                  • 自由許可證(MIT)
                  • </ul>



                    目前狀態: 穩定



                    技術支持:

                    用戶社區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!
                    </pre>


                    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;

                    }
                    </pre>

                    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 */

                    }
                    </pre>

                    注冊你的函數, 例如,放到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 */

                    原文地址: duktape.org

                    來自:http://ourjs.com/detail/548a73b58a34fa3204000005

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!