QuickJS 是一个轻量且可嵌入的 JavaScript 引擎,它支持 ES2019 规范,包括 ES module、异步生成器以及 proxies。除此之外,还支持可选的数学扩展,例如大整数(BigInt)、大浮点数(BigFloat)和运算符重载。

主要特点:

  • 轻量而且易于嵌入:只需几个C文件,没有外部依赖,一个x86下的简单的“hello world”程序只要180 KiB。

  • 具有极低启动时间的快速解释器:在一台单核的台式PC上,大约在100秒内运行ECMAScript 测试套件1 56000次。运行时实例的完整生命周期在不到300微秒的时间内完成。

  • 几乎完整实现ES2019支持,包括:模块,异步生成器和和完整Annex B支持 (传统的Web兼容性)。

  • 通过100%的ECMAScript Test Suite测试。

  • 可以将Javascript源编译为没有外部依赖的可执行文件。

  • 使用引用计数(以减少内存使用并具有确定性行为)的垃圾收集与循环删除。

  • 数学扩展:BigInt, BigFloat, 运算符重载, bigint模式, math模式.

  • 在Javascript中实现的具有上下文着色和完成的命令行解释器。

  • 采用C包装库构建的内置标准库。

用途:后端服务、嵌入式应用、命令工具等等。

示例:

QuickJS/bjson.c:一个可读取可写入JSON文件的插件

#include "quickjs-libc.h"#include "cutils.h"

static JSValue js_bjson_read(JSContext *ctx, JSValueConst this_val,                             int argc, JSValueConst *argv){    uint8_t *buf;    uint64_t pos, len;    JSValue obj;    size_t size;

    if (JS_ToIndex(ctx, &pos, argv[1]))        return JS_EXCEPTION;    if (JS_ToIndex(ctx, &len, argv[2]))        return JS_EXCEPTION;    buf = JS_GetArrayBuffer(ctx, &size, argv[0]);    if (!buf)        return JS_EXCEPTION;    if (pos + len > size)        return JS_ThrowRangeError(ctx, "array buffer overflow");    obj = JS_ReadObject(ctx, buf + pos, len, 0);    return obj;}

static JSValue js_bjson_write(JSContext *ctx, JSValueConst this_val,                              int argc, JSValueConst *argv){    size_t len;    uint8_t *buf;    JSValue array;

    buf = JS_WriteObject(ctx, &len, argv[0], 0);    if (!buf)        return JS_EXCEPTION;    array = JS_NewArrayBufferCopy(ctx, buf, len);    js_free(ctx, buf);    return array;}

static const JSCFunctionListEntry js_bjson_funcs[] = {    JS_CFUNC_DEF("read", 3, js_bjson_read ),    JS_CFUNC_DEF("write", 1, js_bjson_write ),};

static int js_bjson_init(JSContext *ctx, JSModuleDef *m){    return JS_SetModuleExportList(ctx, m, js_bjson_funcs,                                  countof(js_bjson_funcs));}

#ifdef JS_SHARED_LIBRARY#define JS_INIT_MODULE js_init_module#else#define JS_INIT_MODULE js_init_module_bjson#endif

JSModuleDef *JS_INIT_MODULE(JSContext *ctx, const char *module_name){    JSModuleDef *m;    m = JS_NewCModule(ctx, module_name, js_bjson_init);    if (!m)        return NULL;    JS_AddModuleExportList(ctx, m, js_bjson_funcs, countof(js_bjson_funcs));    return m;}

QuickJS/tests/test_bjson.js:测试代码

import * as bjson from "../bjson.so";

function assert(b, str){    if (b) {        return;    } else {        throw Error("assertion failed: " + str);    }}

function toHex(a){    var i, s = "", tab, v;    tab = new Uint8Array(a);    for(i = 0; i < tab.length; i++) {        v = tab[i].toString(16);        if (v.length < 2)            v = "0" + v;        if (i !== 0)            s += " ";        s += v;    }    return s;}

function toStr(a){    var s, i, props, prop;

    switch(typeof(a)) {    case "object":        if (a === null)            return "null";        if (Array.isArray(a)) {            s = "[";            for(i = 0; i < a.length; i++) {                if (i != 0)                    s += ",";                s += toStr(a[i]);            }            s += "]";        } else {            props = Object.keys(a);            s = "{";            for(i = 0; i < props.length; i++) {                if (i != 0)                    s += ",";                prop = props[i];                s += prop + ":" + toStr(a[prop]);            }            s += "}";        }        return s;    case "undefined":        return "undefined";    case "string":        return a.__quote();    case "number":    case "bigfloat":        if (a == 0 && 1 / a < 0)            return "-0";        else            return a.toString();        break;    default:        return a.toString();    }}

function bjson_test(a){    var buf, r, a_str, r_str;    a_str = toStr(a);    buf = bjson.write(a);    if (0) {        print(a_str, "->", toHex(buf));    }    r = bjson.read(buf, 0, buf.byteLength);    r_str = toStr(r);    if (a_str != r_str) {        print(a_str);        print(r_str);        assert(false);    }}

function bjson_test_all(){    var obj;

    bjson_test({x:1, y:2, if:3});    bjson_test([1, 2, 3]);    bjson_test([1.0, "aa", true, false, undefined, null, NaN, -Infinity, -0.0]);    if (typeof BigInt !== "undefined") {        bjson_test([BigInt("1"), -BigInt("0x123456789"),               BigInt("0x123456789abcdef123456789abcdef")]);    }    if (typeof BigFloat !== "undefined") {        BigFloatEnv.setPrec(function () {            bjson_test([BigFloat("0.1"), BigFloat("-1e30"), BigFloat("0"),                   BigFloat("-0"), BigFloat("Infinity"), BigFloat("-Infinity"),                   0.0 / BigFloat("0"), BigFloat.MAX_VALUE,                   BigFloat.MIN_VALUE]);        }, 113, 15);    }

    /* tested with a circular reference */    obj = {};    obj.x = obj;    try {        bjson.write(obj);        assert(false);    } catch(e) {        assert(e instanceof TypeError);    }}

