前端:QuickJS到底能干什么
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到底能干什么相关推荐
- 学python培训到底能干嘛
Python是在人工智能领域发挥着很重要的作用的,现在依旧有很多人对Python这项技术不是很了解,学Python培训到底能干嘛?下面小编来为大家做下详细的介绍. python其实并不难学,对于初学者 ...
- 学python能做什么-学Python后到底能干什么?网友:我太难了
原标题:学Python后到底能干什么?网友:我太难了 一起涨姿势 感觉全世界营销文都在推Python,但是找不到工作的话,又有哪个机构会站出来给我推荐工作? 笔者冷静分析多方数据,想跟大家说:关于超越 ...
- 区块链学习笔记:区块链到底能干什么
来源:区块律动BlockBeats 作者:Jade 编者语: 区块链媒体被大量封号,BAT 联手全网封杀,再到昨天的国家互金举报平台将「代币发行融资」纳入举报范围,还有网上谣传的所谓「利箭行动」. 最 ...
- 买一台服务器到底能干什么?可用于这7点!
在生活中,相信很多人都有这样的疑问,买一台服务器到底能干什么,对此,摩杜云小杜今天就跟大家说一下买一天服务器到底能干什么,希望能帮助到大家,好了,下面我们就进入主题吧! 要知道,云服务器的应用是非常广 ...
- 1.学Python后到底能干什么?
前言 现在刚就职于一家新公司,在新公司python没怎么使用,使用最多的还是java,在大数据平台的建设上面,使用的是java做前端接口,自己感觉自己的python学无用武之地了...这怎么能行呢?作 ...
- 学python能干嘛-学Python后到底能干什么?网友:我太难了
原标题:学Python后到底能干什么?网友:我太难了 一起涨姿势 感觉全世界营销文都在推Python,但是找不到工作的话,又有哪个机构会站出来给我推荐工作? 笔者冷静分析多方数据,想跟大家说:关于超越 ...
- python语言能干什么-Python这么火到底能干啥?
问题:Python这么火到底能干啥? 答: ·人工智能 Python是最适合人工智能的编程语言.同时,Python语法简洁清晰,简单易学,运行速度非常快,具有强大的库,可移植性,解释性,面向对象,可扩 ...
- c++能干什么_「CG原画插画教程」学画画到底能干什么?
原标题:「CG原画插画教程」学画画到底能干什么? 艺学绘小编收集整理了学画画到底能干什么? 学画画到底能干什么?相信很多学画画的朋友们都被问过这个问题,那些对学画画有偏见的人,总觉得我们在" ...
- python入门先学什么-所以学完 Python 入门课的孩子到底能干啥?
原标题:所以学完 Python 入门课的孩子到底能干啥? 画个四色螺旋线 ▼ 绘制一个五彩橡皮筋球 ▼ 弄一朵同心花瓣 ▼ 螺旋花瓣 ▼ 随机万花筒 ▼ 还可以搞些表情包 ▼ 以上是学完Python ...
最新文章
- Ubuntu10.10 配置ssh服务器及samba服务器
- 机器学习实战-回归算法-18
- 【英语学习】【医学】有机化学 - 烷的命名
- 中国已与36个国家(地区)海关实现“经认证的经营者”(AEO)互认
- [转]英特尔为什么能在CPU方面领跑?
- 整洁数据 —tidytext(一)
- python时间处理方法_基于python时间处理方法(详解)
- 拓端tecdat|R语言极值分析:分块极大值Block-maxima、阈值超额法threshold excess、广义帕累托分布GPD拟合降水数据时间序列
- mysql python用法_python-mysql基本用法
- 数学建模——蒙特卡罗模型
- 使360浏览器自动使用最高IE内核
- 沿海信标台站rbn-dgps的文献综述
- grpc实现流量染色
- 360锁屏壁纸在哪个文件夹
- 机器学习实战(入门级) ------ Kaggle 泰坦尼克号幸存者预测 (随机森林,KNN,SVM)
- android 时间水印相机,时间水印相机
- 中心极限与大数定理律的关系_CLT 中心极限定理
- 画图神器-drawio(配合markdown使用更佳)
- Pytorch - 分布式通信原语(附源码)
- java内嵌数据库_Java嵌入式数据库-MapDB
热门文章
- DM6446 OSD
- 联合体(union)和结构体(struct)的区别
- HALCON示例程序classify_image_class_mlp.hdev如何使用MLP分类器分割RGB图像
- 【pyqt5学习】——下拉框comboBox
- 【数据库学习笔记】——创建数据库连接对象connection
- 如何根据灰度直方图计算标准差_如何根据电器功率计算电线的粗细?
- C++ STL的查找算法
- tornado post第3方_[33]python-Web-框架-Tornado
- java迪杰斯特拉算法_迪杰斯特拉算法完整代码(Java)
- 【共读Primer】55.[6.4]函数重载--重载与作用域 Page210