
V8
V8是谷歌的开源高性能JavaScript和 WebAssembly 引擎,用C++编写。它被用于Chrome和 Node.js等项目中。V8实现了ECMAScript和 WebAssembly,在 Windows 7 或更新版本、macOS 10.12+和使用x64、IA-32、ARM 或 MIPS处理器的 Linux 系统上运行。V8可以独立运行,也可以嵌入到任何 C++应用程序中。
SpiderMonkey
SpiderMonkey是 Mozilla的 JavaScript 和 WebAssembly引擎,用于 Firefox、Servo 和其他各种项目中。它用 C++、Rust和 JavaScript 编写。你可以将它嵌入到 C++ 和 Rust项目中,并且可以作为独立的 shell运行。它也可以编译为 WASI;
JavaScriptCore
JavaScriptCore 框架提供了从 Swift、Objective-C 和基于C的应用程序中评估 JavaScript 程序的能力。你也可以使用JavaScriptCore将自定义对象插入到 JavaScript 环境中。
ChakraCore
ChakraCore 是一个具有 C API的 JavaScript引擎,你可以用它来为任何C或 C 兼容项目添加对JavaScript的支持。它可以在Linux、macOS 和 Windows上为x64 处理器编译。对于 Windows,还可以为 x86和 ARM编译。未来的目标是在Linux上支持x86 和 ARM处理器,在 macOS 上支持ARM。
QuickJS
QuickJS 是一个小型可嵌入的 JavaScript引擎。它支持 ES2020规范,包括模块、异步生成器、代理和BigInt。
它还可选择支持数学扩展,如大十进制浮点数(BigDecimal)、大二进制浮点数(BigFloat)和运算符重载。
主要特点:
- 小巧且易于嵌入:仅几个
C文件,无外部依赖,对于简单的hello world程序,x86代码仅210 KiB。 - 快速解释器,启动时间非常短:在台式机的单个核心上,大约在 100 秒内运行
ECMAScript测试套件的 75000 个测试。运行时实例的完整生命周期在不到 300 微秒内完成。 - 几乎完全支持
ES2020,包括模块、异步生成器和完整的附录 B 支持(向后兼容性)。 - 在选择
ES2020功能时,通过了几乎100%的ECMAScript测试套件测试。 - 可以将
JavaScript源代码编译成无需外部依赖的可执行文件。 - 使用引用计数进行垃圾收集(以减少内存使用并具有确定性行为),并进行循环移除。
- 数学扩展:
BigDecimal、BigFloat、运算符重载、bigint模式、math模式。 - 具有上下文着色的命令行解释器,实现在
JavaScript中。带有C库包装器的小型内置标准库。
txiki.js
txiki.js 是一个小巧而强大的 JavaScript运行时环境。它针对最新的 ECMAScript并实现了许多Web平台特性。
它建立在巨人的肩膀上:它使用 QuickJS-ng作为其JavaScript引擎,而 libuv则作为平台层。
Bun
Bun 是JavaScript 和 TypeScript 应用程序的一体化工具包。它作为一个名为 bun 的单个可执行文件发布。
其核心是 Bun 运行时,一个快速的 JavaScript运行时环境,设计为 Node.js的即插即用替代品。它用 Zig编写,并在底层由JavaScriptCore提供支持,大大减少了启动时间和内存使用。
Node.js
Node.js® 是一个开源的、跨平台的 JavaScript运行时环境。
Deno
Deno下一代 JavaScript运行时环境
- 默认安全
- 原生支持
TypeScript和JSX - 开箱即用的测试、
linting、格式化等功能 - 使用
Rust和Tokio实现高性能异步I/O - 与
Node.js和npm向后兼容
engine262
engine262 一个用 JavaScript实现的 ECMA-262实现
目标
- 100% 规范兼容性
- 内省
- 易于修改
非目标
- 在任何目标的损害下的速度 此项目受行为准则约束
Hermes
为 React Native 优化的JavaScript引擎
Duktape
Duktape Duktape是一个可嵌入的 JavaScript引擎,重点在于可移植性和小巧的占用空间。
Duktape易于集成到C/C++项目中:将 duktape.c、duktape.h 和 duk_config.h 添加到您的构建中,并使用 Duktape API从 C 代码中调用 ECMAScript 函数,反之亦然。
主要特性
- 可嵌入、可移植、小巧:可以在拥有 160kB 闪存和 64kB RAM 的平台上运行
ECMAScript E5/E5.1,具有一些从ES2015+更新的语义 - 部分支持
ECMAScript 2015(E6)和ECMAScript 2016(E7),请参阅Post-- ES5 feature status和kangax/compat-table -
ES2015 TypedArray和Node.js Buffer绑定 -
CBOR绑定 - 基于
WHATWG Encoding Living Standard的编码 API 绑定 performance.now()- 内置调试器
- 内置正则表达式引擎
- 内置
Unicode支持 - 最小化、可重新定位的平台依赖
- 结合引用计数和标记-扫描垃圾回收以及终结处理
- 并发
- 使用
ECMAScript ES2015 Proxy对象的属性虚拟化子集 - 用于缓存编译函数的字节码转储/加载
- 可分发包含可选的日志框架、基于
CommonJS的模块加载实现等 - 自由许可证(
MIT)
MuJS
MuJS是一个轻量级的 JavaScript解释器,旨在嵌入到其他软件中,以扩展其脚本功能。
MuJS 的设计重点是小巧、正确和简单。它用可移植的 C语言编写,并按照 ECMA-262 规范实现 ECMAScript。与本地代码绑定的接口被设计为尽可能简单易用,并且非常类似于 Lua。不需要与复杂的C++模板机制互动,也不必担心标记和取消标记垃圾收集根,或者与晦涩的构建系统抗争。
MuJS 由 Artifex Software 开发和维护。它最初是为 MuPDF 查看器开发的,但设计成可以作为独立组件使用。
MuJS 是根据ISC 许可证发布的免费开源软件。
nashorn
nashorn Nashorn引擎是 ECMAScript 第 5.1版语言规范的开源实现。它还实现了 ECMAScript 6 中引入的许多新特性,包括模板字符串、let、const和块作用域、迭代器和 for..of循环、Map、Set、WeakMap和 WeakSet数据类型、符号,以及二进制和八进制文字。它是用 Java编写的,并在Java虚拟机上运行。
Nashorn曾经是 JDK的一部分,直到 Java 14。这个项目提供了Nashorn的独立版本,适用于 Java 11及更高版本。
Nashorn是自由软件,根据 GPL v2许可证和Classpath 例外许可证发布,就像 JDK一样。
- (https://github.com/gfwilliams/tiny-js)
tiny-js(最初在 Google Code 上) 该项目旨在成为一个极其简单(约 2000 行)的JavaScript解释器,适用于需要简单、熟悉的脚本语言的应用程序,这些应用程序除了常规的C++库之外,不需要任何依赖项。它目前由两个源文件组成:一个包含解释器,另一个包含内置函数,如String.substring。
TinyJS 并不旨在快速或功能齐全。但它非常适用于脚本化简单行为,或者加载和保存设置。
不保证这是符合 JavaScript/EcmaScript 标准的。事实上欢迎提出建议,使其更接近符合标准,而不会过于复杂化代码,或者提供有用的测试用例以添加到测试套件中。
当前 TinyJS 支持:
- 变量、数组、结构
-
JSON解析和输出 - 函数
- 从
JavaScript调用C/C++代码 - 具有继承的对象(未完全实现)请参阅 CodeExamples 以查看有效的代码示例...
还有一个42tiny-js分支 - 这由 Armin维护,提供的 JavaScript 实现比 GitHub主分支更具特色。
elk
Elk 是一个小巧的可嵌入 JavaScript引擎,实现了 ES6的一个小但可用的子集。它专为微控制器开发。Elk 允许在 C 中开发的固件中添加 JavaScript自定义,而不是完全用 C/C++编写固件代码 - 这是让客户扩展/定制设备功能的好方法。
Elk的特性包括:
- 跨平台。可以在 8 位微控制器到 64 位服务器上运行
- 零依赖。可通过
ISO C或ISO C++编译器干净地构建 - 易于嵌入:只需将
elk.c和elk.h复制到您的源代码树中 - 小巧且简单的嵌入
API - 不使用
malloc。仅使用给定的内存缓冲区 - 占用空间小:闪存/磁盘约为
20KB,核心 VM 约为 100 字节RAM - 没有字节码。直接解释
JS代码
Elk的方法与其他脚本环境(如 micropython)不同,后者为所有内容提供了完整的 JS API。Elk完全裸露,甚至没有标准库。所有必需的功能都应从 C/C++ 固件导入,并且 JS代码只是调度事物。这使得Elk非常简单且可调整。
mjs
mJS是为资源有限的微控制器设计的。主要设计目标是:占用空间小和简单的 C/C++互操作性。mJS 实现了 ES6(JavaScript 第 6 版)的严格子集:
- 任何有效的
mJS代码都是有效的 ES6 代码。 - 任何有效的
ES6代码不一定是有效的mJS代码。
在 32 位 ARM 上,mJS引擎占用约 50k 的闪存空间,少于 1k 的 RAM(参见介绍文章)。mJS 是MongooseOS的一部分,用于为物联网设备启用脚本功能。
JerryScript
JerryScript 用于物联网的 JavaScript引擎
JerryScript 是轻量级的 JavaScript引擎,旨在运行在非常受限设备上,如微控制器:
- 引擎可用的
RAM仅有几千字节(<64 KB RAM) - 引擎代码的
ROM空间受限(<200 KB ROM)
该引擎支持设备上的编译、执行,并允许从JavaScript中访问外设。
Espruino Espruino 是微控制器的 JavaScript 解释器。它专为具有至少 128kB 闪存和 8kB RAM 的设备设计。
besen
BESEN是“B ero's E cma S cript E ngine”的缩写,它是用 Object Pascal完全实现的ECMAScript第五版,可以使用Delphi >=7 和 Free Pascal >= 2.5.1编译(也许也适用于 2.4.1)。
BESEN根据LGPL v2.1许可证分发,带有静态链接例外。
特点
- 完全实现了
ECMAScript第五版标准 - 拥有自己的基于字节码的
ECMA262-complaint正则表达式引擎 - 增量赞美/准确的标记和扫描垃圾收集器
-
Unicode UTF8/UCS2/UTF16/UCS4/UTF32支持(在ECMAScript级别,UCS2/UTF16) - 兼容模式,例如还有一个简单的
Javascript兼容模式 - 字节码编译器
- 基于调用子例程的寄存器型虚拟机
- 上下文线程化的 32 位
x86和 64 位x64/AMD64即时编译器(计划用于具有- VFPv3指令集的ARM CPU的ARMv7 EABI JIT) - 常量合并
- 无用代码删除
- 基于抽象语法树的优化
- 类型推断(精确和猜测)
- 基于对象结构和属性键 ID 的多态内联缓存
- 性能优化的哈希映射
- 自平衡树(例如,为了对哈希映射的链表项进行快速排序以非常快速地枚举数组对象)
- 易于集成的
Object Pascal类(通过RTTI每个属性和通过手动解析本地虚方法表的发布方法)