热门标签 | 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


推荐阅读
  • 本文介绍了闭包的定义和运转机制,重点解释了闭包如何能够接触外部函数的作用域中的变量。通过词法作用域的查找规则,闭包可以访问外部函数的作用域。同时还提到了闭包的作用和影响。 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • 原文地址:https:www.cnblogs.combaoyipSpringBoot_YML.html1.在springboot中,有两种配置文件,一种 ... [详细]
  • 使用在线工具jsonschema2pojo根据json生成java对象
    本文介绍了使用在线工具jsonschema2pojo根据json生成java对象的方法。通过该工具,用户只需将json字符串复制到输入框中,即可自动将其转换成java对象。该工具还能解析列表式的json数据,并将嵌套在内层的对象也解析出来。本文以请求github的api为例,展示了使用该工具的步骤和效果。 ... [详细]
  • 本文介绍了C#中生成随机数的三种方法,并分析了其中存在的问题。首先介绍了使用Random类生成随机数的默认方法,但在高并发情况下可能会出现重复的情况。接着通过循环生成了一系列随机数,进一步突显了这个问题。文章指出,随机数生成在任何编程语言中都是必备的功能,但Random类生成的随机数并不可靠。最后,提出了需要寻找其他可靠的随机数生成方法的建议。 ... [详细]
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • Mac OS 升级到11.2.2 Eclipse打不开了,报错Failed to create the Java Virtual Machine
    本文介绍了在Mac OS升级到11.2.2版本后,使用Eclipse打开时出现报错Failed to create the Java Virtual Machine的问题,并提供了解决方法。 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • Google Play推出全新的应用内评价API,帮助开发者获取更多优质用户反馈。用户每天在Google Play上发表数百万条评论,这有助于开发者了解用户喜好和改进需求。开发者可以选择在适当的时间请求用户撰写评论,以获得全面而有用的反馈。全新应用内评价功能让用户无需返回应用详情页面即可发表评论,提升用户体验。 ... [详细]
  • 本文详细介绍了在ASP.NET中获取插入记录的ID的几种方法,包括使用SCOPE_IDENTITY()和IDENT_CURRENT()函数,以及通过ExecuteReader方法执行SQL语句获取ID的步骤。同时,还提供了使用这些方法的示例代码和注意事项。对于需要获取表中最后一个插入操作所产生的ID或马上使用刚插入的新记录ID的开发者来说,本文提供了一些有用的技巧和建议。 ... [详细]
  • 本文介绍了计算机网络的定义和通信流程,包括客户端编译文件、二进制转换、三层路由设备等。同时,还介绍了计算机网络中常用的关键词,如MAC地址和IP地址。 ... [详细]
  • Oracle10g备份导入的方法及注意事项
    本文介绍了使用Oracle10g进行备份导入的方法及相关注意事项,同时还介绍了2019年独角兽企业重金招聘Python工程师的标准。内容包括导出exp命令、删用户、创建数据库、授权等操作,以及导入imp命令的使用。详细介绍了导入时的参数设置,如full、ignore、buffer、commit、feedback等。转载来源于https://my.oschina.net/u/1767754/blog/377593。 ... [详细]
  • Oracle优化新常态的五大禁止及其性能隐患
    本文介绍了Oracle优化新常态中的五大禁止措施,包括禁止外键、禁止视图、禁止触发器、禁止存储过程和禁止JOB,并分析了这些禁止措施可能带来的性能隐患。文章还讨论了这些禁止措施在C/S架构和B/S架构中的不同应用情况,并提出了解决方案。 ... [详细]
  • 在Oracle11g以前版本中的的DataGuard物理备用数据库,可以以只读的方式打开数据库,但此时MediaRecovery利用日志进行数据同步的过 ... [详细]
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社区 版权所有