暖夏少年|「实操演示」比肩V8的QuickJS入门指南

2019年末的某天,我在某个科技网站的报道中似乎听到了:神级程序员Fabrice Bellard手撸了一个类V8引擎,编译后不到1M,精简后可低至500k 。 当时马上到搜索引擎中寻找 , 找到了QuickJS的主页链接 bellard.org/quickjs。 抽空快速看了一下文档,立刻惊为天人,这不就是一个微型NodeJs核心吗?当时就打算入手试试 , 但手上没时间 , 就一直拖到了今天 。 这2天刚好休息,利用空闲时间动手了解了一下 , 以下做一个简单的实操教程 , 稍后有空将会制作成视频教程 。
注:以下为萧鸣本人全程实操,所有程序调用及编译都正常通过 , 并且得到最后结果,确保不浪费大家宝贵的时间 。
QuickJS是什么?QuickJS是一个小型且可嵌入的Javascript引擎 。 它支持 ES2020规范 , 包括模块 , 异步生成器 , 代理和BigInt 。 它可选地支持数学扩展 , 例如大十进制浮点数(BigDecimal) , 大二进制浮点数(BigFloat)和运算符重载 。
内置标准std的实现、os模块文件与系统操作模块的实现、多线程Worker、正则表达式、完整的模块引入机制 , 以及自定义动态链接库的引入 。
它的qjsc编译器,可以将你的js文件编译成单个可执行文件,通过优化后 , 体积可以缩小至500k左右,所以它非常适合使用在嵌入式设备 , 或者嵌入到其他项目中去 。
QuickJS是基于MIT协议发布的,大家可以访问它的官网并下载源码进行研究学习
神级作者1972年生的FabriceBellard , 神级程序员之一 。
暖夏少年|「实操演示」比肩V8的QuickJS入门指南法布里斯·贝拉 1972年生于法国
说说他的作品你就明白为什么称为神级了:
FFmpeg(流媒体和视频制作哪个不是用它做底层,20年前年幼的我看到各种解霸,感觉人家做媒体解码软件的太牛了,结果现在一看,bin文件夹下赫然躺着FFmpeg)
QEMU 最牛的模拟器谁用谁知道
他也是最快圆周率算法贝拉公式、TCCBOOT和TCC(微型C编译器)
好像还抽空搞了一个 TinyOpenGL
还用js写了一个可以运行在浏览器上的jsLinux(请自行查阅)
安装方式:源码安装(Linux与MacOS)make// setTimeout方法在os模块中os.setTimeout(() => {console.log("hello 萧鸣!")}, (500)); 保存文件,我们用qjs来解释执行它
> qjs test.js得到如下执行结果
暖夏少年|「实操演示」比肩V8的QuickJS入门指南用qjsc将test.js 编译成单个可执行文件// 必须将源码中的quickjs.h、quickjs-libc.h、libquickjs.a 三个文件拷贝到test.js同目录下// 如果怕麻烦,可以把你的文件拷贝到源码中进行编译> qjsc test.js -o test > ls> ./test这种编译成单个二进制文件的形式 , 不依赖任何外部环境与程序 , 去除一些当前项目不需要的库(比如正则库等)可以极大减小二级制文件的体积 , 可以精简至500k左右 。
而且因为QuickJS里内置了Worker,以及可以通过exec来调用外部程序 , 我们可以用它来做很多事情 , 比如文件监听、进程守护等 。
内置模块快速预览(具体请查询官网)std模块:
包含了常用的evalScript、loadScript、loadFile、open、popen、fdopen、tmpfile、puts、printf、sprintf、strerror、gc、getenv、urlGet、parseExtJSON
包装了libc的stdin、stdout、stderr 。
Error , 包含了常见的枚举对象,并可以自定义其他错误代码:EINVAL、EIO、EACCES、EEXIST、ENOSPC、ENOSYS、EBUSY、ENOENT、EPERM、EPIPE
FILE原型:
close、puts、printf、flush、seek、tell、tello、eof、error、clearerr、read、write、getline、readAsString、getByte、putByte


推荐阅读