OurJS


OurJS-我们的JS, 我们的技术-IT文摘; 专注JS相关领域;
我们热爱编程, 我们热爱技术;我们是高大上, 有品味的码农;

欢迎您订阅我们的技术周刊


我们会向您分享我们精心收集整理的,最新的行业资讯,技术动态,外文翻译,热点文章;
我们使用第三方邮件列表向您推送,我们不保存您的任何个人资料,注重您的隐私,您可以随时退订,

欢迎分享您的观点,经验,技巧,心得

让我们一起找寻程序员的快乐,探索技术, 发现IT人生的乐趣;


本网站使用缓存技术每次加载仅需很小流量, 可在手机中流畅浏览;
如果您发现任何BUG,请即时告知我们: ourjs(at)ourjs.com

在嵌入式设备树莓派上编译QuickJS教程:一个C语言编写的极简JavaScript引擎


分享到


分类 JS学习   关键字 JavaScript   发布 ourjs  1563211266482
注意 转载须保留原文链接,译文链接,作者译者等信息。  
QuickJS 是一个完全由C语言编写的极小型JavaScript引擎,作者是大名鼎鼎的FFmpeg和QEMU的创建者Fabrice Bellard以及C专家Charlie Gordon。

QuickJS采用开源MIT协议,不限制商业用途。它是一个“小而完整的JavaScript引擎”,支持最新的ES2019语言规范。

它可选支持数学扩展,例如大整数 (BigInt),大浮点数 (BigFloat) 以及运算符重载。

主要功能


轻量而且易于嵌入:只需几个C文件,没有外部依赖,一个 x86 下的简单的“hello world”程序只要 180 KiB。
具有极低启动时间的快速解释器: 在一台单核的台式 PC 上,大约在 100 秒内运行 ECMAScript 测试套件 56000 次。运行时实例的完整生命周期在不到 300 微秒的时间内完成。
几乎完整实现 ES2019 支持,包括: 模块,异步生成器和和完整 Annex B 支持 (传统的 Web 兼容性)。
通过 100% 的 ECMAScript Test Suite 测试。
可以将 Javascript 源编译为没有外部依赖的可执行文件。
使用引用计数(以减少内存使用并具有确定性行为)的垃圾收集与循环删除。
数学扩展:BigInt, BigFloat, 运算符重载, bigint 模式, math 模式.
在 Javascript 中实现的具有上下文着色和完成的命令行解释器。
采用 C 包装库构建的内置标准库。


在ARM芯片上编绎

经过实测QuickJS可以在RaspberryPi等arm平台linux系统编绎通过。编绎过程也非常简单。

下载并解压源码:

wget https://bellard.org/quickjs/quickjs-2019-07-09.tar.xz
xz -d quickjs-2019-07-09.tar.xz
tar -xf quickjs-2019-07-09.tar



然后可以切换到解压目录,进行编绎。

root@onceairliteplus:~# cd quickjs-2019-07-09/
root@onceairliteplus:~/quickjs-2019-07-09# make install

make install 编绎时出现了一个错误 -m32 参数未定义,可能作者目前还没有在arm平台的debian的64位系统上测试过,如下所示:

libregexp.bn.o .obj/libunicode.bn.o .obj/cutils.bn.o .obj/quickjs-libc.bn.o .obj/libbf.bn.o -lm -ldl
gcc -g -Wall -MMD -MF .obj/run-test262.o.d -Wno-array-bounds -D_GNU_SOURCE -DCONFIG_VERSION=\"2019-07-09\" -O2 -flto -c -o .obj/run-test262.o run-test262.c
gcc -g -flto -o run-test262 .obj/run-test262.o .obj/quickjs.o .obj/libregexp.o .obj/libunicode.o .obj/cutils.o .obj/quickjs-libc.o -lm -ldl -lpthread
gcc -g -Wall -MMD -MF .obj/run-test262.bn.o.d -Wno-array-bounds -D_GNU_SOURCE -DCONFIG_VERSION=\"2019-07-09\" -O2 -flto -DCONFIG_BIGNUM -c -o .obj/run-test262.bn.o run-test262.c
gcc -g -flto -o run-test262-bn .obj/run-test262.bn.o .obj/quickjs.bn.o .obj/libregexp.bn.o .obj/libunicode.bn.o .obj/cutils.bn.o .obj/quickjs-libc.bn.o .obj/libbf.bn.o -lm -ldl -lpthread
ln -sf qjsbn qjscalc
gcc -m32 -g -Wall -MMD -MF .obj/qjs.m32.o.d -Wno-array-bounds -D_GNU_SOURCE -DCONFIG_VERSION=\"2019-07-09\" -O2 -flto -c -o .obj/qjs.m32.o qjs.c
gcc: error: unrecognized command line option ‘-m32’

