MoonBit 为 JS 后端添加支持,速度比原生 JS 最快可达 25 倍

原文信息: 查看原文查看原文

MoonBit adds JS backend, up to 25x faster than native JS

- MoonBit

封面

MoonBit 在 2023 年 8 月正式推出 时,我们的关键任务是释放 WebAssembly 在云和边缘计算中的潜力,作为一种以 Wasm 为先的编程语言和工具链。通过整合 Rust 和 Go 的精髓,MoonBit 不仅在设计上实现了简单易用,而且还配备了强大的容错类型系统。同时,MoonBit 正在开发自动代码生成和调整,利用人工智能,进一步结合了 IDE 智能和大型模型智能。 凭借我们团队的努力,MoonBit 在仅仅一年半的时间里就取得了对其 WebAssembly 本地支持的显著进展。我们显著提高了构建和运行的速度,并且生成了更紧凑的 Wasm 输出。在这个过程中,我们意识到 MoonBit 的潜力超出了 Wasm,支持多个后端可以进一步培养一个蓬勃发展的 MoonBit 生态系统。 因此,我们很高兴地宣布 MoonBit 现在支持 JavaScript 后端!我们所取得的不仅仅是简单的支持,而是一个前所未有的性能提升,类似于我们在 Wasm 中所取得的 成果MoonBit 在 JavaScript 后端上展示了比 Json5 高出近八倍的性能优势。这标志着 MoonBit 朝着实现软件开发全面覆盖的目标迈出了进化性的一步。

为什么要支持 JavaScript:最大的开发社区

在 JavaScript 出现近 30 年后,它仍然没有磨损的迹象。GitHub 的 Octoverse 状态列出了 JavaScript 作为 2022 年使用最多的编程语言,确认了它作为就业市场和软件开发领域最流行编程语言之一的不可动摇的地位。

Octoverse 排名.PNG 数据来源:https://octoverse.github.com/2022/top-programming-languages

凭借其广泛的受欢迎程度,JavaScript 拥有一个广泛和多样化的生态系统;难怪大多数编程语言都认为支持 JavaScript 后端是一个重要的步骤。然而,大多数 JavaScript 替代品无法匹配 JavaScript 的原生性能,一些编译代码在基准测试中比原生 JavaScript 大多达 350 倍。如果一个转译的编程语言仅在可维护性上略有改进,却以牺牲大小和性能为重大代价,那么在大多数情况下,原生 JavaScript 仍然是开发者的首选语言。

alt_JS.PNG 数据来源:https://unsafeperform.io/blog/2022-07-02-asmallbenchmarkforfunctionallanguagestargetingwebbrowsers/

MoonBit 旨在通过支持编译到 JavaScript 后端来解决代码大小和性能问题。我们的基准测试结果表明,MoonBit JS 在性能上显著优于原生 JavaScript。

基准测试:代码执行速度超过 JavaScript 25 倍

根据 JavaScript 提议的迭代器助手,JavaScript 可以本地支持迭代操作,无需中间数组。MoonBit 也同步引入了相同的特性,进一步增强了其在现代 JavaScript 开发环境中的适用性和效率。

这里有一个常见案例:在处理大量学生成绩数据时,传统的 JavaScript 代码通常需要多个步骤来处理数据,例如过滤出成绩为 A 的学生。这种方法直观,但在性能上并不高效,因为它需要生成多个中间数组。例如,首先遍历 1000 名学生的成绩单,将成绩转换为等级,然后按 A、B、C、D、E 排序,并过滤出成绩为 A 的学生,最后计算 A 等级学生的数量。在这种情况下,MoonBit 的 JavaScript 实现与 JavaScript 中的原生 Iterator Helpers 支持进行比较后,MoonBit 编写的 JavaScript 代码显示其执行速度比使用原生 Iterator Helpers 快 25 倍。

JS-Moonbit.png

MoonBit 引入了类似于 Rust 的 Iter 类型的零成本抽象,这是一个特别为常见数据处理情况优化的库。这种类型的设计充分利用了 MoonBit 的高级抽象能力,同时确保没有额外的运行时开销。通过使用 Iter,可以将多个处理步骤合并为一个连贯的工作流程,显著减少中间数组的生成,从而提高性能。MoonBit 的实现使开发人员能够编写逻辑清晰且高效的代码,而不必担心性能开销。

零成本的 Iter 类型在处理大量数据和执行复杂数据转换时特别有效,优化了数据处理过程。有了 Iter 类型,开发人员可以更方便地构建高效且可维护的系统,充分利用 MoonBit 的性能优势。

