热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

枚举和分析40+非v8实现的JavaScript

枚举和分析40+非v8实现的JavaScript-原文链接:https:notes.eatonphil.comjavascript-implementations.htmlV

原文链接:https://notes.eatonphil.com/Javascript-implementations.html

V8,毫无疑问,是目前使用范围最广的 Javascript 引起。v8 使用在 Chrome(和Chrome的插件)、Microsoft EdgeNode.js 等等... Safari 浏览器的 JavascriptCore 以及火狐的 SpiderMonkey 也被认为是 Javascript 引擎中最有竞争力的。

但是其他 Javascript 引擎呢?如果我想要在 CGoRustJava(等等....)中嵌入Javascript 该怎么办 ? 又或者如果我想要在单片机运行 Javascript ?或者将其用作语言研究的基础? ? 目前,已经存在许许多多 Javascript 引擎帮助我们实现上述功能。

这篇文章就会讲述一些 Javascript 引擎以及他们背后的实现选择。我并不会在这篇文章提及 v8JavascriptCoreSpiderMonkey 因为他们实在是太过复杂了,暗藏了许多复杂的技术实现。而且,你其实已经对他们有所了解。

我会弄错一些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


推荐阅读
author-avatar
北漂123
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有