bjson_test_all();

前端:QuickJS到底能干什么相关推荐

  1. 学python培训到底能干嘛

    Python是在人工智能领域发挥着很重要的作用的,现在依旧有很多人对Python这项技术不是很了解,学Python培训到底能干嘛?下面小编来为大家做下详细的介绍. python其实并不难学,对于初学者 ...

  2. 学python能做什么-学Python后到底能干什么?网友:我太难了

    原标题:学Python后到底能干什么?网友:我太难了 一起涨姿势 感觉全世界营销文都在推Python,但是找不到工作的话,又有哪个机构会站出来给我推荐工作? 笔者冷静分析多方数据,想跟大家说:关于超越 ...

  3. 区块链学习笔记:区块链到底能干什么

    来源:区块律动BlockBeats 作者:Jade 编者语: 区块链媒体被大量封号,BAT 联手全网封杀,再到昨天的国家互金举报平台将「代币发行融资」纳入举报范围,还有网上谣传的所谓「利箭行动」. 最 ...

  4. 买一台服务器到底能干什么?可用于这7点!

    在生活中,相信很多人都有这样的疑问,买一台服务器到底能干什么,对此,摩杜云小杜今天就跟大家说一下买一天服务器到底能干什么,希望能帮助到大家,好了,下面我们就进入主题吧! 要知道,云服务器的应用是非常广 ...

  5. 1.学Python后到底能干什么?

    前言 现在刚就职于一家新公司,在新公司python没怎么使用,使用最多的还是java,在大数据平台的建设上面,使用的是java做前端接口,自己感觉自己的python学无用武之地了...这怎么能行呢?作 ...

  6. 学python能干嘛-学Python后到底能干什么?网友:我太难了

    原标题:学Python后到底能干什么?网友:我太难了 一起涨姿势 感觉全世界营销文都在推Python,但是找不到工作的话,又有哪个机构会站出来给我推荐工作? 笔者冷静分析多方数据,想跟大家说:关于超越 ...

  7. python语言能干什么-Python这么火到底能干啥?

    问题:Python这么火到底能干啥? 答: ·人工智能 Python是最适合人工智能的编程语言.同时,Python语法简洁清晰,简单易学,运行速度非常快,具有强大的库,可移植性,解释性,面向对象,可扩 ...

  8. c++能干什么_「CG原画插画教程」学画画到底能干什么?

    原标题:「CG原画插画教程」学画画到底能干什么? 艺学绘小编收集整理了学画画到底能干什么? 学画画到底能干什么?相信很多学画画的朋友们都被问过这个问题,那些对学画画有偏见的人,总觉得我们在" ...

  9. python入门先学什么-所以学完 Python 入门课的孩子到底能干啥?

    原标题:所以学完 Python 入门课的孩子到底能干啥? 画个四色螺旋线 ▼ 绘制一个五彩橡皮筋球 ▼ 弄一朵同心花瓣 ▼ 螺旋花瓣 ▼ 随机万花筒 ▼ 还可以搞些表情包 ▼ 以上是学完Python ...

最新文章

  1. Ubuntu10.10 配置ssh服务器及samba服务器
  2. 机器学习实战-回归算法-18
  3. 【英语学习】【医学】有机化学 - 烷的命名
  4. 中国已与36个国家(地区)海关实现“经认证的经营者”(AEO)互认
  5. [转]英特尔为什么能在CPU方面领跑?
  6. 整洁数据 —tidytext(一)
  7. python时间处理方法_基于python时间处理方法(详解)
  8. 拓端tecdat|R语言极值分析:分块极大值Block-maxima、阈值超额法threshold excess、广义帕累托分布GPD拟合降水数据时间序列
  9. mysql python用法_python-mysql基本用法
  10. 数学建模——蒙特卡罗模型
  11. 使360浏览器自动使用最高IE内核
  12. 沿海信标台站rbn-dgps的文献综述
  13. grpc实现流量染色
  14. 360锁屏壁纸在哪个文件夹
  15. 机器学习实战(入门级) ------ Kaggle 泰坦尼克号幸存者预测 (随机森林,KNN,SVM)
  16. android 时间水印相机,时间水印相机
  17. 中心极限与大数定理律的关系_CLT 中心极限定理
  18. 画图神器-drawio(配合markdown使用更佳)
  19. Pytorch - 分布式通信原语(附源码)
  20. java内嵌数据库_Java嵌入式数据库-MapDB

热门文章

  1. DM6446 OSD
  2. 联合体(union)和结构体(struct)的区别
  3. HALCON示例程序classify_image_class_mlp.hdev如何使用MLP分类器分割RGB图像
  4. 【pyqt5学习】——下拉框comboBox
  5. 【数据库学习笔记】——创建数据库连接对象connection
  6. 如何根据灰度直方图计算标准差_如何根据电器功率计算电线的粗细?
  7. C++ STL的查找算法
  8. tornado post第3方_[33]python-Web-框架-Tornado
  9. java迪杰斯特拉算法_迪杰斯特拉算法完整代码(Java)
  10. 【共读Primer】55.[6.4]函数重载--重载与作用域 Page210