Iter_comp.png 基准测试来源:https://github.com/moonbit-community/benchmark-202404.git

  • 代码生成速度: 我们比较了 MoonBit 生成的代码与 JavaScript 的执行速度,并发现它超过 25 倍 更快。这种方法不仅简化了代码,还提高了处理效率,允许开发人员更多地关注代码逻辑而不是性能。

  • 每秒操作数 (Ops/Sec): MoonBit 的性能是原生 JavaScript 的 25 倍,这意味着 MoonBit 每秒可以执行的操作比原生 JavaScript 多得多。

以下是使用 MoonBit 的 Iter 类型生成的 JavaScript 代码示例及其编译结果:

使用 MoonBit 的 Iter 类型生成的 JavaScript 代码

JS Iter 示例.png

MoonBit JS 与 Json5:快了将近 8 倍

上述案例可能太过狭隘。这里有一个现实情况:最新的性能测试结果显示,MoonBit 的核心标准库在 npm 上的顶级 0.1% Json5 库的性能上超过了。我们发现 MoonBit 编译的 JavaScript 几乎比 Json5 库快 8 倍。这种在任务执行效率上的显著性能提升意味着 MoonBit 可以在相同的时间内执行更多的解析任务,极大地提高了数据处理效率。

json5_comp.png 基准测试来源:https://github.com/moonbit-community/benchmark-202404.git

为什么 MoonBit 比 Json5 运行更快?

MoonBit 性能优势的关键在于通过直接将字符串转换为整数进行处理来优化数据处理。由于 JavaScript 本身没有字符类型,JavaScript 中的字符作为字符串存在,这意味着任何字符操作实际上都是在字符串级别上执行的,自然比直接操作整数要慢。此外,MoonBit 利用编译技术来优化代码处理过程。例如,在编译期间,字符常量被转换为它们的 Unicode 代码点值。这允许这些预编译的整数值在运行时直接使用,而不是在运行时动态处理字符。类似地,对于 switch 语句,整数 switch 操作可以被编译成更快的指令,而字符串 switch 操作则和一系列 if 语句一样高效,这要慢得多。MoonBit 还引入了几个与 JavaScript 无关的通用技术,如常量折叠、尾递归转换为循环、解包 Option[Char] 和迭代器融合,从而提高了整体编译和执行效率。

除了这些实施的技术外,MoonBit 团队还在不断探索新的方法来进一步提高性能。为了确保性能稳步提升并防止性能退化,MoonBit 建立了一套监控机制,严格评估新变更的性能。

我们相信 MoonBit 不仅在运行时性能出色,而且在编译性能上也表现出色,实现了即时编译到 JavaScript,无需等待响应时间。MoonBit JavaScript 借鉴了我们在 MoonBit IDE 和工具链中的以往架构经验,因为我们首先考虑了 IDE、构建系统和语言设计协作,以实现高度并行化和增量类型检查及推断。

开箱即用的工具链支持

大多数编程语言在经过长时间开发后才能支持 sourcemap 调试功能。MoonBit 不仅支持 JavaScript 后端,还配备了开箱即用的工具链支持,包括调试器和本地测试代码镜头支持。

全面的 sourcemap 支持和用户友好的调试器

去年,MoonBit 引入了调试器,这通常只在更成熟的语言中才有的功能。MoonBit 从第一天起就为 JS 后端提供了 sourcemap 支持。目前,这个特性支持 sourcemap 映射、基于源代码设置断点,以及浏览器调试的 sourcemap 输出。MoonBit 的 sourcemap 和调试支持增强了开发人员的调试体验,确保生成的 JavaScript 代码与源代码紧密对应,变量和字段名称保持一致,便于使用浏览器 DevTools 进行源代码检查和调试。

debugger.gif 来源:https://github.com/moonbit-community/moonbit-js-debug-demo.git

本地测试代码镜头支持

MoonBit IDE 现在支持本地环境的测试代码镜头和 expect 测试 的自动更新。用户不再需要自己编写终端命令,只需点击“运行测试 | 更新测试”按钮,即可实现毫秒级编译,几乎无需等待响应时间。

codelens.gif

今天就试试

准备亲身体验 MoonBit 在 JavaScript 中的卓越性能了吗?请尝试 这个链接 提供的示例。

MoonBit 前景

MoonBit 正在通过支持 WebAssembly 和 JavaScript 后端来扩展其生态系统。未来,MoonBit 计划扩展到更多的后端平台,如 Native 和 JVM,并开发自己的运行时和云部署环境,以进一步加强工具链支持。MoonBit 不仅仅是一种编程语言;它提供了一个全面的开发工具链,包括 MoonBit IDE、编译器、构建系统包管理器,为开发人员提供一个全方位的软件开发平台。

MoonBit 标准库自 3 月以来已开源,我们已经合并了来自我们热情贡献者的 200 多个代码库。接下来的计划是逐步开源 MoonBit 构建系统和编译器。到 2024 年第三季度,我们期望 MoonBit 达到 beta 状态。

其他资源:

分享于 2024-05-05

访问量 139

预览图片