实在用不惯ubuntu环境,只好搭建windows编译环境 quickjs选择的是cpp包装:https://github.com/ftk/quickjspp 参考Clion 2016.3.4 + clion打开quickjspp目录,选择cmake项目,然后需要在run-->edit configures修改如下: qjs配置 其中hello.js来自https://github.com/quickjs-zh /QuickJS,直接把里面的examples目录复制过来 工作路径当然设置quickjspp所在路径 代码编译的时候,clock_gettime函数找不到,网上搜索了说这个函数windows不支持,
如下以下c程序1.c 运行一段JS脚本 #include <stdio.h> #include "quickjs-libc.h" #include <string.h> int main(int argc ctx = JS_NewContext(rt); js_std_add_helpers(ctx, 0, NULL); const char *scripts = "console.log('hello quickjs } console.log('I is JS CODE '); console.log(calculate(1)); console.log('hello,quickJS 将如上js代码编译也字节码 /* File generated automatically by the QuickJS compiler. */ #include "quickjs-libc.h" 引擎,ES2015标准 把运行时txiki.js入进dll中,可完整使用JS运行时的各项功能 完整整合JS引擎和JS运行时 通过魔改quickjs,使得VFP能够调用JavaScript脚本,能够修改、
1,给quickjs增加一个JS_CloneValue的api。 2,给quickjs增加index callback。这是对应v8里的IndexedPropertyHandlerConfiguration操作。
VFP里面运行JS,可以利用JS很多很多资源,做到以前不能做到的事情,那今天更高级的混合方式来了,混合quickjs来做一些很酷的工作。 首先来看quickjs引擎能做的工作,将JS文件编译成EXE 1 如下JS文件Hello.js console.log("Hello World"); 2 点开始菜单运行CMD,进行DOS环境,执行如下指令 ,生成hello.js文件 qjsc -e -o hello.c hello.js 生成的hello.c文件 /* File generated automatically by the QuickJS compiler. */ #include "quickjs-libc.h" const uint32_t qjsc_hello_size = 78; const uint8_t qjsc_hello
4.QuickJS mobile_JSVM_quickjs 正式介绍 QuickJS 前我们先说说它的作者:Fabrice Bellard。 引擎中,QuickJS 的性能还是很耀眼的 在内存占用上,QuickJS 远低于 V8,毕竟 JIT 是是吃内存的大户,而且 QuickJS 的设计对嵌入式系统很友好(Bellard 成就奖杯 ? 我一开始以为 QuickJS 和 Hermes 一样,可以直接生成字节码,然后交给 QuickJS 解释执行。 首先是 QuickJS 的调试功能支持。 /blog/9/ [25] 生成字节码: https://bellard.org/quickjs/quickjs.html#Bytecode [26] vscode-quickjs-debug: https
有这样一个需求:多线程条件下执行交易,每个交易都会通过quickjs回调c++代码的函数,而这个函数使用的数据又来自于当前的交易 首先不考虑用全局变量来保存交易的数据,因为js回调c函数的时候我们无法在回调函数中区分当前属于哪个交易 一个简单的思路是c代码创建交易的类,然后把类的函数传递给quickjs,然后在js中调用这个类的函数,但是这个实现不了,因为quickjs没有注入非静态成员函数的接口,其原因文章非static成员函数通过类名 endl; return 1; } } 执行结果如下: Hello, world 5.500000 Hello, world 3.000000 这样一来,每个交易的数据都是独立在quickjs
__proto__, "values", {"enumerable":false,"configurable":true,"writable":true}); </script> 在quickjs mb 要解决这问题得给quickjs加个新api。 2, uint8array 没实现。
本文会介绍这背后的技术演进,共有这么几个部分: QuickJS 方案演化历程 从 QuickJS 到 Dart VM 的探索 Dart VM 迁移实践经验 复盘总结 QuickJS 方案演化历程 稿定的跨端工程最早始于笔者一项出于业余兴趣的个人实验 ,即尝试用 QuickJS 结合 libuv 来接入平台 IO 能力,并在此基础上绑定 Skia 来实现 Canvas 渲染。 执行交互逻辑的 QuickJS 线程和执行渲染的 Skia 线程独立运作,QuickJS 每次事件回调中提交的更新不再需要被全部绘制,而是只在渲染线程空闲时绘制最新的任务,同时清空任务队列,从而实现避免卡顿的跳帧能力 然而,如果单纯将 QuickJS 换成 Dart VM,并不能解决业务层开发技术栈分歧的问题。 如果把 Dart VM 比喻成我们吃饱的第四个包子,那么 QuickJS 就是前三个——没有办法只靠吃最后一个就吃饱。
4.QuickJS mobile_JSVM_quickjs 正式介绍 QuickJS 前我们先说说它的作者:Fabrice Bellard。 JS 引擎中,QuickJS 的性能还是很耀眼的 在内存占用上,QuickJS 远低于 V8,毕竟 JIT 是是吃内存的大户,而且 QuickJS 的设计对嵌入式系统很友好(Bellard 成就奖杯 我一开始以为 QuickJS 和 Hermes 一样,可以直接生成字节码,然后交给 QuickJS 解释执行。 首先是 QuickJS 的调试功能支持。 /blog/9/ [25] 生成字节码: https://bellard.org/quickjs/quickjs.html#Bytecode [26] vscode-quickjs-debug: https
1.QuickJS作者简介 法布里斯·貝拉 (Fabrice Bellard) 2.QuickJS简介 QuickJS 是一个小型的嵌入式 Javascript 引擎。 quickjs-opcode.h /// 字节码操作符定义 ├── 1.81MB quickjs.c ├── 41.9kB quickjs.h 工作原理 QuickJS的解释器是基于栈的。 QuickJS的对byte-code会优化两次,通过一个简单例子看看QuickJS的字节码与优化器的输出,以及执行过程。 : qjsc -o add_exec examples/add.js 7.给qjsc添加扩展 QuickJS只实现了最基本的JavaScript能力,同时QuickJS也可以实现能力的扩展,比如给QuickJS
radix64 quickjs-rs: Quickjs Javascript引擎的Rust包装 #quickjs quickjs-rs
在2019年推出支持完整ES2023标准、性能卓越的QuickJS引擎后,Bellard再次将目光投向“小处”。 二、核心设计哲学:为“生存”而做的减法MicroQuickJS并非QuickJS的“迷你版”或“阉割版”,而是一个基于全新设计的、独立的代码库,与QuickJS共享部分解析器代码,但内核机制截然不同。 革命性的内存管理:追踪式垃圾回收与大多数轻量级引擎(包括QuickJS)采用引用计数不同,MicroQuickJS大胆采用了追踪式垃圾回收器。 Willison成功将其编译为WebAssembly,并创建了交互式网页 playground,其加载体积仅303KB,远小于完整版QuickJS的2.28MB。 四、与QuickJS的定位分野很多人会问,既然有了QuickJS,为何还需要MicroQuickJS?
quickjs并没有导出Symbol.iterator相关的接口,需要我们自行添加一下。 主要的添加点是:JS_NewAtomWithSymbol、JS_SymbolGetIterator 也就是把quickjs自己用的JS_ATOM_Symbol_iterator(这是个常量)导出来。 ); for(var key of keys) { console.log("key::" + key); } 这种遍历keys的调用方式,我发现只要给searchParams注册了next函数,quickjs
可选引擎对比 除了JSC,常见的开源引擎包括V8、QuickJS、Hermes。 Hermes和QuickJS支持直出Bytecode,并且在包大小上对比V8和JSC占优。 QuickJS一骑绝尘,Hermes紧跟其后,JSC次之,V8最差; 执行效率对比(越高越好) 使用引擎跑一些开源的算法或者知名JS功能库。 ,以QB首页Feed流(3.8M左右)举例,JSC和V8均输入原始js文件,QuickJS和Hermes输入JS编译后的Bytecode文件。 QuickJS的,另外Hermes有Facebook的React Native社区生态支持,相较于QuickJs更新演进更快,所以更倾向使用Hermes来替换JSC。
https://reorchestrate.com/posts/plugins-for-rust/ 使用quickjs-wasm-rs 和 wasmtime 为Rust程序实现一个安全的隔离的插件系统。 https://github.com/seddonm1/quickjs 专题知识:RCU - read-copy update (1) The original "vanilla" RCU, (2) Sleepable https://github.com/Shopify/javy/tree/main/crates/quickjs-wasm-rs https://github.com/Shopify/javy untex
可选引擎对比除了JSC,常见的开源引擎包括V8、QuickJS、Hermes。 Hermes和QuickJS支持直出Bytecode,并且在包大小上对比V8和JSC占优。 图片QuickJS一骑绝尘,Hermes紧跟其后,JSC次之,V8最差;执行效率对比(越高越好)使用引擎跑一些开源的算法或者知名JS功能库。 支持提前预编译的Hermes和QuickJS,加载速度以及内存表现是最好的;对于提高TTI,加载速度指标最为重要。 QuickJS的,另外Hermes有Facebook的React Native社区生态支持,相较于QuickJs更新演进更快,所以更倾向使用Hermes来替换JSC。
市面上能找到的开源js引擎:V8,jscore,spidermonkey,quickjs,duktape。。。 而以quickjs,duktape为代表的小众js引擎优点是体积小,300k ~ 600K,然后没太多特别的地方,或者quickjs对标准的支持比较激进算一个,甚至还在提案中的操作符重载都支持了。 体积么,V8在各架构上大概是8M~16M,虽说比quickjs大,但在如今问题不大,可能一次小增量更新就不止这数。
关于LLM驱动漏洞利用的即将到来的工业化进程最近我进行了一项实验,基于Opus 4.5和GPT-5.2构建智能体,挑战它们为QuickJS Javascript解释器中的一个零日漏洞编写漏洞利用代码。 在最艰巨的任务中,我要求GPT-5.2将指定字符串写入磁盘的指定路径,同时启用以下防护:地址空间布局随机化、非可执行内存、完整RELRO、QuickJS二进制上的细粒度CFI、硬件强制影子栈、阻止shell 执行的seccomp沙箱,以及被我剥离了所有操作系统和文件系统访问功能的QuickJS版本。 我们可以观察为QuickJS生成的漏洞利用及其生成方式,并像我一样得出结论:LLM似乎现在或在不远的将来就能解决这些问题。但在实际投入token并看到结果之前,我们不能下定论。 由于这个QuickJS漏洞在我发现之前(更准确地说:是我的Opus 4.5漏洞发现智能体发现的)是不存在的,因此这些利用链本身是全新的。
听闻 Fabrice Bellard 大神的 QuickJS 只几万行代码就完整支持了 ES2020 标准,决定先从代码量小一些的 QuickJS 出发,然后大概看看 V8 的实现。 QuickJS 的 Array Index 排序实现 QuickJS 的实现在 quickjs.c 的 7426 行的 JS_GetOwnPropertyNamesInternal 方法中,判断是否为 array index 的逻辑位于 quickjs.c:7471 的 JS_AtomIsArrayIndex 方法。 // 位于 quickjs.c:3104 /* return TRUE if the atom is an array index (i.e. 0 <= index <= 2^32-2 and return 相比之下 QuickJS 会更容易上手些。
听闻 Fabrice Bellard 大神的 QuickJS 只几万行代码就完整支持了 ES2020 标准,决定先从代码量小一些的 QuickJS 出发,然后大概看看 V8 的实现。 QuickJS 的 Array Index 排序实现 QuickJS 的实现在 quickjs.c 的 7426 行的 JS_GetOwnPropertyNamesInternal 方法中,判断是否为 array index 的逻辑位于 quickjs.c:7471 的 JS_AtomIsArrayIndex 方法。 // 位于 quickjs.c:3104 /* return TRUE if the atom is an array index (i.e. 0 <= index <= 2^32-2 and return 相比之下 QuickJS 会更容易上手些。