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