这个参数的作用应该是强制编绎成32位兼容的二进制,由于Pis ARM CPU不支持指定32位或64位模式,因此两个标志都被省略了。所以ARM的编绎器显然不认识这个参数。修复也非常简单,将 Makefile 中的 '-m32' 全部删除即可。

QuickJS使用

编绎成功后, 会生成一个大约 3M 左右的可执行文件: qjs,输入即可进入运行环境:



我们这里打印了当前时间。

将JavaScript编绎成可执行文件


quickjs支持直接将js编绎成二进制。从编绎后的文件大小来写,应该是将qjs和js文件进行了合并:

root@onceairliteplus:~/quickjs-2019-07-09# ./qjs examples/hello.js
Hello World
root@onceairliteplus:~/quickjs-2019-07-09# ./qjsc -o hello examples/hello.js
root@onceairliteplus:~/quickjs-2019-07-09# ./hello
Hello World

如上所示, hello 是和 qjs 文件大小差不多的可执行文件。


前途光明


因为其复杂度要远远低于用C++编写的Google的V8和Mozilla的SpiderMonkey,因此非常适合在嵌入式设备上使用。
因为完全由C语言编写,可以很方便地集成到一些著名的C语言程序比如,替换掉Redis和Nginx中的Lua脚本。
由于可以单独将JS编绎成可执行文件,应用场景更加广泛。
社区评论 ( Beta版 )
OnceDoc 您自己的企业内容管理系统——文档、流程、知识库、报表、网盘All In One

访问404页面,寻找丢失儿童
 热门文章 - 分享最多
  1. Node.JS用RSA签名算法公钥加密私钥解密,实现License软件授权验证
  2. Node.JS在命令行中检查Chrome浏览器是否安装,并打开指定网址
  3. 使用JavaScript的Proxy监听对象属性变化并进行类public/private的访问控制
  4. 树莓派4对比测试:性能提升3倍启动时间反而变慢?TF卡成最大瓶颈
  5. JavaScript求一个字符串的字节长度
  6. Node.JS借助OS模块获取当前Windows系统用户登录名
  7. GO有语法缺陷,缺少泛型、public/private、三元运算符?我不喜欢 Go 语言的十个理由
  8. 在嵌入式设备树莓派上编译QuickJS教程:一个C语言编写的极简JavaScript引擎
  9. Node.JS的竞争对手?QuickJS入门教程,使用os模块读写文件,并将JavaScript编绎成可执行文件
  10. 用 OnceAir 搭建个人Git/Svn/照片备份服务器,每年电费7块钱

 相关阅读 - JS学习
  1. Node.JS的竞争对手?QuickJS入门教程,使用os模块读写文件,并将JavaScript编绎成可执行文件
  2. 在嵌入式设备树莓派上编译QuickJS教程:一个C语言编写的极简JavaScript引擎
  3. 使用JavaScript的Proxy监听对象属性变化并进行类public/private的访问控制
  4. JavaScript求一个字符串的字节长度
  5. Node.JS用RSA签名算法公钥加密私钥解密,实现License软件授权验证
  6. Node.JS借助OS模块获取当前Windows系统用户登录名
  7. JavaScript中将字符串true或false转换成Boolean类型
  8. jQuery用$.prop,$.attr方法来获取或设置checkbox当前选中状态
  9. Node.JS中用concat和push连接两个或多个数组的性能比较
  10. 判断是否为对象typeof abc == 'object' 与 instanceof 性能比较

 关键字 - JavaScript
  1. 少年,不要滥用箭头函数啊:JS中lambda表达式的优缺点和使用场景
  2. 用JavaScript获取当月第一天和最后一天
  3. 让pre和textarea等HTML元素去掉滚动条自动换行自适应文本内容高度
  4. ES6中的Map与JSON的相互转化(序列和持久化)
  5. Facebook发布全新JavaScript引擎Hermes:越来越像Java字节码,JS要统一全端?
  6. 在嵌入式设备树莓派上编译QuickJS教程:一个C语言编写的极简JavaScript引擎
  7. 为什么我不建议你将JavaScript作为主力语言
  8. 使用JavaScript的Proxy监听对象属性变化并进行类public/private的访问控制
  9. Node.JS中UDP打洞穿透内网路由,架设内网服务器技术详解及源码
  10. JavaScript求一个字符串的字节长度

 欢迎订阅 - 技术周刊

我们热爱编程, 我们热爱技术; 我们是高端, 大气, 上档次, 有品味, 时刻需要和国际接轨的码农; 欢迎您订阅我们的技术周刊; 您只需要在右上角输入您的邮箱即可; 我们注重您的隐私,您可以随时退订.
加入我们吧! 让我们一起找寻码农的快乐,探索技术, 发现IT人生的乐趣;


 关注我们

我们的微信公众号: ourjs-com
打开微信扫一扫即可关注我们:
IT文摘-程序员(码农)技术周刊

ourjs官方微信号