作者:北漂123 | 来源:互联网 | 2023-09-16 08:30
枚举和分析40+非v8实现的JavaScript-原文链接:https:notes.eatonphil.comjavascript-implementations.htmlV
原文链接:https://notes.eatonphil.com/Javascript-implementations.html
V8
,毫无疑问,是目前使用范围最广的 Javascript
引起。v8
使用在 Chrome
(和Chrome
的插件)、Microsoft Edge
、Node.js
等等... Safari
浏览器的 JavascriptCore
以及火狐的 SpiderMonkey
也被认为是 Javascript
引擎中最有竞争力的。
但是其他 Javascript
引擎呢?如果我想要在 C
、 Go
、Rust
、Java
(等等....)中嵌入Javascript
该怎么办 ? 又或者如果我想要在单片机运行 Javascript
?或者将其用作语言研究的基础? ? 目前,已经存在许许多多 Javascript
引擎帮助我们实现上述功能。
这篇文章就会讲述一些 Javascript
引擎以及他们背后的实现选择。我并不会在这篇文章提及 v8
、JavascriptCore
和 SpiderMonkey
因为他们实在是太过复杂了,暗藏了许多复杂的技术实现。而且,你其实已经对他们有所了解。
我会弄错一些Javascript引擎的实现细节,如果出错请在Tweet 或者 email 联系我。我对纯研究特别感兴趣;以及 Javascript
的商业、闭源实现。
企业版
这些 Javascript
引擎对于您自己的商业、生产应用程序来说是有意义的。
在 JVM 运行
- Oracle's GraalJS: 将
Javascript
解析为 JVM
字节码 或者 GraalVM
- Support: 最新的 ECMA 标准
- 实现语言: Java
- Runtime: GraalVM or stock JDK
- Parser: 内部实现
- 发布: 2019?
- Note:将 Nashorn 替换为 JDK 中的默认 Javascript 实现。
- Mozilla's Rhino: 将
Javascript
解析为 JVM
字节码
- Support: ES6
- 实现语言: Java
- Runtime: 即可通过自定义字节码 VM 进行解析,也可通过在编译为 JVM 字节码后作为优化进行解析
- Parser: 内部实现
- 发布: 1998?
- Note: 被 Nashorn 取代为 JVM 上的默认 Javascript 引擎,目前还在开发中。
- Oracle's Nashorn: 将
Javascript
解析为 JVM
字节码
- Support: ES5
- 实现语言: Java
- Runtime: 编译为 JVM 字节码
- Parser: 内部实现
- 发布: 2012?
- Note: 将 Rhino 替换为 JVM 上的默认 Javascript 实现。最近被 GraalJS 取代,目前还在开发中。
可嵌入
- Nginx's njs
- Support: ES5
- 实现语言: C
- Runtime: VM字节码
- Parser: 内部实现
- ChowJS: 面向游戏开发者的基于
QuickJS
的专有 AOT
编译器
- Support: 取决于
QuickJS
的支持程度 (更多内容请参考 QuickJS
)
- 实现语言: 大概是C
- Runtime:
QuickJS
的字节码解释器和 AOT
编译器
- Parser: 大概是
QuickJS
- 发布: 2021
- Notes: 代码不可用,因此目前无法对这些点进行精确分析。
译者注:
QuickJS
:https://github.com/quickjs-zh/QuickJS
AOT
,全程为Ahead of Time
,指运行前进行编译,是一个程序的编译方式。与之相对的就是JIT(Just-in-time)
,即时编译,边运行边编译,像v8
就是采用JIT
的编译方式。
- Artifex's mujs
- Support: ES5
- 实现语言: C
- Runtime: 面向字节码堆栈的 VM
- Parser: 内部实现
- 发布: 2017?
- Notes: 最初是
MuPDF
查看器的一部分, 但现在突破了。感谢@rwoodsmalljs 的提及!
嵌入式系统
- Samsung's Escargot
- Support: ES2020
- 实现语言: C++
- Runtime: 字节码虚拟机
- Parser: 内部实现
- 发布: 2017?
- Espruino
- Support: ES5, ES6, ES7/8
- 实现语言: C
- Runtime: 似乎没有 AST/中间形式的直接递归解析
- Parser: 内部实现
- 发布: 2012?
- Cesanta's Elk
- Support: 部分 ES6
- 实现语言: C
- Runtime: 没有 AST 或字节码 VM 的直接递归解释器
- Parser: 内部实现
- 发布: 2019?
- Notes: 它使用 GC 和 FFI 在 1400 行可读 C 代码中实现了功能。很强。
- Cesanta's mJS
- Support: 部分 ES6
- 实现语言: C
- Runtime: 字节码虚拟机
- Parser: 内部实现
- 发布: 2017?
- Moddable's XS
- Support: ES2018
- 实现语言: C
- Runtime: 字节码虚拟机
- Parser: 内部实现
- 发布: 2017?
- Notes: 更多细节请访问链接 https://www.moddable.com/XS7-TC-39 和https://www.moddable.com/faq#what-is-xs.
其他
- Facebook's Hermes
- Support: ES6 和 exceptions
- 实现语言: C++
- Runtime: 字节码虚拟机
- Parser: 内部实现
- 发布: 2019?
- Qt's V4
- Support: ES5
- 实现语言: C++
- Runtime: 字节码虚拟机 and
JIT
编译器
- Parser: qlalr 自定义解析器生成器
- 发布: 2013
- Notes: 不清楚是否可以在
Qt
之外独立运行。
我不知道应不应该把微软的 ChakraCore
放到这个还是下一个。我会把它放在这里,但请注意,截至 2021 年,他们正在将其转变为社区驱动的项目。
- Microsoft's ChakraCore
- Support: ES6,后面有可能会支持更多
- 实现语言: C++
- Runtime: 字节码虚拟机 和 x86/ARM 上的 JIT
- Parser: 内部实现
- 发布: 2015?
社区版
Implementations toward the top are more reliable and proven. Implementations toward the bottom less so.
顶层的应用程序有很多人都会使用并且验证其可靠性。但是哪些底层应用(例如操作系统内核、语言解析引擎)则很少人关注。
If you are a looking to get involved in language development, the implementation further down on the list can be a great place to start since they typically need work in documentation, testing, and language features.
如果您想参与语言开发,列表后面的内容可能是一个很好的开始项目,因为它们通常需要在文档、测试和语言功能方面进行工作。
- Fabrice Bellard's QuickJS
- Support: ES2020
- 实现语言: C
- Runtime: Bytecode VM (这个一个非常庞大的文件)
- Parser: Hand-written 这个一个非常庞大的文件)
- 发布: 2019
- DuktapeJS
- Support: ES5, 部分 ES6/ES7
- 实现语言: C
- Runtime: Bytecode VM
- Parser: 内部实现, 不会生成
AST
树,直接语言解析执行
- 发布: 2013
- engine262
- Support: 100% 符合规范标准
- 实现语言: Javascript
- Runtime: AST interpreter
- Parser: 内部实现
- JerryScript
- Support: ES5
- 实现语言: C
- Runtime: Bytecode VM
- Parser: 内部实现
- 发布: 2016?
- Serenity's LibJS
- Support: 目前向规范靠近
- 实现语言: C++
- Runtime: Bytecode VM
- Parser: 内部实现
- Notes: 也可能在 Serenity 之外工作,但很难找到在 Linux 上构建/运行它的文档。
- goja: Go 实现的 Javascript 解析器
- Support: ES5
- 实现语言: Go
- Runtime: Bytecode VM
- Parser: 内部实现
- 发布: 2017?
- otto: Go 实现的 Javascript 解析器
- Support: ES5
- 实现语言: Go
- Runtime: AST interpreter
- Parser: 内部实现
- 发布: 2012?
- Notes: 仅 AST 解释器的实现可能表明此实现比 Goja 慢。我没有这方面的比较标准。
- Jurassic: .NET 的 Javascript 解析器和解释器
- Support: ES5
- 实现语言: C#
- Runtime: 编译为 .NET
- Parser: 内部实现
- 发布: 2011?
- Jint
- Support: ES5, 部分 ES6/7/8
- 实现语言: C#
- Runtime: AST interpreter
- Parser: 使用.NET内部实现
- 发布: 2014?
- Notes: 感谢 fowl2 的提出!
- NiL.JS
- Support: ES6
- 实现语言: C#
- Runtime: AST interpreter
- Parser: 内部实现
- 首次发布: 2014?
- Neil Fraser's JS-Interpreter
- Support: ES5
- 实现语言: Javascript
- Runtime: AST interpreter
- Parser: Hand-written, uses Acorn
- 首次实现: 2014?
- BESEN: Object Pascal 中的字节码 VM 和 JIT 编译器
- Support: ES5
- 实现语言: Object Pascal
- Runtime: Bytecode VM with JIT for x86 and x86_64
- Parser: Hand-written
- 发布: 2015?
最后几个不是玩具,但它们也更具实验性,或者在 AssemblyScript
的情况下,不是 Javascript。
- boa: Rust 实现的 Javascript 解释器
- Support: 未知
- 实现语言: Rust
- Runtime: Bytecode VM
- Parser: 内部实现
- 首次发布: 2019?
- AssemblyScript
- Support: 部分 Typescript
- 实现语言:TypeScript 的 AssemblyScript 子集
- Runtime: webassembly
- Parser: 内部实现
- Javascript in Kawa Scheme
- Javascript in GNU Guile Scheme
研究实现
- Higgs
- Support: 未知
- 实现语言: D
- Runtime: Bytecode VM 和 JIT compiler on x64
- Parser: 内部实现
- eJS
- Support: 未知
- 实现语言: Java
- Runtime: Bytecode VM
- Parser: ANTLR
- Notes:
eJS
是一个框架,用于生成专门用于应用程序的 Javascript 虚拟机。
- Jessie: Javascript 不可利用智能合约的安全子集
- Support: 部分 ES2017
- ???
- 请阅读网站 https://github.com/agoric-labs/jessica 获取更多内容.
- https://github.com/b9org/b9
- https://www.defensivejs.com/
感谢@smarr](https://twitter.com/smarr) 提出 eJS, Higgs, and b9!
已废弃
- DMDScript
- Support: 未知
- 实现语言: D
- Runtime: Bytecode VM
- Parser: 自行实现
- Notes: 这可能是由 DigitalMars 进行商业维护的,但我不确定。此 repo 中还引用了可能商业化的 DMDScript 的另一个 C++ 实现。感谢@moon_chilled 的提及!
- EchoJS
- Support: 未知
- 实现语言: Javascript
- Runtime: LLVM
- Parser: 使用 Esprima 自行实现
- twostroke
- Support: 未知
- 实现语言: Ruby
- Runtime: Bytecode VM
- Parser: 内部实现
- PyPy-JS
- Support: 未知
- 实现语言: RPython
- Runtime: RPython
- Parser: EBNF parser generator
- js.js
- Support: 未知
- 实现语言: Javascript
- Runtime: repo 文件内容太多,不敢看。
- Parser: Ditto.
- IronJS
- Support: ES3
- 实现语言: F#
- Runtime: .NET through DLR,.
- Parser: Hand-written
- jispy
- Support: 未知
- 实现语言: Python
- Runtime: AST interpreter
- Parser: 未知
- JE: 纯 Perl Javascript 引擎
- Dave Herman 为 PLT Scheme 编写的 Javascript
玩具版
如果您以前从未实现过一种语言,那么下面的内容会给你许多的灵感。
- js-to-c: 用 C 编写的 Javascript 编译到 C 的编译器
- mjs: AST 解释器,不仅适用于 ES5 甚至 ES3,还适用于 ES1
- gojis: Go 实现的 AST 解释器
- tojs: Rust 实现的字节码 VM
- v2: Go 实现的字节码 VM
- SparrowJS: C++ 实现的 AST 解释器
- jsc: 我自己的将 Javascript 编译为 C++/libV8 的实验代码
新帖子来了! 枚举和分析 40 多个非 V8 Javascript 实现; 当然还有指向源代码和解析器和运行时/后端决策的链接。
我希望你和我一样喜欢学习 Javascript 引擎。https://t.co/dEX06WU38f pic.twitter.com/AoYScphG6m
— Phil Eaton (@phil_eaton) September 21, 2021