JavaScript 引擎、运行时和解释器的收藏列表

V8

V8 是谷歌的开源高性能JavaScriptWebAssembly 引擎,用C++编写。它被用于ChromeNode.js 等项目中。V8 实现了ECMAScriptWebAssembly,在 Windows 7 或更新版本、macOS 10.12+ 和使用 x64IA-32ARMMIPS 处理器的 Linux 系统上运行。V8 可以独立运行,也可以嵌入到任何 C++ 应用程序中。

SpiderMonkey

SpiderMonkey Mozilla JavaScriptWebAssembly 引擎,用于 FirefoxServo 和其他各种项目中。它用 C++Rust JavaScript 编写。你可以将它嵌入到 C++Rust 项目中,并且可以作为独立的 shell 运行。它也可以编译为 WASI

JavaScriptCore

JavaScriptCore 框架提供了从 SwiftObjective-C 和基于C的应用程序中评估 JavaScript 程序的能力。你也可以使用JavaScriptCore将自定义对象插入到 JavaScript 环境中。

ChakraCore

ChakraCore 是一个具有 C API JavaScript 引擎,你可以用它来为任何CC 兼容项目添加对JavaScript的支持。它可以在 LinuxmacOSWindows 上为 x64 处理器编译。对于 Windows,还可以为 x86 ARM 编译。未来的目标是在Linux上支持 x86ARM 处理器,在 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 源代码编译成无需外部依赖的可执行文件。
  • 使用引用计数进行垃圾收集(以减少内存使用并具有确定性行为),并进行循环移除。
  • 数学扩展:BigDecimalBigFloat、运算符重载、bigint 模式、math 模式。
  • 具有上下文着色的命令行解释器,实现在 JavaScript 中。带有C库包装器的小型内置标准库。

    txiki.js

    txiki.js 是一个小巧而强大的 JavaScript 运行时环境。它针对最新的 ECMAScript 并实现了许多Web平台特性。
    它建立在巨人的肩膀上:它使用 QuickJS-ng 作为其JavaScript引擎,而 libuv 则作为平台层。

    Bun

    Bun JavaScriptTypeScript 应用程序的一体化工具包。它作为一个名为 bun 的单个可执行文件发布。

其核心是 Bun 运行时,一个快速的 JavaScript 运行时环境,设计为 Node.js 的即插即用替代品。它用 Zig 编写,并在底层由JavaScriptCore提供支持,大大减少了启动时间和内存使用。

Node.js

Node.js® 是一个开源的、跨平台的 JavaScript 运行时环境。

Deno

Deno 下一代 JavaScript 运行时环境

  • 默认安全
  • 原生支持 TypeScript JSX
  • 开箱即用的测试、linting、格式化等功能
  • 使用 RustTokio 实现高性能异步 I/O
  • Node.js npm 向后兼容

    engine262

    engine262 一个用 JavaScript 实现的 ECMA-262 实现

目标

  • 100% 规范兼容性
  • 内省
  • 易于修改

非目标

  • 在任何目标的损害下的速度 此项目受行为准则约束

    Hermes

    React Native 优化的JavaScript引擎

    Duktape

    Duktape Duktape 是一个可嵌入的 JavaScript 引擎,重点在于可移植性和小巧的占用空间。

Duktape 易于集成到C/C++项目中:将 duktape.cduktape.hduk_config.h 添加到您的构建中,并使用 Duktape API C 代码中调用 ECMAScript 函数,反之亦然。

主要特性

  • 可嵌入、可移植、小巧:可以在拥有 160kB 闪存和 64kB RAM 的平台上运行
    ECMAScript E5/E5.1,具有一些从 ES2015+ 更新的语义
  • 部分支持 ECMAScript 2015(E6)ECMAScript 2016(E7),请参阅 Post-- ES5 feature statuskangax/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++模板机制互动,也不必担心标记和取消标记垃圾收集根,或者与晦涩的构建系统抗争。
MuJSArtifex Software 开发和维护。它最初是为 MuPDF 查看器开发的,但设计成可以作为独立组件使用。
MuJS 是根据 ISC 许可证发布的免费开源软件。

nashorn

nashorn Nashorn 引擎是 ECMAScript 第 5.1 版语言规范的开源实现。它还实现了 ECMAScript 6 中引入的许多新特性,包括模板字符串、letconst 和块作用域、迭代器和 for..of 循环、MapSetWeakMap 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.celk.h复制到您的源代码树中
  • 小巧且简单的嵌入 API
  • 不使用 malloc。仅使用给定的内存缓冲区
  • 占用空间小:闪存/磁盘约为 20KB,核心 VM 约为 100 字节 RAM
  • 没有字节码。直接解释 JS 代码

Elk 的方法与其他脚本环境(如 micropython)不同,后者为所有内容提供了完整的 JS APIElk 完全裸露,甚至没有标准库。所有必需的功能都应从 C/C++ 固件导入,并且 JS 代码只是调度事物。这使得Elk非常简单且可调整。

mjs

mJS 是为资源有限的微控制器设计的。主要设计目标是:占用空间小和简单的 C/C++ 互操作性。mJS 实现了 ES6JavaScript 第 6 版)的严格子集:

  • 任何有效的 mJS 代码都是有效的 ES6 代码。
  • 任何有效的ES6代码不一定是有效的 mJS 代码。

在 32 位 ARM 上,mJS 引擎占用约 50k 的闪存空间,少于 1k 的 RAM(参见介绍文章)。mJSMongooseOS的一部分,用于为物联网设备启用脚本功能。

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 >=7Free 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每个属性和通过手动解析本地虚方法表的发布方法)