编译器:swc 究竟比 babel 快在哪里?

前言

swc 与 babel 都是 JavaScript 编译器,它们的主要功能是将 ES2015+ 以及 TypeScript, Flow, JSX 等语法转换为浏览器或环境中的向后兼容的 JavaScript 代码。

哪里快了?

1. 开发语言的优势

swc 是用 Rust 语言开发的,而 babel 是用 JavaScript 语言开发的。这意味着 swc 可以利用 Rust 的性能优势,如无 GC(垃圾回收机制)、系统级语言、多核 CPU 支持等,而 babel 则受限于 JavaScript 的性能问题,如 GC、单线程等。

2. AST 树透传

swc 在编译代码时并不需要将 AST 树透传下去,而是直接在内存中进行转换。这样可以避免多次遍历 AST 树,提高编译效率。而 babel 则需要将 AST 树传递给每一个插件,这样会增加编译时间和内存消耗

3. 编译后的代码更快

swc 可以将 JavaScript 代码编译为 WebAssembly,这样可以提高代码的执行速度。而 babel 则只能编译为 JavaScript 代码,无法利用 WebAssembly 的优势。

总结

  • swc 相比于 babel 的优势主要是编译速度和执行速度方面,根据官方测试,swc 有至少 10 倍以上的性能优势。但是 babel 的优势主要是插件系统和生态方面,babel 有更多的插件和框架支持,可以处理更复杂的 JavaScript 项目。
  • 目前,swc 已经被 Next.js 等前端框架采用,未来有望在前端工程化领域发挥更大的作用。而 babel 仍然是目前最流行的 JavaScript 编译器,被 Vue, React, Angular 等框架广泛使用。

/-------------------------------------------------- 扩展知识 ------------------------------------------------------/

Rust 无 GC 的原因?

它使用了一种叫做所有权的机制来管理内存

  • 所有权的基本思想:每个值都有一个唯一的所有者,当所有者离开作用域时,值就会被自动释放。这样就避免了内存泄漏和悬垂指针的问题,也不需要运行时的垃圾回收器来跟踪和清理内存。

Rust 还引入了借用和生命周期的概念,来控制对值的访问和修改。借用就是临时使用一个值的引用,而不是拥有它。生命周期就是一个值或者一个引用在程序中存在的时间段。Rust 编译器会检查借用和生命周期是否符合一些规则,来保证内存安全和数据一致性。

Rust 的这种内存管理方式,既可以保证程序的正确性,又可以提高程序的性能,因为它不需要额外的内存开销和垃圾回收的暂停。这也是 Rust 被称为“零成本抽象”的原因之一。

系统级语言

系统级语言是指那些可以直接操作硬件和底层系统的编程语言

它们通常具有以下特点:

  • 语法简洁,指令集小,编译速度快,运行效率高
  • 支持指针和内存管理,可以访问和修改内存地址和寄存器
  • 支持汇编语言的嵌入和调用,可以实现与硬件的交互
  • 支持多种数据类型和结构,可以表示和处理复杂的数据
  • 支持静态编译和链接,可以生成可执行的二进制文件,不需要运行时环境

系统级语言的代表有 C, C++, Rust, Go 等,它们被广泛用于开发操作系统,驱动程序,嵌入式系统,游戏引擎等领域。系统级语言的优势是性能高,控制力强,可移植性好,但是也有一些缺点,如语法复杂,调试困难,内存安全难以保证等。

WebAssembly

WebAssembly 是一种开放的网络标准,由 W3C WebAssembly Community Group 开发,并得到了主要浏览器厂商的支持。目前,WebAssembly 已经被一些前端框架和工具采用,如 Next.js, Astro, SvelteKit, Blazor, Emscripten 等。

  • 一种低级的类汇编语言 可以在现代网络浏览器中运行,具有紧凑的二进制格式,可以接近原生的性能运行,并为诸如 C, C++ 和 Rust 等语言提供一个编译目标,以便它们可以在 Web 上运行。它也被设计为可以与 JavaScript 共存,允许两者一起工作。

  • 快速、高效、可移植和安全 它可以解决一些 JavaScript 在性能方面的问题,特别是对于 3D 游戏、虚拟现实、增强现实、计算机视觉、图像/视频编辑等领域的应用。WebAssembly 的模块可以被导入到一个网络应用中,并且暴露出供 JavaScript 使用的函数,JavaScript 也可以把函数导入到 WebAssembly 模块中,实现双向的互操作。

猜你喜欢

转载自blog.csdn.net/olderandyanger/article/details/134879973